summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/portals/portals-set-src-after-activate.html
blob: e485ef4d51c3d60a1840d1589bac939f2b3296e6 (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
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/open-blank-host.js"></script>
<script>
function nextMessage(target) {
  return new Promise((resolve, reject) => {
    target.addEventListener('message', e => resolve(e), {once: true});
  });
}

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-adopts-predecessor.html', location.href);
    w.document.body.appendChild(portal);
    assert_equals((await nextMessage(portal)).data, 'ready');

    // Intentionally don't await activation finishing; this should work
    // even if activation is ongoing.
    let activateDone = portal.activate();

    // TODO(jbroman): It shouldn't be necessary to reinsert the element to
    // navigate it again, either.
    w.document.body.removeChild(portal);
    portal.src = new URL('resources/simple-portal.html', location.href);
    w.document.body.appendChild(portal);
    assert_equals((await nextMessage(portal)).data, 'ready');

    // But activation should still resolve, eventually.
    await activateDone;
  } finally {
    w.close();
  }
}, "Tests that a portal element can be fully reused after activate has detached it");
</script>