blob: 1ca1cfb79f3d68f358cdd8fd70f5ca92665d6c51 (
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
|
<!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});
});
}
async function openPortalAndActivate(logic) {
let {port1, port2} = new MessageChannel();
const w = await openBlankPortalHost();
try {
const portal = w.document.createElement('portal');
portal.src = new URL('resources/eval-portal.html?logic=' + encodeURIComponent(logic), location.href);
w.document.body.appendChild(portal);
assert_equals((await nextMessage(portal)).data, 'ready');
const replyPromise = nextMessage(port2);
await portal.activate({data: {replyPort: port1}, transfer: [port1]});
port2.start();
return (await nextMessage(port2)).data;
} finally {
w.close();
}
}
promise_test(async () => {
assert_implements("HTMLPortalElement" in self);
let messageFromNewSrc = await openPortalAndActivate(
'let predecessor = event.adoptPredecessor();' +
'let readyPromise = new Promise((resolve, reject) => {' +
' predecessor.onmessage = e => resolve(e.data + " via new src");' +
'});' +
'predecessor.src = "/portals/resources/eval-portal.html";' +
'document.body.appendChild(predecessor);' +
'return readyPromise;');
assert_equals(messageFromNewSrc, 'ready via new src');
}, "can set portal src during portalactivate");
</script>
|