blob: e485ef4d51c3d60a1840d1589bac939f2b3296e6 [file] [log] [blame]
<!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>