summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/speculation-rules/prerender/prerender-while-prerender.html
blob: 8aa80baf5253f749ce1307b8ca013d753a84e96c (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
<!DOCTYPE html>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"></script>
<script src="../resources/utils.js"></script>
<script src="resources/utils.js"></script>

<body>
<script>
setup(() => assertSpeculationRulesIsSupported());

// We attempted to write this test using `RemoteContextHelper`. See
// https://github.com/web-platform-tests/wpt/blob/23ed0c7015082f21dd29dd09a545e2979dc3e08c/speculation-rules/prerender/prerender-while-prerender.html.
//
// However, that ended up being flaky in Chromium. See
// https://bugs.chromium.org/p/chromium/issues/detail?id=1517319.
//
// We're unsure yet if that flakiness was due to a test bug or an implementation
// bug. In case it is due to a test bug, we are currently trying the following
// uglier `PrerenderChannel` version. If it is still flaky, then probably it is
// an implementation bug, and we can revert to the prettier
// `RemoteContextHelper` version.

promise_test(async t => {
  const uid = token();
  const channel = new PrerenderChannel("result", uid);
  const result = new Promise(r => channel.addEventListener("message", e => r(e.data)));

  window.open(
    `resources/prerender-while-prerender-initiator.html?uid=${uid}`,
    "_blank",
    "noopener"
  );

  assert_equals(
    await result,
    false,
    "document.prerendering in the inner page must be false"
  );

  channel.close();
}, "Prerendering inside a prerender doesn't work, and navigating inside prerenderingchange is fine");
</script>