| // 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.`); |