File: preload-strict-dynamic.sub.html

package info (click to toggle)
thunderbird 1%3A140.5.0esr-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 4,609,180 kB
  • sloc: cpp: 7,672,739; javascript: 5,901,898; ansic: 3,898,899; python: 1,413,347; xml: 653,997; asm: 462,284; java: 180,927; sh: 113,491; makefile: 20,463; perl: 14,288; objc: 13,059; yacc: 4,583; pascal: 3,352; lex: 1,720; ruby: 1,222; exp: 762; sql: 715; awk: 580; php: 436; lisp: 430; sed: 70; csh: 10
file content (88 lines) | stat: -rw-r--r-- 3,031 bytes parent folder | download | duplicates (21)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<!DOCTYPE html>
<head>
<script src="/resources/testharness.js" nonce="123"></script>
<script src="/resources/testharnessreport.js" nonce="123"></script>
<script src="/common/utils.js" nonce="123"></script>
<script src="/preload/resources/preload_helper.js" nonce="123"></script>
<title>CSP strict-dynamic + preload</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'nonce-123' 'strict-dynamic'" />
</head>
<body>
<script nonce="123">
const PATTERN = /\?key=([a-zA-Z0-9\-]+)$/;

// We use async_test instead of promise_test in this file because these
// tests take long time to run and we want to run them in parallel.
async_test((t) => {
  Promise.resolve().then(async () => {
    let sawViolation = false;
    self.addEventListener('securitypolicyviolation', (e) => {
      const link = document.querySelector('#static-no-nonce');
      if (e.violatedDirective == 'script-src-elem' && e.blockedURI === link.href) {
        sawViolation = true;
      }
    });

    await new Promise((resolve) => step_timeout(resolve, 3000));

    const link = document.querySelector('#static-no-nonce');
    const key = link.href.match(PATTERN)[1]

    assert_true(sawViolation, 'sawViolation');
    assert_false(await hasArrivedAtServer(key), 'hasArrivedAtServer');
    t.done();
  }).catch(t.step_func((e) => {
    throw e;
  }));
}, 'static-no-nonce');

async_test((t) => {
  Promise.resolve().then(async () => {
    let sawViolation = false;
    self.addEventListener('securitypolicyviolation', (e) => {
      const link = document.querySelector('#static-nonce');
      if (e.violatedDirective == 'script-src-elem' && e.blockedURI === link.href) {
        sawViolation = true;
      }
    });

    // TODO: Use step_wait after
    // https://github.com/web-platform-tests/wpt/pull/34289 is merged.
    await new Promise((resolve) => step_timeout(resolve, 3000));

    const link = document.querySelector('#static-nonce');
    const key = link.href.match(PATTERN)[1]

    assert_false(sawViolation, 'sawViolation');
    assert_true(await hasArrivedAtServer(key), 'hasArrivedAtServer');
    t.done();
  }).catch(t.step_func((e) => {
    throw e;
  }));
}, 'static-nonce');

async_test((t) => {
  Promise.resolve().then(async () => {
    const link = document.createElement('link');
    link.rel = 'preload';
    const id = token();
    link.href = `/preload/resources/stash-put.py?key=${id}`;
    link.as = 'script';

    document.head.appendChild(link);
    await new Promise((resolve, reject) => {
      link.addEventListener('load', resolve, {once: true});
      link.addEventListener('error', resolve, {once: true});
    });
    assert_true(await hasArrivedAtServer(id), 'hasArrivedAtServer');
    t.done();
  }).catch(t.step_func((e) => {
    throw e;
  }));
}, 'dynamic');
</script>

<link id="static-no-nonce" href="/preload/resources/stash-put.py?key={{uuid()}}" rel=preload as=script>
<link id="static-nonce" href="/preload/resources/stash-put.py?key={{uuid()}}" rel=preload as=script nonce="123">
</body>
</html>