michael@0: /** michael@0: * Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ michael@0: */ michael@0: michael@0: let gActiveListeners = {}; michael@0: michael@0: function registerPopupEventHandler(eventName, callback) { michael@0: gActiveListeners[eventName] = function (event) { michael@0: if (event.target != PopupNotifications.panel) michael@0: return; michael@0: PopupNotifications.panel.removeEventListener(eventName, michael@0: gActiveListeners[eventName], michael@0: false); michael@0: delete gActiveListeners[eventName]; michael@0: michael@0: callback.call(PopupNotifications.panel); michael@0: } michael@0: PopupNotifications.panel.addEventListener(eventName, michael@0: gActiveListeners[eventName], michael@0: false); michael@0: } michael@0: michael@0: function unregisterPopupEventHandler(eventName) michael@0: { michael@0: PopupNotifications.panel.removeEventListener(eventName, michael@0: gActiveListeners[eventName], michael@0: false); michael@0: delete gActiveListeners[eventName]; michael@0: } michael@0: michael@0: function unregisterAllPopupEventHandlers() michael@0: { michael@0: for (let eventName in gActiveListeners) { michael@0: PopupNotifications.panel.removeEventListener(eventName, michael@0: gActiveListeners[eventName], michael@0: false); michael@0: } michael@0: gActiveListeners = {}; michael@0: } michael@0: michael@0: function triggerMainCommand(popup) michael@0: { michael@0: info("triggering main command"); michael@0: let notifications = popup.childNodes; michael@0: ok(notifications.length > 0, "at least one notification displayed"); michael@0: let notification = notifications[0]; michael@0: info("triggering command: " + notification.getAttribute("buttonlabel")); michael@0: michael@0: // 20, 10 so that the inner button is hit michael@0: EventUtils.synthesizeMouse(notification.button, 20, 10, {}); michael@0: } michael@0: michael@0: function triggerSecondaryCommand(popup, index) michael@0: { michael@0: info("triggering secondary command, " + index); michael@0: let notifications = popup.childNodes; michael@0: ok(notifications.length > 0, "at least one notification displayed"); michael@0: let notification = notifications[0]; michael@0: michael@0: // Cancel the arrow panel slide-in transition (bug 767133) such that michael@0: // it won't interfere with us interacting with the dropdown. michael@0: SpecialPowers.wrap(document).getAnonymousNodes(popup)[0].style.transition = "none"; michael@0: michael@0: notification.button.focus(); michael@0: michael@0: popup.addEventListener("popupshown", function () { michael@0: popup.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: // Press down until the desired command is selected michael@0: for (let i = 0; i <= index; i++) michael@0: EventUtils.synthesizeKey("VK_DOWN", {}); michael@0: michael@0: // Activate michael@0: EventUtils.synthesizeKey("VK_RETURN", {}); michael@0: }, false); michael@0: michael@0: // One down event to open the popup michael@0: EventUtils.synthesizeKey("VK_DOWN", { altKey: (navigator.platform.indexOf("Mac") == -1) }); michael@0: } michael@0: michael@0: function dismissNotification(popup) michael@0: { michael@0: info("dismissing notification"); michael@0: executeSoon(function () { michael@0: EventUtils.synthesizeKey("VK_ESCAPE", {}); michael@0: }); michael@0: } michael@0: michael@0: function setFinishedCallback(callback, win) michael@0: { michael@0: if (!win) { michael@0: win = window; michael@0: } michael@0: let testPage = win.gBrowser.selectedBrowser.contentWindow.wrappedJSObject; michael@0: testPage.testFinishedCallback = function(result, exception) { michael@0: setTimeout(function() { michael@0: info("got finished callback"); michael@0: callback(result, exception); michael@0: }, 0); michael@0: } michael@0: } michael@0: michael@0: function dispatchEvent(eventName) michael@0: { michael@0: info("dispatching event: " + eventName); michael@0: let event = document.createEvent("Events"); michael@0: event.initEvent(eventName, false, false); michael@0: gBrowser.selectedBrowser.contentWindow.dispatchEvent(event); michael@0: } michael@0: michael@0: function setPermission(url, permission, value) michael@0: { michael@0: const nsIPermissionManager = Components.interfaces.nsIPermissionManager; michael@0: michael@0: switch (value) { michael@0: case "allow": michael@0: value = nsIPermissionManager.ALLOW_ACTION; michael@0: break; michael@0: case "deny": michael@0: value = nsIPermissionManager.DENY_ACTION; michael@0: break; michael@0: case "unknown": michael@0: value = nsIPermissionManager.UNKNOWN_ACTION; michael@0: break; michael@0: default: michael@0: throw new Error("No idea what to set here!"); michael@0: } michael@0: michael@0: let uri = Components.classes["@mozilla.org/network/io-service;1"] michael@0: .getService(Components.interfaces.nsIIOService) michael@0: .newURI(url, null, null); michael@0: let principal = Components.classes["@mozilla.org/scriptsecuritymanager;1"] michael@0: .getService(Ci.nsIScriptSecurityManager) michael@0: .getNoAppCodebasePrincipal(uri); michael@0: michael@0: Components.classes["@mozilla.org/permissionmanager;1"] michael@0: .getService(Components.interfaces.nsIPermissionManager) michael@0: .addFromPrincipal(principal, permission, value); michael@0: } michael@0: michael@0: function removePermission(url, permission) michael@0: { michael@0: let uri = Components.classes["@mozilla.org/network/io-service;1"] michael@0: .getService(Components.interfaces.nsIIOService) michael@0: .newURI(url, null, null); michael@0: let principal = Components.classes["@mozilla.org/scriptsecuritymanager;1"] michael@0: .getService(Ci.nsIScriptSecurityManager) michael@0: .getNoAppCodebasePrincipal(uri); michael@0: michael@0: Components.classes["@mozilla.org/permissionmanager;1"] michael@0: .getService(Components.interfaces.nsIPermissionManager) michael@0: .removeFromPrincipal(principal, permission); michael@0: } michael@0: michael@0: function getPermission(url, permission) michael@0: { michael@0: let uri = Components.classes["@mozilla.org/network/io-service;1"] michael@0: .getService(Components.interfaces.nsIIOService) michael@0: .newURI(url, null, null); michael@0: let principal = Components.classes["@mozilla.org/scriptsecuritymanager;1"] michael@0: .getService(Ci.nsIScriptSecurityManager) michael@0: .getNoAppCodebasePrincipal(uri); michael@0: michael@0: return Components.classes["@mozilla.org/permissionmanager;1"] michael@0: .getService(Components.interfaces.nsIPermissionManager) michael@0: .testPermissionFromPrincipal(principal, permission); michael@0: }