File: session-storage-utils.js

package info (click to toggle)
thunderbird 1%3A128.14.0esr-1~deb13u1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 4,334,960 kB
  • sloc: cpp: 7,391,917; javascript: 5,617,271; ansic: 3,833,216; python: 1,230,742; xml: 619,690; asm: 456,020; java: 179,892; sh: 118,796; makefile: 21,906; perl: 14,825; objc: 12,399; yacc: 4,583; pascal: 2,973; lex: 1,720; ruby: 1,190; exp: 762; sql: 674; awk: 580; php: 436; lisp: 430; sed: 70; csh: 10
file content (72 lines) | stat: -rw-r--r-- 2,572 bytes parent folder | download | duplicates (14)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
function getSessionStorageKeys() {
  let keys = [];
  let txt = '';
  for (let i = 0; i < sessionStorage.length; ++i) {
    keys.push(sessionStorage.key(i));
  }
  keys.sort();
  keys.forEach((key) => {
    if (txt.length) {
      txt += ', ';
    }
    txt += key;
  });
  return txt;
}

function getNextMessage(channel) {
  return new Promise(resolve => {
    channel.addEventListener('message', e => {
      resolve(e.data);
    }, {once: true});
  });
}

// session_storage_test() is a utility function for running session storage
// related tests that open a initiator page using window.open().
function session_storage_test(testPath, uid) {
  promise_test(async t => {
    const testChannel = new PrerenderChannel('test-channel', uid);
    t.add_cleanup(() => {
      testChannel.close();
    });
    const gotMessage = getNextMessage(testChannel);
    const url = 'resources/' + testPath + '?uid=' + uid;
    window.open(url, '_blank', 'noopener');
    assert_equals(await gotMessage, 'Done');
  }, testPath);
}

// RunSessionStorageTest() is a utility function for running session storage
// related tests that requires coordinated code execution on both the initiator
// page and the prerendering page. The passed |func| function will be called
// with the following arguments:
//   - isPrerendering: Whether the |func| is called in the prerendering page.
//   - url: The URL of the prerendering page. |func| should call
//     startPrerendering(url) when |isPrerendering| is false to start the
//     prerendering.
//   - channel: A PrerenderChannel which can be used to coordinate the code
//     execution on the initiator page and the prerendering page.
//   - done: A function that should be called when the test completes
//     successfully.
async function RunSessionStorageTest(func, uid) {
  const url = new URL(document.URL);
  url.searchParams.set('prerendering', '');
  const params = new URLSearchParams(location.search);
  // The main test page loads the initiator page, then the initiator page will
  // prerender itself with the `prerendering` parameter.
  const isPrerendering = params.has('prerendering');
  const prerenderChannel = new PrerenderChannel('prerender-channel', uid);
  const testChannel = new PrerenderChannel('test-channel', uid);
  window.addEventListener('pagehide', () => {
    prerenderChannel.close();
    testChannel.close();
  });
  try {
    await func(isPrerendering, url.toString(), prerenderChannel, () => {
      testChannel.postMessage('Done');
    })
  } catch (e) {
    testChannel.postMessage(e.toString());
  }
}