diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/browser/browser_openDialog.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/browser/browser_openDialog.js | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/browser/browser_openDialog.js b/toolkit/mozapps/extensions/test/browser/browser_openDialog.js new file mode 100644 index 0000000000..f95365a4c0 --- /dev/null +++ b/toolkit/mozapps/extensions/test/browser/browser_openDialog.js @@ -0,0 +1,173 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// Tests the dialog open by the Options button for addons that provide a +// custom chrome-like protocol for optionsURL. + +var CustomChromeProtocol = { + scheme: "khrome", + defaultPort: -1, + protocolFlags: Ci.nsIProtocolHandler.URI_DANGEROUS_TO_LOAD | + Ci.nsIProtocolHandler.URI_IS_LOCAL_RESOURCE | + Ci.nsIProtocolHandler.URI_NORELATIVE | + Ci.nsIProtocolHandler.URI_NOAUTH, + + newURI: function CCP_newURI(aSpec, aOriginCharset, aBaseUri) { + let uri = Cc["@mozilla.org/network/simple-uri;1"]. + createInstance(Ci.nsIURI); + uri.spec = aSpec; + return uri; + }, + + newChannel2: function CCP_newChannel2(aURI, aLoadInfo) { + let url = Services.io.newURI("chrome:" + aURI.path, null, null); + let ch = Services.io.newChannelFromURIWithLoadInfo(url, aLoadInfo); + ch.originalURI = aURI; + return ch; + }, + + newChannel: function CCP_newChannel(aURI) { + return this.newChannel2(aURI, null); + }, + + allowPort: function CCP_allowPort(aPort, aScheme) { + return false; + }, + + QueryInterface: XPCOMUtils.generateQI([ + Ci.nsIProtocolHandler + ]), + + classID: Components.ID("{399cb2d1-05dd-4363-896f-63b78e008cf8}"), + + factory: { + registrar: Components.manager.QueryInterface(Ci.nsIComponentRegistrar), + + register: function CCP_register() { + this.registrar.registerFactory( + CustomChromeProtocol.classID, + "CustomChromeProtocol", + "@mozilla.org/network/protocol;1?name=khrome", + this + ); + }, + + unregister: function CCP_register() { + this.registrar.unregisterFactory(CustomChromeProtocol.classID, this); + }, + + // nsIFactory + createInstance: function BNPH_createInstance(aOuter, aIID) { + if (aOuter) { + throw Components.Exception("Class does not allow aggregation", + Components.results.NS_ERROR_NO_AGGREGATION); + } + return CustomChromeProtocol.QueryInterface(aIID); + }, + + lockFactory: function BNPH_lockFactory(aLock) { + throw Components.Exception("Function lockFactory is not implemented", + Components.results.NS_ERROR_NOT_IMPLEMENTED); + }, + + QueryInterface: XPCOMUtils.generateQI([ + Ci.nsIFactory + ]) + } +} + +function test() { + waitForExplicitFinish(); + requestLongerTimeout(2); + + info("Registering custom chrome-like protocol."); + CustomChromeProtocol.factory.register(); + registerCleanupFunction(() => CustomChromeProtocol.factory.unregister()); + + const ADDONS_LIST = [ + { id: "test1@tests.mozilla.org", + name: "Test add-on 1", + optionsURL: CHROMEROOT + "addon_prefs.xul" }, + { id: "test2@tests.mozilla.org", + name: "Test add-on 2", + optionsURL: (CHROMEROOT + "addon_prefs.xul").replace("chrome:", "khrome:") }, + ]; + + var gProvider = new MockProvider(); + gProvider.createAddons(ADDONS_LIST); + + open_manager("addons://list/extension", function(aManager) { + let addonList = aManager.document.getElementById("addon-list"); + let currentAddon; + let instantApply = Services.prefs.getBoolPref("browser.preferences.instantApply"); + + function getAddonByName(aName) { + for (let addonItem of addonList.childNodes) { + if (addonItem.hasAttribute("name") && + addonItem.getAttribute("name") == aName) + return addonItem; + } + return null; + } + + function observer(aSubject, aTopic, aData) { + switch (aTopic) { + case "domwindowclosed": + // Give the preference window a chance to finish closing before + // closing the add-ons manager. + waitForFocus(function () { + test_next_addon(); + }); + break; + case "domwindowopened": + let win = aSubject.QueryInterface(Ci.nsIDOMEventTarget); + waitForFocus(function () { + // If the openDialog privileges are wrong a new browser window + // will open, let the test proceed (and fail) rather than timeout. + if (win.location != currentAddon.optionsURL && + win.location != "chrome://browser/content/browser.xul") + return; + + is(win.location, currentAddon.optionsURL, + "The correct addon pref window should have opened"); + + let chromeFlags = win.QueryInterface(Ci.nsIInterfaceRequestor). + getInterface(Ci.nsIWebNavigation). + QueryInterface(Ci.nsIDocShellTreeItem).treeOwner. + QueryInterface(Ci.nsIInterfaceRequestor). + getInterface(Ci.nsIXULWindow).chromeFlags; + ok(chromeFlags & Ci.nsIWebBrowserChrome.CHROME_OPENAS_CHROME && + (instantApply || chromeFlags & Ci.nsIWebBrowserChrome.CHROME_OPENAS_DIALOG), + "Window was open as a chrome dialog."); + + win.close(); + }, win); + break; + } + } + + function test_next_addon() { + currentAddon = ADDONS_LIST.shift(); + if (!currentAddon) { + Services.ww.unregisterNotification(observer); + close_manager(aManager, finish); + return; + } + + info("Testing " + currentAddon.name); + let addonItem = getAddonByName(currentAddon.name, addonList); + let optionsBtn = + aManager.document.getAnonymousElementByAttribute(addonItem, "anonid", + "preferences-btn"); + is(optionsBtn.hidden, false, "Prefs button should be visible.") + + addonList.ensureElementIsVisible(addonItem); + EventUtils.synthesizeMouseAtCenter(optionsBtn, { }, aManager); + } + + Services.ww.registerNotification(observer); + test_next_addon(); + }); + +} |