1
0
Fork 0
firefox/testing/web-platform/tests/fetch/fetch-later/send-on-deactivate-with-background-sync.tentative.https.window.js
Daniel Baumann 5e9a113729
Adding upstream version 140.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-25 09:37:52 +02:00

128 lines
5 KiB
JavaScript

// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/common/dispatcher/dispatcher.js
// META: script=/common/get-host-info.sub.js
// META: script=/common/utils.js
// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
// META: script=/html/browsers/browsing-the-web/back-forward-cache/resources/rc-helper.js
// META: script=/fetch/fetch-later/resources/fetch-later-helper.js
// META: timeout=long
'use strict';
async function setBackgroundSyncEnabled(enabled) {
const status = enabled ? 'granted' : 'denied';
await test_driver.set_permission({name: 'background-sync'}, status);
}
parallelPromiseTest(async t => {
// Enables BackgroundSync permission such that deferred request won't be
// immediately sent out on entering BFCache.
await setBackgroundSyncEnabled(true);
const uuid = token();
const url = generateSetBeaconURL(uuid);
// Sets no option to test the default behavior when a document enters BFCache.
const helper = new RemoteContextHelper();
// Opens a window with noopener so that BFCache will work.
const rc1 = await helper.addWindow(
/*config=*/ null, /*options=*/ {features: 'noopener'});
// Creates a fetchLater request with default config in remote, which should
// only be sent on page discarded (not on entering BFCache).
await rc1.executeScript(url => {
fetchLater(url);
// Add a pageshow listener to stash the BFCache event.
window.addEventListener('pageshow', e => {
window.pageshowEvent = e;
});
}, [url]);
// Navigates away to let page enter BFCache.
const rc2 = await rc1.navigateToNew();
// Navigates back.
await rc2.historyBack();
// Verifies the page was BFCached.
assert_true(await rc1.executeScript(() => {
return window.pageshowEvent.persisted;
}));
// By default, pending requests are all flushed on BFCache no matter
// BackgroundSync is on or not. See http://b/310541607#comment28.
await expectBeacon(uuid, {count: 1});
}, `fetchLater() does send on page entering BFCache even if BackgroundSync is on.`);
parallelPromiseTest(async t => {
// Enables BackgroundSync permission such that deferred request won't be
// immediately sent out on entering BFCache.
await setBackgroundSyncEnabled(true);
const uuid = token();
const url = generateSetBeaconURL(uuid);
// activateAfter = 0s means the request should be sent out right on
// document becoming deactivated (BFCached or frozen) after navigating away.
const options = {activateAfter: 0};
const helper = new RemoteContextHelper();
// Opens a window with noopener so that BFCache will work.
const rc1 = await helper.addWindow(
/*config=*/ null, /*options=*/ {features: 'noopener'});
// Creates a fetchLater request in remote which should only be sent on
// navigating away.
await rc1.executeScript((url, options) => {
fetchLater(url, options);
// Add a pageshow listener to stash the BFCache event.
window.addEventListener('pageshow', e => {
window.pageshowEvent = e;
});
}, [url, options]);
// Navigates away to trigger request sending.
const rc2 = await rc1.navigateToNew();
// Navigates back.
await rc2.historyBack();
// Verifies the page was BFCached.
assert_true(await rc1.executeScript(() => {
return window.pageshowEvent.persisted;
}));
await expectBeacon(uuid, {count: 1});
}, `fetchLater() with activateAfter=0 sends on page entering BFCache if BackgroundSync is on.`);
parallelPromiseTest(async t => {
// Enables BackgroundSync permission such that deferred request won't be
// immediately sent out on entering BFCache.
await setBackgroundSyncEnabled(true);
const uuid = token();
const url = generateSetBeaconURL(uuid);
// activateAfter = 1m means the request should NOT be sent out on
// document becoming deactivated (BFCached or frozen) until after 1 minute.
const options = {activateAfter: 60000};
const helper = new RemoteContextHelper();
// Opens a window with noopener so that BFCache will work.
const rc1 = await helper.addWindow(
/*config=*/ null, /*options=*/ {features: 'noopener'});
// Creates a fetchLater request in remote which should only be sent on
// navigating away.
await rc1.executeScript((url, options) => {
fetchLater(url, options);
// Adds a pageshow listener to stash the BFCache event.
window.addEventListener('pageshow', e => {
window.pageshowEvent = e;
});
}, [url, options]);
// Navigates away to trigger request sending.
const rc2 = await rc1.navigateToNew();
// Navigates back.
await rc2.historyBack();
// Verifies the page was BFCached.
assert_true(await rc1.executeScript(() => {
return window.pageshowEvent.persisted;
}));
// By default, pending requests are all flushed on BFCache no matter
// BackgroundSync is on or not. See http://b/310541607#comment28.
await expectBeacon(uuid, {count: 1});
}, `fetchLater() with activateAfter=1m does send on page entering BFCache even if BackgroundSync is on.`);