<!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>
