const TEST_URL = "http://mochi.test:8888/browser/dom/html/test/empty.html";

async function checkOpener(browser, elm, name, rel) {
  let p = BrowserTestUtils.waitForNewTab(gBrowser, null, true, true);

  await ContentTask.spawn(browser, {url: TEST_URL, name, rel, elm }, async obj => {
    let element;

    if (obj.elm == "anchor") {
      element = content.document.createElement("a");
      content.document.body.appendChild(element);
      element.appendChild(content.document.createTextNode(obj.name));
    } else {
      let img = content.document.createElement('img');
      img.src = "image_yellow.png";
      content.document.body.appendChild(img);

      element = content.document.createElement("area");
      img.appendChild(element);

      element.setAttribute("shape", "rect");
      element.setAttribute("coords", "0,0,100,100");
    }

    element.setAttribute("target", "_blank");
    element.setAttribute("href", obj.url);

    if (obj.rel) {
      element.setAttribute("rel", obj.rel);
    }

    element.click();
  });

  let newTab = await p;
  let newBrowser = gBrowser.getBrowserForTab(newTab);

  let hasOpener = await ContentTask.spawn(newTab.linkedBrowser, null, _ => !!content.window.opener);

  BrowserTestUtils.removeTab(newTab);
  return hasOpener;
}

async function runTests(browser, elm) {
  info("Creating an " + elm + " with target=_blank rel=opener");
  ok(!!(await checkOpener(browser, elm, "rel=opener", "opener")), "We want the opener with rel=opener");

  info("Creating an " + elm + " with target=_blank rel=noopener");
  ok(!(await checkOpener(browser, elm, "rel=noopener", "noopener")), "We don't want the opener with rel=noopener");

  info("Creating an " + elm + " with target=_blank");
  ok(!(await checkOpener(browser, elm, "no rel", null)), "We don't want the opener with no rel is passed");

  info("Creating an " + elm + " with target=_blank rel='noopener opener'");
  ok(!(await checkOpener(browser, elm, "rel=noopener+opener", "noopener opener")), "noopener wins with rel=noopener+opener");

  info("Creating an " + elm + " with target=_blank rel='noreferrer opener'");
  ok(!(await checkOpener(browser, elm, "noreferrer wins", "noreferrer opener")), "We don't want the opener with rel=noreferrer+opener");

  info("Creating an " + elm + " with target=_blank rel='opener noreferrer'");
  ok(!(await checkOpener(browser, elm, "noreferrer wins again", "noreferrer opener")), "We don't want the opener with rel=opener+noreferrer");
}

add_task(async _ => {
  await SpecialPowers.flushPrefEnv();
  await SpecialPowers.pushPrefEnv({"set": [
    ["dom.block_multiple_popups", false],
    ["dom.disable_open_during_load", true],
    ["dom.targetBlankNoOpener.enabled", true],
  ]});

  let tab = BrowserTestUtils.addTab(gBrowser, TEST_URL);
  gBrowser.selectedTab = tab;

  let browser = gBrowser.getBrowserForTab(tab);
  await BrowserTestUtils.browserLoaded(browser);

  await runTests(browser, 'anchor');
  await runTests(browser, 'area');

  info("Removing the tab");
  BrowserTestUtils.removeTab(tab);
});
