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); });