forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			185 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| requestLongerTimeout(2);
 | |
| 
 | |
| const testURL = getRootDirectory(gTestPath).replace(
 | |
|   "chrome://mochitests/content",
 | |
|   // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | |
|   "http://example.org"
 | |
| );
 | |
| 
 | |
| const examplecomURL = getRootDirectory(gTestPath).replace(
 | |
|   "chrome://mochitests/content",
 | |
|   // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | |
|   "http://example.com"
 | |
| );
 | |
| 
 | |
| const w3cURL = getRootDirectory(gTestPath).replace(
 | |
|   "chrome://mochitests/content",
 | |
|   // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | |
|   "http://w3c-test.org"
 | |
| );
 | |
| 
 | |
| const examplenetURL = getRootDirectory(gTestPath).replace(
 | |
|   "chrome://mochitests/content",
 | |
|   // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | |
|   "http://example.net"
 | |
| );
 | |
| 
 | |
| const prefixexamplecomURL = getRootDirectory(gTestPath).replace(
 | |
|   "chrome://mochitests/content",
 | |
|   // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | |
|   "http://prefixexample.com"
 | |
| );
 | |
| 
 | |
| class TestCleanup {
 | |
|   constructor() {
 | |
|     this.tabs = [];
 | |
|   }
 | |
| 
 | |
|   count() {
 | |
|     return this.tabs.length;
 | |
|   }
 | |
| 
 | |
|   static setup() {
 | |
|     let cleaner = new TestCleanup();
 | |
|     this.onTabOpen = event => {
 | |
|       cleaner.tabs.push(event.target);
 | |
|     };
 | |
|     gBrowser.tabContainer.addEventListener("TabOpen", this.onTabOpen);
 | |
|     return cleaner;
 | |
|   }
 | |
| 
 | |
|   clean() {
 | |
|     gBrowser.tabContainer.removeEventListener("TabOpen", this.onTabOpen);
 | |
|     for (let tab of this.tabs) {
 | |
|       gBrowser.removeTab(tab);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| async function runTest(count, urls, permissions, delayedAllow) {
 | |
|   let cleaner = TestCleanup.setup();
 | |
| 
 | |
|   // Enable the popup blocker.
 | |
|   await SpecialPowers.pushPrefEnv({
 | |
|     set: [["dom.disable_open_during_load", true]],
 | |
|   });
 | |
| 
 | |
|   await SpecialPowers.pushPermissions(permissions);
 | |
| 
 | |
|   // Open the test page.
 | |
|   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, testURL);
 | |
| 
 | |
|   let contexts = await SpecialPowers.spawn(
 | |
|     tab.linkedBrowser,
 | |
|     [...urls, !!delayedAllow],
 | |
|     async (url1, url2, url3, url4, delay) => {
 | |
|       let iframe1 = content.document.createElement("iframe");
 | |
|       let iframe2 = content.document.createElement("iframe");
 | |
|       iframe1.id = "iframe1";
 | |
|       iframe2.id = "iframe2";
 | |
|       iframe1.src = new URL(
 | |
|         `popup_blocker_frame.html?delayed=${delay}&base=${url3}`,
 | |
|         url1
 | |
|       );
 | |
|       iframe2.src = new URL(
 | |
|         `popup_blocker_frame.html?delayed=${delay}&base=${url4}`,
 | |
|         url2
 | |
|       );
 | |
| 
 | |
|       let promises = [
 | |
|         new Promise(resolve => (iframe1.onload = resolve)),
 | |
|         new Promise(resolve => (iframe2.onload = resolve)),
 | |
|       ];
 | |
| 
 | |
|       content.document.body.appendChild(iframe1);
 | |
|       content.document.body.appendChild(iframe2);
 | |
| 
 | |
|       await Promise.all(promises);
 | |
|       return [iframe1.browsingContext, iframe2.browsingContext];
 | |
|     }
 | |
|   );
 | |
| 
 | |
|   if (delayedAllow) {
 | |
|     await delayedAllow();
 | |
|     await SpecialPowers.spawn(tab.linkedBrowser, contexts, async function(
 | |
|       bc1,
 | |
|       bc2
 | |
|     ) {
 | |
|       bc1.window.postMessage("allow", "*");
 | |
|       bc2.window.postMessage("allow", "*");
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   await TestUtils.waitForCondition(
 | |
|     () => cleaner.count() == count,
 | |
|     `waiting for ${count} tabs, got ${cleaner.count()}`
 | |
|   );
 | |
| 
 | |
|   ok(cleaner.count() == count, `should have ${count} tabs`);
 | |
| 
 | |
|   await SpecialPowers.popPermissions();
 | |
|   cleaner.clean();
 | |
| }
 | |
| 
 | |
| add_task(async function() {
 | |
|   let permission = {
 | |
|     type: "popup",
 | |
|     allow: true,
 | |
|     context: "",
 | |
|   };
 | |
| 
 | |
|   let expected = [];
 | |
| 
 | |
|   let tests = [
 | |
|     [examplecomURL, w3cURL, prefixexamplecomURL, examplenetURL],
 | |
|     [examplecomURL, examplecomURL, prefixexamplecomURL, examplenetURL],
 | |
|     [examplecomURL, examplecomURL, prefixexamplecomURL, prefixexamplecomURL],
 | |
|     [examplecomURL, w3cURL, prefixexamplecomURL, prefixexamplecomURL],
 | |
|   ];
 | |
| 
 | |
|   permission.context = testURL;
 | |
|   expected = [5, 5, 3, 3];
 | |
|   for (let test in tests) {
 | |
|     await runTest(expected[test], tests[test], [permission]);
 | |
|   }
 | |
| 
 | |
|   permission.context = examplecomURL;
 | |
|   expected = [3, 5, 3, 3];
 | |
|   for (let test in tests) {
 | |
|     await runTest(expected[test], tests[test], [permission]);
 | |
|   }
 | |
| 
 | |
|   permission.context = prefixexamplecomURL;
 | |
|   expected = [3, 3, 3, 3];
 | |
|   for (let test in tests) {
 | |
|     await runTest(expected[test], tests[test], [permission]);
 | |
|   }
 | |
| 
 | |
|   async function allowPopup() {
 | |
|     await SpecialPowers.pushPermissions([permission]);
 | |
|   }
 | |
| 
 | |
|   permission.context = testURL;
 | |
|   expected = [5, 5, 3, 3];
 | |
|   for (let test in tests) {
 | |
|     await runTest(expected[test], tests[test], [], allowPopup);
 | |
|   }
 | |
| 
 | |
|   permission.context = examplecomURL;
 | |
|   expected = [3, 5, 3, 3];
 | |
|   for (let test in tests) {
 | |
|     await runTest(expected[test], tests[test], [], allowPopup);
 | |
|   }
 | |
| 
 | |
|   permission.context = prefixexamplecomURL;
 | |
|   expected = [3, 3, 3, 3];
 | |
|   for (let test in tests) {
 | |
|     await runTest(expected[test], tests[test], [], allowPopup);
 | |
|   }
 | |
| });
 | 
