summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal')
-rw-r--r--testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-bfcache-restore.html70
-rw-r--r--testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation.html18
-rw-r--r--testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-prerender-activation.html40
-rw-r--r--testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/order-in-prerender-activation-popup.html74
4 files changed, 202 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-bfcache-restore.html b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-bfcache-restore.html
new file mode 100644
index 0000000000..f453c80a2a
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-bfcache-restore.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<title>pagereveal event fires and in correct order on restoration from BFCache</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/browsing-the-web.html#updating-the-document">
+<link rel="author" href="mailto:bokan@chromium.org">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js"></script>
+<script>
+// runBfcacheTest opens a popup to pageA which navigates to pageB and then
+// back, ensuring pageA is stored in the BFCache.
+runBfcacheTest({
+ funcBeforeNavigation: async () => {
+ // This function executes in pageA
+
+ // Wait for an animation frame to ensure the the initial-load
+ // `pagereveal` has already been fired so it doesn't get recorded
+ // below.
+ const raf = new Promise(resolve => requestAnimationFrame(resolve));
+ await raf;
+
+ window.event_log = [];
+ let restored = false;
+
+ function recordRafs() {
+ requestAnimationFrame( () => {
+ // Avoid recording animation frames until the page is restored from
+ // BFCache since it's currently uncached. This test is interested only
+ // in the behavior during restoration.
+ if (restored)
+ window.event_log.push('rAF');
+
+ recordRafs();
+ });
+ }
+
+ recordRafs();
+
+ addEventListener('pageshow', (e) => {
+ window.event_log.push('pageshow' + (e.persisted ? '.persisted' : ''));
+ if (e.persisted)
+ restored = true;
+ });
+
+ addEventListener('pagereveal', () => {
+ window.event_log.push('pagereveal');
+ });
+ },
+ funcAfterAssertion: async (pageA, pageB, t) => {
+ let event_log = await pageA.execute_script(async () => {
+ // Ensure at least one animation frame is produced to ensure
+ // pagereveal must have fired.
+ await new Promise(requestAnimationFrame);
+ return window.event_log;
+ });
+
+ // Expect that the events seen are:
+ // pageshow.persisted, pagereveal, rAF, rAF, rAF, ...
+ assert_equals(event_log.slice(0, 3).toString(),
+ 'pageshow.persisted,pagereveal,rAF');
+ for (let i = 3; i < event_log.length; ++i) {
+ assert_equals(event_log[i], 'rAF',
+ 'All events following pagereveal should be animation frames');
+ }
+ },
+ targetOrigin: originSameOrigin,
+});
+</script>
diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation.html b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation.html
new file mode 100644
index 0000000000..d2c44511d3
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-new-document-navigation.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<title>pagereveal event fires and in correct order on new-document navigation</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering">
+<link rel="author" href="mailto:bokan@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+const event_log = [];
+
+addEventListener('pageshow', () => event_log.push('pageshow'));
+addEventListener('pagereveal', () => event_log.push('pagereveal'));
+requestAnimationFrame(() => event_log.push('rAF'));
+
+promise_test(async () => {
+ await new Promise(resolve => requestAnimationFrame(resolve));
+ assert_equals(event_log.toString(),'pageshow,pagereveal,rAF');
+});
+</script>
diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-prerender-activation.html b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-prerender-activation.html
new file mode 100644
index 0000000000..b281b2b088
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/order-in-prerender-activation.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<title>pagereveal event fires and in correct order on prerender activation</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering">
+<link rel="author" href="mailto:bokan@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/speculation-rules/resources/utils.js"></script>
+<script src="/speculation-rules/prerender/resources/utils.js"></script>
+<script>
+setup(() => assertSpeculationRulesIsSupported());
+
+const uid = token();
+const initiator_url = `resources/order-in-prerender-activation-popup.html?uid=${uid}`;
+
+// This test opens a popup to an initiator page. That page then prerenders a
+// "prerendering" version of itself (by adding a `prerendering` query param)
+// and navigates itself to activate the prerender. The results are recorded and
+// sent back to this test harness.
+promise_test(async () => {
+ const channel = new PrerenderChannel('result', uid);
+ const test_done = new Promise(resolve => {
+ channel.addEventListener('message', e => resolve(e.data), { once: true });
+ });
+
+ window.open(initiator_url, '_blank', 'noopener');
+
+ const result = await test_done;
+
+ if (result.hasOwnProperty('fail')) {
+ assert_unreached(result.fail);
+ }
+
+ // The test records relevant event occurrences up to the second animation
+ // frame. Ensure their order and apparance is as expected.
+ const events_in_order = result.events.join(',');
+ assert_equals(events_in_order,
+ 'pageshow,prerenderingchange,pagereveal,raf');
+});
+</script>
diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/order-in-prerender-activation-popup.html b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/order-in-prerender-activation-popup.html
new file mode 100644
index 0000000000..78989adc17
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal/resources/order-in-prerender-activation-popup.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<title>pagereveal event fires and in correct order on prerender activation (popup)</title>
+<link rel="author" href="mailto:bokan@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/speculation-rules/prerender/resources/utils.js"></script>
+<script>
+const params = new URLSearchParams(location.search);
+const uid = params.get('uid');
+const is_prerender_step = params.has('prerendering');
+
+const ready_channel = new PrerenderChannel('ready-to-activate', uid);
+
+function finish(result) {
+ const result_channel = new PrerenderChannel('result', uid);
+ result_channel.postMessage(result);
+ result_channel.close();
+ window.close();
+}
+
+// testharness.js assertions don't work inside this popup so this small helper
+// sends a failure signal back to the test page which will cause test failure.
+function assert(cond, desc) {
+ if (!cond) {
+ finish({fail: desc});
+ }
+}
+
+// The first load of this page should be without 'prerendering' and is used
+// to setup the prerender and then activate it when it's ready.
+if (!is_prerender_step) {
+ assert(!document.prerendering, 'initiator page must not be prerendered');
+
+ const ready_to_activate = new Promise(resolve => {
+ ready_channel.addEventListener('message', resolve, {once: true});
+ });
+
+ const prerendering_url = location.href + '&prerendering';
+ startPrerendering(prerendering_url);
+
+ ready_to_activate.then(() => {
+ location.replace(prerendering_url);
+ });
+} else {
+ assert(document.prerendering, 'prerendering step must be initially prerendered');
+
+ const result = {
+ events: []
+ };
+
+ document.addEventListener('prerenderingchange', () => {
+ result.events.push('prerenderingchange');
+ });
+
+ addEventListener('pageshow', () => {
+ result.events.push('pageshow');
+ });
+
+ // A second rAF will end the test.
+ requestAnimationFrame(() => {
+ result.events.push('raf');
+ requestAnimationFrame(() => finish(result));
+ });
+
+ addEventListener('pagereveal', () => {
+ result.events.push('pagereveal');
+ });
+
+ addEventListener('load', () => {
+ ready_channel.postMessage('unused-readyToActivateMessage');
+ ready_channel.close();
+ });
+}
+</script>