summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/portals/predecessor-fires-unload.html
blob: cb6d98c01d0d19f0cfa42712026fae5beb9f2c6f (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
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/open-blank-host.js"></script>
<script>
function nextEvent(target, type) {
  return new Promise((resolve, reject) => target.addEventListener(type, e => resolve(e), {once: true}));
}

function timePasses(delay) {
  return new Promise((resolve, reject) => step_timeout(() => resolve(), delay));
}

promise_test(async () => {
  assert_implements("HTMLPortalElement" in self);
  const w = await openBlankPortalHost();
  try {
    const portal = w.document.createElement('portal');
    portal.src = new URL('resources/simple-portal.html', location.href);
    w.document.body.appendChild(portal);
    await nextEvent(portal, 'load');
    const pagehideFired = nextEvent(w, 'pagehide');
    const unloadFired = nextEvent(w, 'unload');
    await portal.activate();
    assert_true((await pagehideFired) instanceof w.PageTransitionEvent);
    assert_true((await unloadFired) instanceof w.Event);
  } finally {
    w.close();
  }
}, "pagehide and unload should fire if the predecessor is not adopted");

promise_test(async () => {
  assert_implements("HTMLPortalElement" in self);
  localStorage.setItem('predecessor-fires-unload-events', '');
  window.open('resources/predecessor-fires-unload-watch-unload.html', '_blank', 'noopener');
  while (localStorage.getItem('predecessor-fires-unload-events') != 'pagehide unload') {
    await timePasses(50);
  }
}, "pagehide and unload should fire if the predecessor is not adopted, even without a window/opener association");
</script>