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: // Bug 591465 - Context menu of add-ons miss context related state change entries michael@0: michael@0: michael@0: let tempScope = {}; michael@0: Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm", tempScope); michael@0: let LightweightThemeManager = tempScope.LightweightThemeManager; michael@0: michael@0: michael@0: const PREF_GETADDONS_MAXRESULTS = "extensions.getAddons.maxResults"; michael@0: const PREF_GETADDONS_GETSEARCHRESULTS = "extensions.getAddons.search.url"; michael@0: const SEARCH_URL = TESTROOT + "browser_bug591465.xml"; michael@0: const SEARCH_QUERY = "SEARCH"; michael@0: michael@0: var gManagerWindow; michael@0: var gProvider; michael@0: var gContextMenu; michael@0: var gLWTheme = { michael@0: id: "4", michael@0: version: "1", michael@0: name: "Bling", michael@0: description: "SO MUCH BLING!", michael@0: author: "Pixel Pusher", michael@0: homepageURL: "http://mochi.test:8888/data/index.html", michael@0: headerURL: "http://mochi.test:8888/data/header.png", michael@0: footerURL: "http://mochi.test:8888/data/footer.png", michael@0: previewURL: "http://mochi.test:8888/data/preview.png", michael@0: iconURL: "http://mochi.test:8888/data/icon.png" michael@0: }; michael@0: michael@0: michael@0: function test() { michael@0: waitForExplicitFinish(); michael@0: michael@0: gProvider = new MockProvider(); michael@0: michael@0: gProvider.createAddons([{ michael@0: id: "addon1@tests.mozilla.org", michael@0: name: "addon 1", michael@0: version: "1.0" michael@0: }, { michael@0: id: "addon2@tests.mozilla.org", michael@0: name: "addon 2", michael@0: version: "1.0", michael@0: _userDisabled: true michael@0: }, { michael@0: id: "theme1@tests.mozilla.org", michael@0: name: "theme 1", michael@0: version: "1.0", michael@0: type: "theme" michael@0: }, { michael@0: id: "theme2@tests.mozilla.org", michael@0: name: "theme 2", michael@0: version: "1.0", michael@0: type: "theme", michael@0: _userDisabled: true michael@0: }, { michael@0: id: "theme3@tests.mozilla.org", michael@0: name: "theme 3", michael@0: version: "1.0", michael@0: type: "theme", michael@0: permissions: 0 michael@0: }]); michael@0: michael@0: michael@0: open_manager("addons://list/extension", function(aWindow) { michael@0: gManagerWindow = aWindow; michael@0: gContextMenu = aWindow.document.getElementById("addonitem-popup"); michael@0: run_next_test(); michael@0: }); michael@0: } michael@0: michael@0: michael@0: function end_test() { michael@0: close_manager(gManagerWindow, finish); michael@0: } michael@0: michael@0: michael@0: function check_contextmenu(aIsTheme, aIsEnabled, aIsRemote, aIsDetails, aIsSingleItemCase) { michael@0: if (aIsTheme || aIsEnabled || aIsRemote) michael@0: is_element_hidden(gManagerWindow.document.getElementById("menuitem_enableItem"), michael@0: "'Enable' should be hidden"); michael@0: else michael@0: is_element_visible(gManagerWindow.document.getElementById("menuitem_enableItem"), michael@0: "'Enable' should be visible"); michael@0: michael@0: if (aIsTheme || !aIsEnabled || aIsRemote) michael@0: is_element_hidden(gManagerWindow.document.getElementById("menuitem_disableItem"), michael@0: "'Disable' should be hidden"); michael@0: else michael@0: is_element_visible(gManagerWindow.document.getElementById("menuitem_disableItem"), michael@0: "'Disable' should be visible"); michael@0: michael@0: if (!aIsTheme || aIsEnabled || aIsRemote || aIsSingleItemCase) michael@0: is_element_hidden(gManagerWindow.document.getElementById("menuitem_enableTheme"), michael@0: "'Wear Theme' should be hidden"); michael@0: else michael@0: is_element_visible(gManagerWindow.document.getElementById("menuitem_enableTheme"), michael@0: "'Wear Theme' should be visible"); michael@0: michael@0: if (!aIsTheme || !aIsEnabled || aIsRemote || aIsSingleItemCase) michael@0: is_element_hidden(gManagerWindow.document.getElementById("menuitem_disableTheme"), michael@0: "'Stop Wearing Theme' should be hidden"); michael@0: else michael@0: is_element_visible(gManagerWindow.document.getElementById("menuitem_disableTheme"), michael@0: "'Stop Wearing Theme' should be visible"); michael@0: michael@0: if (aIsRemote) michael@0: is_element_visible(gManagerWindow.document.getElementById("menuitem_installItem"), michael@0: "'Install' should be visible"); michael@0: else michael@0: is_element_hidden(gManagerWindow.document.getElementById("menuitem_installItem"), michael@0: "'Install' should be hidden"); michael@0: michael@0: if (aIsDetails) michael@0: is_element_hidden(gManagerWindow.document.getElementById("menuitem_showDetails"), michael@0: "'Show More Information' should be hidden in details view"); michael@0: else michael@0: is_element_visible(gManagerWindow.document.getElementById("menuitem_showDetails"), michael@0: "'Show More Information' should be visible in list view"); michael@0: michael@0: if (aIsSingleItemCase) michael@0: is_element_hidden(gManagerWindow.document.getElementById("addonitem-menuseparator"), michael@0: "Menu separator should be hidden with only one menu item"); michael@0: else michael@0: is_element_visible(gManagerWindow.document.getElementById("addonitem-menuseparator"), michael@0: "Menu separator should be visible with multiple menu items"); michael@0: michael@0: } michael@0: michael@0: michael@0: add_test(function() { michael@0: var el = get_addon_element(gManagerWindow, "addon1@tests.mozilla.org"); michael@0: isnot(el, null, "Should have found addon element"); michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(false, true, false, false, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on enabled extension item"); michael@0: el.parentNode.ensureElementIsVisible(el); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: michael@0: add_test(function() { michael@0: var el = get_addon_element(gManagerWindow, "addon1@tests.mozilla.org"); michael@0: isnot(el, null, "Should have found addon element"); michael@0: el.mAddon.userDisabled = true; michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(false, false, false, false, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on newly disabled extension item"); michael@0: el.parentNode.ensureElementIsVisible(el); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: michael@0: add_test(function() { michael@0: var el = get_addon_element(gManagerWindow, "addon1@tests.mozilla.org"); michael@0: isnot(el, null, "Should have found addon element"); michael@0: el.mAddon.userDisabled = false; michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(false, true, false, false, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on newly enabled extension item"); michael@0: el.parentNode.ensureElementIsVisible(el); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: michael@0: add_test(function() { michael@0: var el = get_addon_element(gManagerWindow, "addon2@tests.mozilla.org"); michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(false, false, false, false, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on disabled extension item"); michael@0: el.parentNode.ensureElementIsVisible(el); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: michael@0: michael@0: add_test(function() { michael@0: gManagerWindow.loadView("addons://list/theme"); michael@0: wait_for_view_load(gManagerWindow, function() { michael@0: var el = get_addon_element(gManagerWindow, "theme1@tests.mozilla.org"); michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(true, true, false, false, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on enabled theme item"); michael@0: el.parentNode.ensureElementIsVisible(el); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: }); michael@0: michael@0: michael@0: add_test(function() { michael@0: var el = get_addon_element(gManagerWindow, "theme2@tests.mozilla.org"); michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(true, false, false, false, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on disabled theme item"); michael@0: el.parentNode.ensureElementIsVisible(el); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: michael@0: michael@0: add_test(function() { michael@0: LightweightThemeManager.currentTheme = gLWTheme; michael@0: michael@0: var el = get_addon_element(gManagerWindow, "4@personas.mozilla.org"); michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(true, true, false, false, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on enabled LW theme item"); michael@0: el.parentNode.ensureElementIsVisible(el); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: michael@0: michael@0: add_test(function() { michael@0: LightweightThemeManager.currentTheme = null; michael@0: michael@0: var el = get_addon_element(gManagerWindow, "4@personas.mozilla.org"); michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(true, false, false, false, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on disabled LW theme item"); michael@0: el.parentNode.ensureElementIsVisible(el); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: michael@0: michael@0: add_test(function() { michael@0: LightweightThemeManager.currentTheme = gLWTheme; michael@0: michael@0: gManagerWindow.loadView("addons://detail/4@personas.mozilla.org"); michael@0: wait_for_view_load(gManagerWindow, function() { michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(true, true, false, true, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on enabled LW theme, in detail view"); michael@0: var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: }); michael@0: michael@0: michael@0: add_test(function() { michael@0: LightweightThemeManager.currentTheme = null; michael@0: michael@0: gManagerWindow.loadView("addons://detail/4@personas.mozilla.org"); michael@0: wait_for_view_load(gManagerWindow, function() { michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(true, false, false, true, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: michael@0: AddonManager.getAddonByID("4@personas.mozilla.org", function(aAddon) { michael@0: aAddon.uninstall(); michael@0: run_next_test(); michael@0: }); michael@0: }, false); michael@0: michael@0: info("Opening context menu on disabled LW theme, in detail view"); michael@0: var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: }); michael@0: michael@0: michael@0: add_test(function() { michael@0: gManagerWindow.loadView("addons://detail/addon1@tests.mozilla.org"); michael@0: wait_for_view_load(gManagerWindow, function() { michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(false, true, false, true, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on enabled extension, in detail view"); michael@0: var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: }); michael@0: michael@0: michael@0: add_test(function() { michael@0: gManagerWindow.loadView("addons://detail/addon2@tests.mozilla.org"); michael@0: wait_for_view_load(gManagerWindow, function() { michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(false, false, false, true, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on disabled extension, in detail view"); michael@0: var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: }); michael@0: michael@0: michael@0: add_test(function() { michael@0: gManagerWindow.loadView("addons://detail/theme1@tests.mozilla.org"); michael@0: wait_for_view_load(gManagerWindow, function() { michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(true, true, false, true, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on enabled theme, in detail view"); michael@0: var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: }); michael@0: michael@0: michael@0: add_test(function() { michael@0: gManagerWindow.loadView("addons://detail/theme2@tests.mozilla.org"); michael@0: wait_for_view_load(gManagerWindow, function() { michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(true, false, false, true, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on disabled theme, in detail view"); michael@0: var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function() { michael@0: gManagerWindow.loadView("addons://detail/theme3@tests.mozilla.org"); michael@0: wait_for_view_load(gManagerWindow, function() { michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(true, true, false, true, true); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu with single menu item on enabled theme, in detail view"); michael@0: var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function() { michael@0: info("Searching for remote addons"); michael@0: michael@0: Services.prefs.setCharPref(PREF_GETADDONS_GETSEARCHRESULTS, SEARCH_URL); michael@0: Services.prefs.setIntPref(PREF_SEARCH_MAXRESULTS, 15); michael@0: michael@0: var searchBox = gManagerWindow.document.getElementById("header-search"); michael@0: searchBox.value = SEARCH_QUERY; michael@0: michael@0: EventUtils.synthesizeMouseAtCenter(searchBox, { }, gManagerWindow); michael@0: EventUtils.synthesizeKey("VK_RETURN", { }, gManagerWindow); michael@0: michael@0: wait_for_view_load(gManagerWindow, function() { michael@0: var filter = gManagerWindow.document.getElementById("search-filter-remote"); michael@0: EventUtils.synthesizeMouseAtCenter(filter, { }, gManagerWindow); michael@0: executeSoon(function() { michael@0: michael@0: var el = get_addon_element(gManagerWindow, "remote1@tests.mozilla.org"); michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(false, false, true, false, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: run_next_test(); michael@0: }, false); michael@0: michael@0: info("Opening context menu on remote extension item"); michael@0: el.parentNode.ensureElementIsVisible(el); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: michael@0: add_test(function() { michael@0: gManagerWindow.loadView("addons://detail/remote1@tests.mozilla.org"); michael@0: wait_for_view_load(gManagerWindow, function() { michael@0: michael@0: gContextMenu.addEventListener("popupshown", function() { michael@0: gContextMenu.removeEventListener("popupshown", arguments.callee, false); michael@0: michael@0: check_contextmenu(false, false, true, true, false); michael@0: michael@0: gContextMenu.hidePopup(); michael@0: michael@0: // Delete the created install michael@0: AddonManager.getAllInstalls(function(aInstalls) { michael@0: is(aInstalls.length, 1, "Should be one available install"); michael@0: aInstalls[0].cancel(); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: }, false); michael@0: michael@0: info("Opening context menu on remote extension, in detail view"); michael@0: var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); michael@0: EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); michael@0: }); michael@0: });