tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>