diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/pagereveal')
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> |