tor-browser

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

session-storage-swap-after-activate.html (2778B)


      1 <!DOCTYPE html>
      2 <script src="/resources/testharness.js"></script>
      3 <script src="/resources/testharnessreport.js"></script>
      4 <script src="/speculation-rules/prerender/resources/utils.js"></script>
      5 <script src="session-storage-utils.js"></script>
      6 <script>
      7 const params = new URLSearchParams(location.search);
      8 const uid = params.get('uid');
      9 
     10 RunSessionStorageTest(async (isPrerendering, url, prerenderChannel, done) => {
     11  if (!isPrerendering) {
     12    sessionStorage.setItem('set by initiator page 1', '1');
     13    startPrerendering(url);
     14    // Wait for the message from the prerendering page.
     15    assert_equals(
     16        await getNextMessage(prerenderChannel),
     17        'From prerendering page 1')
     18 
     19    // Add an item to the session storage.
     20    sessionStorage.setItem('set by initiator page 2', '1');
     21 
     22    // Send the message to the prerendering page.
     23    prerenderChannel.postMessage('From initiator page');
     24 
     25    // Wait for the message from the prerendering page.
     26    assert_equals(
     27        await getNextMessage(prerenderChannel),
     28        'From prerendering page 2')
     29 
     30    // Register beforeunload event handler which adds a new item in the
     31    // session storage.
     32    window.addEventListener('beforeunload', () => {
     33      sessionStorage.setItem('set by initiator page 3', '1');
     34    });
     35 
     36    // Navigate to the prerenderered page.
     37    window.location = url;
     38  } else {
     39    const prerenderingchangePromise =
     40        new Promise(resolve => {
     41            document.addEventListener('prerenderingchange', () => {
     42              sessionStorage.setItem('set by activated page', 1);
     43              resolve();
     44            });
     45          });
     46 
     47    sessionStorage.setItem('set by prerendering page', '1');
     48 
     49    // Send the message to the initiator page.
     50    prerenderChannel.postMessage('From prerendering page 1');
     51 
     52    // Wait for the message from the initiator page.
     53    assert_equals(await getNextMessage(prerenderChannel),
     54        'From initiator page');
     55 
     56    assert_equals(
     57        getSessionStorageKeys(),
     58        'set by initiator page 1, set by prerendering page',
     59        'The session storage item added by the initiator page after ' +
     60        'starting prerendering must not be visible in the prerendering ' +
     61        'page.');
     62 
     63    // Send the message to the initiator page.
     64    prerenderChannel.postMessage('From prerendering page 2');
     65 
     66    // Wait until activated.
     67    await prerenderingchangePromise;
     68 
     69    assert_equals(
     70        getSessionStorageKeys(),
     71        'set by activated page, set by initiator page 1, ' +
     72        'set by initiator page 2, set by initiator page 3',
     73        'The all session storage items added by the initiator page and ' +
     74        'the item added by the activated page must be visible in the ' +
     75        'activated page.');
     76    done();
     77  }
     78 }, uid);
     79 </script>