<!doctype html>
<title>opener and discarded browsing contexts</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<div id=log></div>
<iframe name=matchesastring></iframe>
<script>
function testOpener(t, otherW, thisW, discardOtherBC, isDiscardedFromATask) {
  assert_equals(otherW.opener, thisW, "opener before removal");

  const openerDesc = Object.getOwnPropertyDescriptor(otherW, "opener"),
        openerGet = openerDesc.get;

  assert_equals(openerGet(), thisW, "opener before removal via directly invoking the getter");
  discardOtherBC();
  if (isDiscardedFromATask) {
    t.step_timeout(() => {
      testOpenerRemainder(t, otherW, openerDesc, openerGet);
    }, 250);
  } else {
    testOpenerRemainder(t, otherW, openerDesc, openerGet);
  }
}

function testOpenerRemainder(t, otherW, openerDesc, openerGet) {
  assert_equals(otherW.opener, null, "opener after removal");
  assert_equals(openerGet(), null, "opener after removal via directly invoking the getter");

  otherW.opener = null;
  assert_equals(openerGet(), null, "opener after setting it null via directly invoking the getter");
  const openerDescNull = Object.getOwnPropertyDescriptor(otherW, "opener");
  assert_not_equals(openerDescNull, openerDesc);
  assert_object_equals(openerDescNull, openerDesc);

  otherW.opener = "immaterial";
  assert_equals(openerGet(), null, "opener after setting it \"immaterial\" via directly invoking the getter");
  const openerDescImmaterial = Object.getOwnPropertyDescriptor(otherW, "opener");
  assert_equals(openerDescImmaterial.value, "immaterial");
  assert_true(openerDescImmaterial.writable);
  assert_true(openerDescImmaterial.enumerable);
  assert_true(openerDescImmaterial.configurable);

  t.done();
}

async_test(t => {
  const frame = document.querySelector("iframe"),
        frameW = frame.contentWindow;
  frame.onload = t.step_func(() => {
    // Firefox and Chrome/Safari load differently
    if (frame.contentWindow.location.href === "about:blank") {
      return;
    }

    testOpener(t, frameW, window, () => frame.remove(), false);
  });
  window.open("/common/blank.html", "matchesastring");
}, "opener of discarded nested browsing context");

async_test(t => {
  const popupW = window.open("/common/blank.html");
  popupW.onload = t.step_func(() => {
    testOpener(t, popupW, window, () => popupW.close(), true);
  });
}, "opener of discarded auxiliary browsing context");
</script>
