diff --git a/uriloader/exthandler/tests/mochitest/browser.ini b/uriloader/exthandler/tests/mochitest/browser.ini index 9647dcf8cd00..a1de09e185d8 100644 --- a/uriloader/exthandler/tests/mochitest/browser.ini +++ b/uriloader/exthandler/tests/mochitest/browser.ini @@ -1,8 +1,12 @@ [DEFAULT] head = head.js support-files = + download_page.html + download.bin protocolHandler.html +[browser_auto_close_window.js] +skip-if = !e10s # test relies on e10s behavior [browser_download_always_ask_preferred_app.js] [browser_remember_download_option.js] [browser_web_protocol_handlers.js] diff --git a/uriloader/exthandler/tests/mochitest/browser_auto_close_window.js b/uriloader/exthandler/tests/mochitest/browser_auto_close_window.js new file mode 100644 index 000000000000..32f0e8e2eb61 --- /dev/null +++ b/uriloader/exthandler/tests/mochitest/browser_auto_close_window.js @@ -0,0 +1,103 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +const URL = + getRootDirectory(gTestPath).replace("chrome://mochitests/content", + "https://example.com") + + "download_page.html"; + +const HELPERAPP_DIALOG_CONTRACT_ID = "@mozilla.org/helperapplauncherdialog;1"; +const HELPERAPP_DIALOG_CID = + Components.ID(Cc[HELPERAPP_DIALOG_CONTRACT_ID].number); +const MOCK_HELPERAPP_DIALOG_CID = + Components.ID("{2f372b6f-56c9-46d5-af0d-9f09bb69860c}"); + +let registrar = Components.manager + .QueryInterface(Ci.nsIComponentRegistrar); +let curDialogResolve = null; + +function HelperAppLauncherDialog() { +} + +HelperAppLauncherDialog.prototype = { + show: function(aLauncher, aWindowContext, aReason) { + ok(true, "Showing the helper app dialog"); + curDialogResolve(aWindowContext); + executeSoon(() => { aLauncher.cancel(Cr.NS_ERROR_ABORT); }); + }, + QueryInterface: XPCOMUtils.generateQI([Ci.nsIHelperAppLauncherDialog]) +}; + +function promiseHelperAppDialog() { + return new Promise((resolve) => { + curDialogResolve = resolve; + }); +} + +let mockHelperAppService; + +add_task(async function setup() { + // Replace the real helper app dialog with our own. + mockHelperAppService = XPCOMUtils._getFactory(HelperAppLauncherDialog); + registrar.registerFactory(MOCK_HELPERAPP_DIALOG_CID, "", + HELPERAPP_DIALOG_CONTRACT_ID, + mockHelperAppService); +}); + +add_task(async function simple_navigation() { + // Tests that simple navigation gives us the right windowContext (that is, + // the window that we're using). + await BrowserTestUtils.withNewTab({ gBrowser, url: URL }, function* (browser) { + let dialogAppeared = promiseHelperAppDialog(); + yield BrowserTestUtils.synthesizeMouseAtCenter("#regular_load", {}, browser); + let windowContext = yield dialogAppeared; + + is(windowContext.gBrowser.selectedBrowser.currentURI.spec, URL, + "got the right windowContext"); + }); +}); + +add_task(async function target_blank() { + // Tests that a link with target=_blank opens a new tab and closes it, + // returning the window that we're using for navigation. + await BrowserTestUtils.withNewTab({ gBrowser, url: URL }, function* (browser) { + let dialogAppeared = promiseHelperAppDialog(); + let tabOpened = BrowserTestUtils.waitForEvent(gBrowser.tabContainer, "TabOpen").then((event) => { + return event.target; + }); + + yield BrowserTestUtils.synthesizeMouseAtCenter("#target_blank", {}, browser); + + let windowContext = yield dialogAppeared; + is(windowContext.gBrowser.selectedBrowser.currentURI.spec, URL, + "got the right windowContext"); + let tab = yield tabOpened; + is(tab.linkedBrowser, null, "tab was opened and closed"); + }); +}); + +add_task(async function new_window() { + // Tests that a link that forces us to open a new window (by specifying a + // width and a height in window.open) opens a new window for the load, + // realizes that we need to close that window and returns the *original* + // window as the window context. + await BrowserTestUtils.withNewTab({ gBrowser, url: URL }, function* (browser) { + let dialogAppeared = promiseHelperAppDialog(); + let windowOpened = BrowserTestUtils.waitForNewWindow(false); + + yield BrowserTestUtils.synthesizeMouseAtCenter("#new_window", {}, browser); + + let windowContext = yield dialogAppeared; + is(windowContext.gBrowser.selectedBrowser.currentURI.spec, URL, + "got the right windowContext"); + let win = yield windowOpened; + is(win.closed, true, "window was opened and closed"); + }); +}); + +add_task(async function cleanup() { + // Unregister our factory from XPCOM and restore the original CID. + registrar.unregisterFactory(MOCK_HELPERAPP_DIALOG_CID, mockHelperAppService); + registrar.registerFactory(HELPERAPP_DIALOG_CID, "", + HELPERAPP_DIALOG_CONTRACT_ID, null); +}); diff --git a/uriloader/exthandler/tests/mochitest/download.bin b/uriloader/exthandler/tests/mochitest/download.bin new file mode 100644 index 000000000000..0e4b0c7bae67 --- /dev/null +++ b/uriloader/exthandler/tests/mochitest/download.bin @@ -0,0 +1 @@ +abc123 diff --git a/uriloader/exthandler/tests/mochitest/download_page.html b/uriloader/exthandler/tests/mochitest/download_page.html new file mode 100644 index 000000000000..3f482cd238ab --- /dev/null +++ b/uriloader/exthandler/tests/mochitest/download_page.html @@ -0,0 +1,18 @@ + + + + + + Test page for link clicking + + + + regular load + target blank + new window +