timers.html (3082B)
1 <!doctype html> 2 <meta name="timeout" content="long"> 3 <link rel="help" href="https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers:fully-active"> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src="/common/utils.js"></script> 7 <script src="/common/dispatcher/dispatcher.js"></script> 8 <script src="resources/helper.sub.js"></script> 9 <script> 10 // Timers should be paused when the Document is not fully active. 11 // This test is checking this by measuring the actual elapsed time for a timer 12 // started before a page is stored into BFCache, staying for a while in BFCache, 13 // and fired after the page is restored from BFCache. 14 15 const delayMain = 18000; 16 const delayBeforeForwardNavigation = 6000; 17 const delayBeforeBackNavigation = 5000; 18 // `delayBeforeForwardNavigation` and `delayBeforeBackNavigation` are set 19 // sufficiently large in order to distinguish the expected case from other 20 // scenarios listed in `funcAfterAssertion()`, and to allow some delays outside 21 // timers (e.g. due to communication between Windows). The additional delays 22 // can be large (e.g. ~4 seconds), so the delays above should be sufficiently 23 // large. 24 25 const startTime = performance.now(); 26 27 runBfcacheTest({ 28 funcBeforeNavigation: async (delayMain, delayBeforeForwardNavigation) => { 29 // Set `promiseMainTimer` that is resolved after a timeout of `delayMain` 30 // ms. 31 window.promiseMainTimer = new Promise(resolve => { 32 setTimeout(resolve, delayMain); 33 }); 34 // Then navigate to another page after `delayBeforeForwardNavigation` ms. 35 await new Promise(resolve => 36 setTimeout(resolve, delayBeforeForwardNavigation)); 37 }, 38 argsBeforeNavigation: [delayMain, delayBeforeForwardNavigation], 39 funcBeforeBackNavigation: async (delayBeforeBackNavigation) => { 40 // Back navigate after `delayBeforeBackNavigation` ms. 41 await new Promise(resolve => 42 setTimeout(resolve, delayBeforeBackNavigation)); 43 }, 44 argsBeforeBackNavigation: [delayBeforeBackNavigation], 45 funcAfterAssertion: async (pageA) => { 46 // Wait for `promiseMainTimer` resolution and check its timing. 47 await pageA.execute_script(() => window.promiseMainTimer); 48 const actualDelay = performance.now() - startTime; 49 50 if (actualDelay >= delayMain + delayBeforeBackNavigation + 51 delayBeforeForwardNavigation) { 52 assert_unreached( 53 "The timer is fired too late. " + 54 "Maybe the timer is reset when restored from BFCache and " + 55 "waits from the beginning again"); 56 } else if (actualDelay >= delayMain + delayBeforeBackNavigation) { 57 // Expected: The timer is paused when the page is in BFCache. 58 } else if (actualDelay >= delayMain) { 59 assert_unreached( 60 "The timer is fired too early. " + 61 "Maybe the time isn't paused when the page is in BFCache"); 62 } else { 63 assert_unreached( 64 "The timer is fired too early, even earlier than delayMain."); 65 } 66 } 67 }, 'Timers should be paused when the page is in BFCache'); 68 </script>