| // META: script=/common/dispatcher/dispatcher.js |
| // META: script=/common/utils.js |
| // META: script=resources/test-helpers.js |
| // META: script=resources/messaging-helpers.js |
| // META: script=/html/browsers/browsing-the-web/back-forward-cache/resources/rc-helper.js |
| // META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js |
| // META: timeout=long |
| |
| 'use strict'; |
| |
| |
| createBFCacheTest(async (t, testControls) => { |
| const {getRemoteFuncs, assertBFCacheEligibility} = testControls; |
| const [createAndReleaseSAH] = getRemoteFuncs('createAndReleaseSAH'); |
| |
| for (const mode of SAH_MODES) { |
| await createAndReleaseSAH(mode, 'hello.txt'); |
| await assertBFCacheEligibility(/*shouldRestoreFromBFCache=*/ true); |
| } |
| }, 'Creating an SAH should not make it ineligible for the BFCache.'); |
| |
| createBFCacheTest(async (t, testControls) => { |
| const origFile = 'hello.txt'; |
| const diffFile = 'world.txt'; |
| |
| const {getRemoteFuncs, forward, back} = testControls; |
| const [createSAH, releaseSAH, createAndReleaseSAH] = |
| getRemoteFuncs('createSAH', 'releaseSAH', 'createAndReleaseSAH'); |
| |
| async function testTakeLockOnForward( |
| mode, fileName, shouldRestoreFromBFCache) { |
| await forward(); |
| |
| assert_true(await createAndReleaseSAH(mode, fileName)); |
| |
| await back(shouldRestoreFromBFCache); |
| } |
| |
| for (const backMode of SAH_MODES) { |
| for (const forwMode of SAH_MODES) { |
| const contentiousLocks = sahModesAreContentious(backMode, forwMode); |
| |
| // Create a lock on the page that will be BFCached. |
| const lockId = await createSAH(backMode, origFile); |
| assert_true(lockId !== undefined); |
| |
| // Navigating to a new page and taking a lock on a different file should |
| // not evict the page from BFCache. |
| await testTakeLockOnForward( |
| forwMode, diffFile, /*shouldRestoreFromBFCache=*/ true); |
| |
| // Navigating to a new page and taking a lock on the same file should only |
| // evict if the locks are contentious. |
| await testTakeLockOnForward( |
| forwMode, origFile, /*shouldRestoreFromBFCache=*/ !contentiousLocks); |
| |
| // Release the lock when there isn't contention since it won't have been |
| // evicted. |
| if (!contentiousLocks) { |
| await releaseSAH(lockId); |
| } |
| } |
| } |
| }, `Creating a SAH on an active page evicts an inactive page on contention.`) |