browser_popup_blocker_iframes.js (4994B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 requestLongerTimeout(5); 8 9 const testURL = getRootDirectory(gTestPath).replace( 10 "chrome://mochitests/content", 11 // eslint-disable-next-line @microsoft/sdl/no-insecure-url 12 "http://example.org" 13 ); 14 15 const examplecomURL = getRootDirectory(gTestPath).replace( 16 "chrome://mochitests/content", 17 // eslint-disable-next-line @microsoft/sdl/no-insecure-url 18 "http://example.com" 19 ); 20 21 const w3cURL = getRootDirectory(gTestPath).replace( 22 "chrome://mochitests/content", 23 // eslint-disable-next-line @microsoft/sdl/no-insecure-url 24 "http://w3c-test.org" 25 ); 26 27 const examplenetURL = getRootDirectory(gTestPath).replace( 28 "chrome://mochitests/content", 29 // eslint-disable-next-line @microsoft/sdl/no-insecure-url 30 "http://example.net" 31 ); 32 33 const prefixexamplecomURL = getRootDirectory(gTestPath).replace( 34 "chrome://mochitests/content", 35 // eslint-disable-next-line @microsoft/sdl/no-insecure-url 36 "http://prefixexample.com" 37 ); 38 39 class TestCleanup { 40 constructor() { 41 this.tabs = []; 42 } 43 44 count() { 45 return this.tabs.length; 46 } 47 48 static setup() { 49 let cleaner = new TestCleanup(); 50 this.onTabOpen = event => { 51 cleaner.tabs.push(event.target); 52 }; 53 gBrowser.tabContainer.addEventListener("TabOpen", this.onTabOpen); 54 return cleaner; 55 } 56 57 clean() { 58 gBrowser.tabContainer.removeEventListener("TabOpen", this.onTabOpen); 59 for (let tab of this.tabs) { 60 gBrowser.removeTab(tab); 61 } 62 } 63 } 64 65 async function runTest(count, urls, permissions, delayedAllow) { 66 let cleaner = TestCleanup.setup(); 67 68 // Enable the popup blocker. 69 await SpecialPowers.pushPrefEnv({ 70 set: [["dom.disable_open_during_load", true]], 71 }); 72 73 await SpecialPowers.pushPermissions(permissions); 74 75 // Open the test page. 76 let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, testURL); 77 78 let contexts = await SpecialPowers.spawn( 79 tab.linkedBrowser, 80 [...urls, !!delayedAllow], 81 async (url1, url2, url3, url4, delay) => { 82 let iframe1 = content.document.createElement("iframe"); 83 let iframe2 = content.document.createElement("iframe"); 84 iframe1.id = "iframe1"; 85 iframe2.id = "iframe2"; 86 iframe1.src = new URL( 87 `popup_blocker_frame.html?delayed=${delay}&base=${url3}`, 88 url1 89 ); 90 iframe2.src = new URL( 91 `popup_blocker_frame.html?delayed=${delay}&base=${url4}`, 92 url2 93 ); 94 95 let promises = [ 96 new Promise(resolve => (iframe1.onload = resolve)), 97 new Promise(resolve => (iframe2.onload = resolve)), 98 ]; 99 100 content.document.body.appendChild(iframe1); 101 content.document.body.appendChild(iframe2); 102 103 await Promise.all(promises); 104 return [iframe1.browsingContext, iframe2.browsingContext]; 105 } 106 ); 107 108 if (delayedAllow) { 109 await delayedAllow(); 110 await SpecialPowers.spawn( 111 tab.linkedBrowser, 112 contexts, 113 async function (bc1, bc2) { 114 bc1.window.postMessage("allow", "*"); 115 bc2.window.postMessage("allow", "*"); 116 } 117 ); 118 } 119 120 await TestUtils.waitForCondition( 121 () => cleaner.count() == count, 122 `waiting for ${count} tabs, got ${cleaner.count()}` 123 ); 124 125 Assert.equal(cleaner.count(), count, `should have ${count} tabs`); 126 127 await SpecialPowers.popPermissions(); 128 cleaner.clean(); 129 } 130 131 add_task(async function () { 132 let permission = { 133 type: "popup", 134 allow: true, 135 context: "", 136 }; 137 138 let expected = []; 139 140 let tests = [ 141 [examplecomURL, w3cURL, prefixexamplecomURL, examplenetURL], 142 [examplecomURL, examplecomURL, prefixexamplecomURL, examplenetURL], 143 [examplecomURL, examplecomURL, prefixexamplecomURL, prefixexamplecomURL], 144 [examplecomURL, w3cURL, prefixexamplecomURL, prefixexamplecomURL], 145 ]; 146 147 permission.context = testURL; 148 expected = [5, 5, 3, 3]; 149 for (let test in tests) { 150 await runTest(expected[test], tests[test], [permission]); 151 } 152 153 permission.context = examplecomURL; 154 expected = [3, 5, 3, 3]; 155 for (let test in tests) { 156 await runTest(expected[test], tests[test], [permission]); 157 } 158 159 permission.context = prefixexamplecomURL; 160 expected = [3, 3, 3, 3]; 161 for (let test in tests) { 162 await runTest(expected[test], tests[test], [permission]); 163 } 164 165 async function allowPopup() { 166 await SpecialPowers.pushPermissions([permission]); 167 } 168 169 permission.context = testURL; 170 expected = [5, 5, 3, 3]; 171 for (let test in tests) { 172 await runTest(expected[test], tests[test], [], allowPopup); 173 } 174 175 permission.context = examplecomURL; 176 expected = [3, 5, 3, 3]; 177 for (let test in tests) { 178 await runTest(expected[test], tests[test], [], allowPopup); 179 } 180 181 permission.context = prefixexamplecomURL; 182 expected = [3, 3, 3, 3]; 183 for (let test in tests) { 184 await runTest(expected[test], tests[test], [], allowPopup); 185 } 186 });