browser_targetBlankNoOpener.js (3178B)
1 const TEST_URL = "http://mochi.test:8888/browser/dom/html/test/empty.html"; 2 3 async function checkOpener(browser, elm, name, rel) { 4 let p = BrowserTestUtils.waitForNewTab(gBrowser, null, true, true); 5 6 await SpecialPowers.spawn( 7 browser, 8 [{ url: TEST_URL, name, rel, elm }], 9 async obj => { 10 let element; 11 12 if (obj.elm == "anchor") { 13 element = content.document.createElement("a"); 14 content.document.body.appendChild(element); 15 element.appendChild(content.document.createTextNode(obj.name)); 16 } else { 17 let img = content.document.createElement("img"); 18 img.src = "image_yellow.png"; 19 content.document.body.appendChild(img); 20 21 element = content.document.createElement("area"); 22 img.appendChild(element); 23 24 element.setAttribute("shape", "rect"); 25 element.setAttribute("coords", "0,0,100,100"); 26 } 27 28 element.setAttribute("target", "_blank"); 29 element.setAttribute("href", obj.url); 30 31 if (obj.rel) { 32 element.setAttribute("rel", obj.rel); 33 } 34 35 element.click(); 36 } 37 ); 38 39 let newTab = await p; 40 let newBrowser = gBrowser.getBrowserForTab(newTab); 41 42 let hasOpener = await SpecialPowers.spawn( 43 newTab.linkedBrowser, 44 [], 45 _ => !!content.window.opener 46 ); 47 48 BrowserTestUtils.removeTab(newTab); 49 return hasOpener; 50 } 51 52 async function runTests(browser, elm) { 53 info("Creating an " + elm + " with target=_blank rel=opener"); 54 ok( 55 !!(await checkOpener(browser, elm, "rel=opener", "opener")), 56 "We want the opener with rel=opener" 57 ); 58 59 info("Creating an " + elm + " with target=_blank rel=noopener"); 60 ok( 61 !(await checkOpener(browser, elm, "rel=noopener", "noopener")), 62 "We don't want the opener with rel=noopener" 63 ); 64 65 info("Creating an " + elm + " with target=_blank"); 66 ok( 67 !(await checkOpener(browser, elm, "no rel", null)), 68 "We don't want the opener with no rel is passed" 69 ); 70 71 info("Creating an " + elm + " with target=_blank rel='noopener opener'"); 72 ok( 73 !(await checkOpener( 74 browser, 75 elm, 76 "rel=noopener+opener", 77 "noopener opener" 78 )), 79 "noopener wins with rel=noopener+opener" 80 ); 81 82 info("Creating an " + elm + " with target=_blank rel='noreferrer opener'"); 83 ok( 84 !(await checkOpener(browser, elm, "noreferrer wins", "noreferrer opener")), 85 "We don't want the opener with rel=noreferrer+opener" 86 ); 87 88 info("Creating an " + elm + " with target=_blank rel='opener noreferrer'"); 89 ok( 90 !(await checkOpener( 91 browser, 92 elm, 93 "noreferrer wins again", 94 "noreferrer opener" 95 )), 96 "We don't want the opener with rel=opener+noreferrer" 97 ); 98 } 99 100 add_task(async _ => { 101 await SpecialPowers.flushPrefEnv(); 102 await SpecialPowers.pushPrefEnv({ 103 set: [["dom.targetBlankNoOpener.enabled", true]], 104 }); 105 106 let tab = BrowserTestUtils.addTab(gBrowser, TEST_URL); 107 gBrowser.selectedTab = tab; 108 109 let browser = gBrowser.getBrowserForTab(tab); 110 await BrowserTestUtils.browserLoaded(browser); 111 112 await runTests(browser, "anchor"); 113 await runTests(browser, "area"); 114 115 info("Removing the tab"); 116 BrowserTestUtils.removeTab(tab); 117 });