Fire popstate for navigations intercepted by appHistory.transitionWhile()

Currently the logic for firing popstate lives in
FrameLoader::DidFinishSameDocumentNavigation, which is only fired for
fragment navigations (including back/forward ones). This CL moves it
to DocumentLoader::UpdateForSameDocumentNavigaiton (which is called for
all same-document navigations).

Now that FrameLoader::DidFinishSameDocumentNavigation only handles
scrolling behavior (scroll restore and fragment processing), rename it
to ProcessScrollForSameDocumentNavigation.

Change-Id: I103cdf7fb7407bc8c35f13133cd8dfec1aab5421
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3514480
Reviewed-by: Domenic Denicola <domenic@chromium.org>
Commit-Queue: Nate Chapin <japhet@chromium.org>
Cr-Commit-Position: refs/heads/main@{#979984}
diff --git a/app-history/ordering-and-transition/currentchange-before-popsate-transitionWhile.html b/app-history/ordering-and-transition/currentchange-before-popsate-transitionWhile.html
new file mode 100644
index 0000000..2a0155a
--- /dev/null
+++ b/app-history/ordering-and-transition/currentchange-before-popsate-transitionWhile.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+promise_test(async t => {
+  // Wait for after the load event so that the navigation doesn't get converted
+  // into a replace navigation.
+  await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0));
+  await appHistory.navigate("#foo").committed;
+  assert_equals(appHistory.entries().length, 2);
+
+  appHistory.onnavigate = e => e.transitionWhile(Promise.resolve());
+
+  let oncurrentchange_back_called = false;
+  let onpopstate_back_called = false;
+  window.onpopstate = t.step_func(e => {
+    onpopstate_back_called = true;
+    assert_true(oncurrentchange_back_called);
+  });
+  appHistory.oncurrentchange = t.step_func(e => {
+    oncurrentchange_back_called = true;
+    assert_false(onpopstate_back_called);
+  });
+  let back_result = appHistory.back();
+  assert_false(oncurrentchange_back_called);
+  assert_false(onpopstate_back_called);
+  await back_result.finished;
+  assert_true(oncurrentchange_back_called);
+  assert_true(onpopstate_back_called);
+
+  let oncurrentchange_forward_called = false;
+  let onpopstate_forward_called = false;
+  window.onpopstate = t.step_func(e => {
+    onpopstate_forward_called = true;
+    assert_true(oncurrentchange_forward_called);
+  });
+  appHistory.oncurrentchange = t.step_func(e => {
+    oncurrentchange_forward_called = true;
+    assert_false(onpopstate_forward_called);
+  });
+  let forward_result = appHistory.forward();
+  assert_false(oncurrentchange_forward_called);
+  assert_false(onpopstate_forward_called);
+  await forward_result.finished;
+  assert_true(oncurrentchange_back_called);
+  assert_true(onpopstate_forward_called);
+}, "AppHistoryCurrentChangeEvent fires for appHistory.back() and appHistory.forward()");
+</script>