summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/speculation-rules/prerender/resources/csp-script-src.js
blob: 6107819a36938dc13b7803b9b700e8ca27233e6d (plain)
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
const params = new URLSearchParams(location.search);

// Take a key used for storing a test result in the server.
const key = params.get('key');

// Take a target hint to decide a target context for prerendering.
const rule_extras = {'target_hint': getTargetHint()};

// Speculation rules injection is blocked in the csp-script-src 'self' test.
const block = location.pathname.endsWith('csp-script-src-self.html');

// The main test page (csp-script-src-*.html) in the parent directory) will load
// this page only with the "key" parameter. This page will then try prerendering
// itself with the "run-test" parameter. When "run-test" is in the URL we'll
// actually start the test process and record the results to send back to the
// main test page. We do this because the main test page cannot navigate itself
// but it also cannot open a popup to a prerendered browsing context so the
// prerender triggering and activation must both happen in this popup.
const run_test = params.has('run-test');
if (!run_test) {
  // Generate a new stash key so we can communicate with the prerendered page
  // about when to close the popup.
  const done_key = token();
  const url = new URL(document.URL);
  url.searchParams.append('run-test', '');
  url.searchParams.append('done-key', done_key);

  if (block) {
    // Observe `securitypolicyviolation` event that will be triggered by
    // startPrerendering().
    document.addEventListener('securitypolicyviolation', e => {
      if (e.effectiveDirective != 'script-src' &&
          e.effectiveDirective != 'script-src-elem') {
        const message = 'unexpected effective directive: ' + e.effectiveDirective;
        writeValueToServer(key, message).then(() => { window.close(); });
      } else {
        const message = 'blocked by ' + e.effectiveDirective;
        writeValueToServer(key, message).then(() => { window.close(); });
      }
    });
  }

  startPrerendering(url.toString(), rule_extras);

  // Wait until the prerendered page signals us it's ready to close.
  nextValueFromServer(done_key).then(() => {
    window.close();
  });
} else {
  if (block) {
    writeValueToServer(key, 'unexpected prerendering');
  } else {
    // Tell the harness the initial document.prerendering value.
    writeValueToServer(key, document.prerendering);

    // Tell the prerendering initiating page test being finished.
    const done_key = params.get('done-key');
    writeValueToServer(done_key, "done");
  }
}