forked from mirrors/gecko-dev
		
	 84a601a6d4
			
		
	
	
		84a601a6d4
		
	
	
	
	
		
			
			Backed out changeset ab87d2c1afae (bug 1596918) Backed out changeset 775f3b06a687 (bug 1596918) Backed out changeset 67cc63ef5d7f (bug 1596918) Backed out changeset 7d290bcd2067 (bug 1596918) Backed out changeset 048db9f4db7c (bug 1596918) Backed out changeset 96a79d2ba614 (bug 1596918) Backed out changeset be770d112dd8 (bug 1596918) Backed out changeset 302c8ab8391c (bug 1596918) Backed out changeset 44ef8f20732e (bug 1596918) Backed out changeset 38c11ebfb8ff (bug 1596918) Backed out changeset b586fc081374 (bug 1596918) Backed out changeset 12283166716f (bug 1596918) Backed out changeset 99b0421015d8 (bug 1596918) Backed out changeset 97ec49dbbbf3 (bug 1596918) Backed out changeset ec79478f58f1 (bug 1596918) Backed out changeset c6d356833bb8 (bug 1596918) Backed out changeset 5ef6026806c8 (bug 1596918)
		
			
				
	
	
		
			366 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			366 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* eslint-disable mozilla/no-arbitrary-setTimeout */
 | |
| 
 | |
| const PREF_DISABLE_OPEN_NEW_WINDOW =
 | |
|   "browser.link.open_newwindow.disabled_in_fullscreen";
 | |
| const PREF_BLOCK_TOPLEVEL_DATA =
 | |
|   "security.data_uri.block_toplevel_data_uri_navigations";
 | |
| const isOSX = Services.appinfo.OS === "Darwin";
 | |
| 
 | |
| const TEST_FILE = "file_fullscreen-window-open.html";
 | |
| const gHttpTestRoot = getRootDirectory(gTestPath).replace(
 | |
|   "chrome://mochitests/content/",
 | |
|   "http://127.0.0.1:8888/"
 | |
| );
 | |
| 
 | |
| var newWin;
 | |
| var newBrowser;
 | |
| 
 | |
| async function test() {
 | |
|   waitForExplicitFinish();
 | |
| 
 | |
|   Services.prefs.setBoolPref(PREF_DISABLE_OPEN_NEW_WINDOW, true);
 | |
|   Services.prefs.setBoolPref(PREF_BLOCK_TOPLEVEL_DATA, false);
 | |
| 
 | |
|   newWin = await BrowserTestUtils.openNewBrowserWindow();
 | |
|   newBrowser = newWin.gBrowser;
 | |
|   await promiseTabLoadEvent(newBrowser.selectedTab, gHttpTestRoot + TEST_FILE);
 | |
| 
 | |
|   // Enter browser fullscreen mode.
 | |
|   newWin.BrowserFullScreen();
 | |
| 
 | |
|   runNextTest();
 | |
| }
 | |
| 
 | |
| registerCleanupFunction(async function() {
 | |
|   // Exit browser fullscreen mode.
 | |
|   newWin.BrowserFullScreen();
 | |
| 
 | |
|   await BrowserTestUtils.closeWindow(newWin);
 | |
| 
 | |
|   Services.prefs.clearUserPref(PREF_DISABLE_OPEN_NEW_WINDOW);
 | |
|   Services.prefs.clearUserPref(PREF_BLOCK_TOPLEVEL_DATA);
 | |
| });
 | |
| 
 | |
| var gTests = [
 | |
|   test_open,
 | |
|   test_open_with_size,
 | |
|   test_open_with_pos,
 | |
|   test_open_with_outerSize,
 | |
|   test_open_with_innerSize,
 | |
|   test_open_with_dialog,
 | |
|   test_open_when_open_new_window_by_pref,
 | |
|   test_open_with_pref_to_disable_in_fullscreen,
 | |
|   test_open_from_chrome,
 | |
| ];
 | |
| 
 | |
