| <!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_precondition("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> |