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>