| function runNextTest() {
 | |
|   let testCase = gTests.shift();
 | |
|   if (testCase) {
 | |
|     executeSoon(testCase);
 | |
|   } else {
 | |
|     finish();
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Test for window.open() with no feature.
 | |
| function test_open() {
 | |
|   waitForTabOpen({
 | |
|     message: {
 | |
|       title: "test_open",
 | |
|       param: "",
 | |
|     },
 | |
|     finalizeFn() {},
 | |
|   });
 | |
| }
 | |
| 
 | |
| // Test for window.open() with width/height.
 | |
| function test_open_with_size() {
 | |
|   waitForTabOpen({
 | |
|     message: {
 | |
|       title: "test_open_with_size",
 | |
|       param: "width=400,height=400",
 | |
|     },
 | |
|     finalizeFn() {},
 | |
|   });
 | |
| }
 | |
| 
 | |
| // Test for window.open() with top/left.
 | |
| function test_open_with_pos() {
 | |
|   waitForTabOpen({
 | |
|     message: {
 | |
|       title: "test_open_with_pos",
 | |
|       param: "top=200,left=200",
 | |
|     },
 | |
|     finalizeFn() {},
 | |
|   });
 | |
| }
 | |
| 
 | |
| // Test for window.open() with outerWidth/Height.
 | |
| function test_open_with_outerSize() {
 | |
|   let [outerWidth, outerHeight] = [newWin.outerWidth, newWin.outerHeight];
 | |
|   waitForTabOpen({
 | |
|     message: {
 | |
|       title: "test_open_with_outerSize",
 | |
|       param: "outerWidth=200,outerHeight=200",
 | |
|     },
 | |
|     successFn() {
 | |
|       is(newWin.outerWidth, outerWidth, "Don't change window.outerWidth.");
 | |
|       is(newWin.outerHeight, outerHeight, "Don't change window.outerHeight.");
 | |
|     },
 | |
|     finalizeFn() {},
 | |
|   });
 | |
| }
 | |
| 
 | |
| // Test for window.open() with innerWidth/Height.
 | |
| function test_open_with_innerSize() {
 | |
|   let [innerWidth, innerHeight] = [newWin.innerWidth, newWin.innerHeight];
 | |
|   waitForTabOpen({
 | |
|     message: {
 | |
|       title: "test_open_with_innerSize",
 | |
|       param: "innerWidth=200,innerHeight=200",
 | |
|     },
 | |
|     successFn() {
 | |
|       is(newWin.innerWidth, innerWidth, "Don't change window.innerWidth.");
 | |
|       is(newWin.innerHeight, innerHeight, "Don't change window.innerHeight.");
 | |
|     },
 | |
|     finalizeFn() {},
 | |
|   });
 | |
| }
 | |
| 
 | |
| // Test for window.open() with dialog.
 | |
| function test_open_with_dialog() {
 | |
|   waitForTabOpen({
 | |
|     message: {
 | |
|       title: "test_open_with_dialog",
 | |
|       param: "dialog=yes",
 | |
|     },
 | |
|     finalizeFn() {},
 | |
|   });
 | |
| }
 | |
| 
 | |
| // Test for window.open()
 | |
| // when "browser.link.open_newwindow" is nsIBrowserDOMWindow.OPEN_NEWWINDOW
 | |
| function test_open_when_open_new_window_by_pref() {
 | |
|   const PREF_NAME = "browser.link.open_newwindow";
 | |
|   Services.prefs.setIntPref(PREF_NAME, Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW);
 | |
|   is(
 | |
|     Services.prefs.getIntPref(PREF_NAME),
 | |
|     Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW,
 | |
|     PREF_NAME + " is nsIBrowserDOMWindow.OPEN_NEWWINDOW at this time"
 | |
|   );
 | |
| 
 | |
|   waitForTabOpen({
 | |
|     message: {
 | |
|       title: "test_open_when_open_new_window_by_pref",
 | |
|       param: "width=400,height=400",
 | |
|     },
 | |
|     finalizeFn() {
 | |
|       Services.prefs.clearUserPref(PREF_NAME);
 | |
|     },
 | |
|   });
 | |
| }
 | |
| 
 | |
| // Test for the pref, "browser.link.open_newwindow.disabled_in_fullscreen"
 | |
| function test_open_with_pref_to_disable_in_fullscreen() {
 | |
|   Services.prefs.setBoolPref(PREF_DISABLE_OPEN_NEW_WINDOW, false);
 | |
| 
 | |
|   waitForWindowOpen({
 | |
|     message: {
 | |
|       title: "test_open_with_pref_disabled_in_fullscreen",
 | |
|       param: "width=400,height=400",
 | |
|     },
 | |
|     finalizeFn() {
 | |
|       Services.prefs.setBoolPref(PREF_DISABLE_OPEN_NEW_WINDOW, true);
 | |
|     },
 | |
|   });
 | |
| }
 | |
| 
 | |
| // Test for window.open() called from chrome context.
 | |
| function test_open_from_chrome() {
 | |
|   waitForWindowOpenFromChrome({
 | |
|     message: {
 | |
|       title: "test_open_from_chrome",
 | |
|       param: "",
 | |
|       option: "noopener",
 | |
|     },
 | |
|     finalizeFn() {},
 | |
|   });
 | |
| }
 | |
| 
 | |
| function waitForTabOpen(aOptions) {
 | |
|   let message = aOptions.message;
 | |
| 
 | |
|   if (!message.title) {
 | |
|     ok(false, "Can't get message.title.");
 | |
|     aOptions.finalizeFn();
 | |
|     runNextTest();
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   info("Running test: " + message.title);
 | |
| 
 | |
|   let onTabOpen = function onTabOpen(aEvent) {
 | |
|     newBrowser.tabContainer.removeEventListener("TabOpen", onTabOpen, true);
 | |
| 
 | |
|     let tab = aEvent.target;
 | |
|     whenTabLoaded(tab, function() {
 | |
|       is(
 | |
|         tab.linkedBrowser.contentTitle,
 | |
|         message.title,
 | |
|         "Opened Tab is expected: " + message.title
 | |
|       );
 | |
| 
 | |
|       if (aOptions.successFn) {
 | |
|         aOptions.successFn();
 | |
|       }
 | |
| 
 | |
|       newBrowser.removeTab(tab);
 | |
|       finalize();
 | |
|     });
 | |
|   };
 | |
|   newBrowser.tabContainer.addEventListener("TabOpen", onTabOpen, true);
 | |
| 
 | |
|   let finalize = function() {
 | |
|     aOptions.finalizeFn();
 | |
|     info("Finished: " + message.title);
 | |
|     runNextTest();
 | |
|   };
 | |
| 
 | |
|   const URI =
 | |
|     "data:text/html;charset=utf-8,<!DOCTYPE html><html><head><title>" +
 | |
|     message.title +
 | |
|     "<%2Ftitle><%2Fhead><body><%2Fbody><%2Fhtml>";
 | |
| 
 | |
|   executeWindowOpenInContent({
 | |
|     uri: URI,
 | |
|     title: message.title,
 | |
|     option: message.param,
 | |
|   });
 | |
| }
 | |
| 
 | |
| function waitForWindowOpen(aOptions) {
 | |
|   let message = aOptions.message;
 | |
|   let url = aOptions.url || "about:blank";
 | |
| 
 | |
|   if (!message.title) {
 | |
|     ok(false, "Can't get message.title");
 | |
|     aOptions.finalizeFn();
 | |
|     runNextTest();
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   info("Running test: " + message.title);
 | |
| 
 | |
|   let onFinalize = function() {
 | |
|     aOptions.finalizeFn();
 | |
| 
 | |
|     info("Finished: " + message.title);
 | |
|     runNextTest();
 | |
|   };
 | |
| 
 | |
|   let listener = new WindowListener(
 | |
|     message.title,
 | |
|     AppConstants.BROWSER_CHROME_URL,
 | |
|     {
 | |
|       onSuccess: aOptions.successFn,
 | |
|       onFinalize,
 | |
|     }
 | |
|   );
 | |
|   Services.wm.addListener(listener);
 | |
| 
 | |
|   executeWindowOpenInContent({
 | |
|     uri: url,
 | |
|     title: message.title,
 | |
|     option: message.param,
 | |
|   });
 | |
| }
 | |
| 
 | |
| function executeWindowOpenInContent(aParam) {
 | |
|   ContentTask.spawn(
 | |
|     newBrowser.selectedBrowser,
 | |
|     JSON.stringify(aParam),
 | |
|     async function(dataTestParam) {
 | |
|       let testElm = content.document.getElementById("test");
 | |
|       testElm.setAttribute("data-test-param", dataTestParam);
 | |
|       testElm.click();
 | |
|     }
 | |
|   );
 | |
| }
 | |
| 
 | |
| function waitForWindowOpenFromChrome(aOptions) {
 | |
|   let message = aOptions.message;
 | |
|   let url = aOptions.url || "about:blank";
 | |
| 
 | |
|   if (!message.title) {
 | |
|     ok(false, "Can't get message.title");
 | |
|     aOptions.finalizeFn();
 | |
|     runNextTest();
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   info("Running test: " + message.title);
 | |
| 
 | |
|   let onFinalize = function() {
 | |
|     aOptions.finalizeFn();
 | |
| 
 | |
|     info("Finished: " + message.title);
 | |
|     runNextTest();
 | |
|   };
 | |
| 
 | |
|   let listener = new WindowListener(
 | |
|     message.title,
 | |
|     AppConstants.BROWSER_CHROME_URL,
 | |
|     {
 | |
|       onSuccess: aOptions.successFn,
 | |
|       onFinalize,
 | |
|     }
 | |
|   );
 | |
|   Services.wm.addListener(listener);
 | |
| 
 | |
|   newWin.open(url, message.title, message.option);
 | |
| }
 | |
| 
 | |
| function WindowListener(aTitle, aUrl, aCallBackObj) {
 | |
|   this.test_title = aTitle;
 | |
|   this.test_url = aUrl;
 | |
|   this.callback_onSuccess = aCallBackObj.onSuccess;
 | |
|   this.callBack_onFinalize = aCallBackObj.onFinalize;
 | |
| }
 | |
| WindowListener.prototype = {
 | |
|   test_title: null,
 | |
|   test_url: null,
 | |
|   callback_onSuccess: null,
 | |
|   callBack_onFinalize: null,
 | |
| 
 | |
|   onOpenWindow(aXULWindow) {
 | |
|     Services.wm.removeListener(this);
 | |
| 
 | |
|     let domwindow = aXULWindow.docShell.domWindow;
 | |
|     let onLoad = aEvent => {
 | |
|       is(
 | |
|         domwindow.document.location.href,
 | |
|         this.test_url,
 | |
|         "Opened Window is expected: " + this.test_title
 | |
|       );
 | |
|       if (this.callback_onSuccess) {
 | |
|         this.callback_onSuccess();
 | |
|       }
 | |
| 
 | |
|       domwindow.removeEventListener("load", onLoad, true);
 | |
| 
 | |
|       // wait for trasition to fullscreen on OSX Lion later
 | |
|       if (isOSX) {
 | |
|         setTimeout(() => {
 | |
|           domwindow.close();
 | |
|           executeSoon(this.callBack_onFinalize);
 | |
|         }, 3000);
 | |
|       } else {
 | |
|         domwindow.close();
 | |
|         executeSoon(this.callBack_onFinalize);
 | |
|       }
 | |
|     };
 | |
|     domwindow.addEventListener("load", onLoad, true);
 | |
|   },
 | |
|   onCloseWindow(aXULWindow) {},
 | |
|   QueryInterface: ChromeUtils.generateQI([Ci.nsIWindowMediatorListener]),
 | |
| };
 |