summaryrefslogtreecommitdiffstats
path: root/browser/components/customizableui/test/browser_880164_customization_context_menus.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/customizableui/test/browser_880164_customization_context_menus.js')
-rw-r--r--browser/components/customizableui/test/browser_880164_customization_context_menus.js414
1 files changed, 414 insertions, 0 deletions
diff --git a/browser/components/customizableui/test/browser_880164_customization_context_menus.js b/browser/components/customizableui/test/browser_880164_customization_context_menus.js
new file mode 100644
index 000000000..57a0db773
--- /dev/null
+++ b/browser/components/customizableui/test/browser_880164_customization_context_menus.js
@@ -0,0 +1,414 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+requestLongerTimeout(2);
+
+const isOSX = (Services.appinfo.OS === "Darwin");
+
+// Right-click on the home button should
+// show a context menu with options to move it.
+add_task(function*() {
+ let contextMenu = document.getElementById("toolbar-context-menu");
+ let shownPromise = popupShown(contextMenu);
+ let homeButton = document.getElementById("home-button");
+ EventUtils.synthesizeMouse(homeButton, 2, 2, {type: "contextmenu", button: 2 });
+ yield shownPromise;
+
+ let expectedEntries = [
+ [".customize-context-moveToPanel", true],
+ [".customize-context-removeFromToolbar", true],
+ ["---"]
+ ];
+ if (!isOSX) {
+ expectedEntries.push(["#toggle_toolbar-menubar", true]);
+ }
+ expectedEntries.push(
+ ["#toggle_PersonalToolbar", true],
+ ["---"],
+ [".viewCustomizeToolbar", true]
+ );
+ checkContextMenu(contextMenu, expectedEntries);
+
+ let hiddenPromise = popupHidden(contextMenu);
+ contextMenu.hidePopup();
+ yield hiddenPromise;
+});
+
+// Right-click on an empty bit of tabstrip should
+// show a context menu without options to move it,
+// but with tab-specific options instead.
+add_task(function*() {
+ // ensure there are tabs to reload/bookmark:
+ let extraTab = gBrowser.selectedTab = gBrowser.addTab();
+ yield promiseTabLoadEvent(extraTab, "http://example.com/");
+ let contextMenu = document.getElementById("toolbar-context-menu");
+ let shownPromise = popupShown(contextMenu);
+ let tabstrip = document.getElementById("tabbrowser-tabs");
+ let rect = tabstrip.getBoundingClientRect();
+ EventUtils.synthesizeMouse(tabstrip, rect.width - 2, 2, {type: "contextmenu", button: 2 });
+ yield shownPromise;
+
+ let closedTabsAvailable = SessionStore.getClosedTabCount(window) == 0;
+ info("Closed tabs: " + closedTabsAvailable);
+ let expectedEntries = [
+ ["#toolbar-context-reloadAllTabs", true],
+ ["#toolbar-context-bookmarkAllTabs", true],
+ ["#toolbar-context-undoCloseTab", !closedTabsAvailable],
+ ["---"]
+ ];
+ if (!isOSX) {
+ expectedEntries.push(["#toggle_toolbar-menubar", true]);
+ }
+ expectedEntries.push(
+ ["#toggle_PersonalToolbar", true],
+ ["---"],
+ [".viewCustomizeToolbar", true]
+ );
+ checkContextMenu(contextMenu, expectedEntries);
+
+ let hiddenPromise = popupHidden(contextMenu);
+ contextMenu.hidePopup();
+ yield hiddenPromise;
+ gBrowser.removeTab(extraTab);
+});
+
+// Right-click on an empty bit of extra toolbar should
+// show a context menu with moving options disabled,
+// and a toggle option for the extra toolbar
+add_task(function*() {
+ let contextMenu = document.getElementById("toolbar-context-menu");
+ let shownPromise = popupShown(contextMenu);
+ let toolbar = createToolbarWithPlacements("880164_empty_toolbar", []);
+ toolbar.setAttribute("context", "toolbar-context-menu");
+ toolbar.setAttribute("toolbarname", "Fancy Toolbar for Context Menu");
+ EventUtils.synthesizeMouseAtCenter(toolbar, {type: "contextmenu", button: 2 });
+ yield shownPromise;
+
+ let expectedEntries = [
+ [".customize-context-moveToPanel", false],
+ [".customize-context-removeFromToolbar", false],
+ ["---"]
+ ];
+ if (!isOSX) {
+ expectedEntries.push(["#toggle_toolbar-menubar", true]);
+ }
+ expectedEntries.push(
+ ["#toggle_PersonalToolbar", true],
+ ["#toggle_880164_empty_toolbar", true],
+ ["---"],
+ [".viewCustomizeToolbar", true]
+ );
+ checkContextMenu(contextMenu, expectedEntries);
+
+ let hiddenPromise = popupHidden(contextMenu);
+ contextMenu.hidePopup();
+ yield hiddenPromise;
+ removeCustomToolbars();
+});
+
+
+// Right-click on the urlbar-container should
+// show a context menu with disabled options to move it.
+add_task(function*() {
+ let contextMenu = document.getElementById("toolbar-context-menu");
+ let shownPromise = popupShown(contextMenu);
+ let urlBarContainer = document.getElementById("urlbar-container");
+ // Need to make sure not to click within an edit field.
+ EventUtils.synthesizeMouse(urlBarContainer, 100, 1, {type: "contextmenu", button: 2 });
+ yield shownPromise;
+
+ let expectedEntries = [
+ [".customize-context-moveToPanel", false],
+ [".customize-context-removeFromToolbar", false],
+ ["---"]
+ ];
+ if (!isOSX) {
+ expectedEntries.push(["#toggle_toolbar-menubar", true]);
+ }
+ expectedEntries.push(
+ ["#toggle_PersonalToolbar", true],
+ ["---"],
+ [".viewCustomizeToolbar", true]
+ );
+ checkContextMenu(contextMenu, expectedEntries);
+
+ let hiddenPromise = popupHidden(contextMenu);
+ contextMenu.hidePopup();
+ yield hiddenPromise;
+});
+
+// Right-click on the searchbar and moving it to the menu
+// and back should move the search-container instead.
+add_task(function*() {
+ let searchbar = document.getElementById("searchbar");
+ gCustomizeMode.addToPanel(searchbar);
+ let placement = CustomizableUI.getPlacementOfWidget("search-container");
+ is(placement.area, CustomizableUI.AREA_PANEL, "Should be in panel");
+
+ let shownPanelPromise = promisePanelShown(window);
+ PanelUI.toggle({type: "command"});
+ yield shownPanelPromise;
+ let hiddenPanelPromise = promisePanelHidden(window);
+ PanelUI.toggle({type: "command"});
+ yield hiddenPanelPromise;
+
+ gCustomizeMode.addToToolbar(searchbar);
+ placement = CustomizableUI.getPlacementOfWidget("search-container");
+ is(placement.area, CustomizableUI.AREA_NAVBAR, "Should be in navbar");
+ gCustomizeMode.removeFromArea(searchbar);
+ placement = CustomizableUI.getPlacementOfWidget("search-container");
+ is(placement, null, "Should be in palette");
+ CustomizableUI.reset();
+ placement = CustomizableUI.getPlacementOfWidget("search-container");
+ is(placement.area, CustomizableUI.AREA_NAVBAR, "Should be in navbar");
+});
+
+// Right-click on an item within the menu panel should
+// show a context menu with options to move it.
+add_task(function*() {
+ let shownPanelPromise = promisePanelShown(window);
+ PanelUI.toggle({type: "command"});
+ yield shownPanelPromise;
+
+ let contextMenu = document.getElementById("customizationPanelItemContextMenu");
+ let shownContextPromise = popupShown(contextMenu);
+ let newWindowButton = document.getElementById("new-window-button");
+ ok(newWindowButton, "new-window-button was found");
+ EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2});
+ yield shownContextPromise;
+
+ is(PanelUI.panel.state, "open", "The PanelUI should still be open.");
+
+ let expectedEntries = [
+ [".customize-context-moveToToolbar", true],
+ [".customize-context-removeFromPanel", true],
+ ["---"],
+ [".viewCustomizeToolbar", true]
+ ];
+ checkContextMenu(contextMenu, expectedEntries);
+
+ let hiddenContextPromise = popupHidden(contextMenu);
+ contextMenu.hidePopup();
+ yield hiddenContextPromise;
+
+ let hiddenPromise = promisePanelHidden(window);
+ PanelUI.toggle({type: "command"});
+ yield hiddenPromise;
+});
+
+// Right-click on the home button while in customization mode
+// should show a context menu with options to move it.
+add_task(function*() {
+ yield startCustomizing();
+ let contextMenu = document.getElementById("toolbar-context-menu");
+ let shownPromise = popupShown(contextMenu);
+ let homeButton = document.getElementById("wrapper-home-button");
+ EventUtils.synthesizeMouse(homeButton, 2, 2, {type: "contextmenu", button: 2});
+ yield shownPromise;
+
+ let expectedEntries = [
+ [".customize-context-moveToPanel", true],
+ [".customize-context-removeFromToolbar", true],
+ ["---"]
+ ];
+ if (!isOSX) {
+ expectedEntries.push(["#toggle_toolbar-menubar", true]);
+ }
+ expectedEntries.push(
+ ["#toggle_PersonalToolbar", true],
+ ["---"],
+ [".viewCustomizeToolbar", false]
+ );
+ checkContextMenu(contextMenu, expectedEntries);
+
+ let hiddenContextPromise = popupHidden(contextMenu);
+ contextMenu.hidePopup();
+ yield hiddenContextPromise;
+});
+
+// Right-click on an item in the palette should
+// show a context menu with options to move it.
+add_task(function*() {
+ let contextMenu = document.getElementById("customizationPaletteItemContextMenu");
+ let shownPromise = popupShown(contextMenu);
+ let openFileButton = document.getElementById("wrapper-open-file-button");
+ EventUtils.synthesizeMouse(openFileButton, 2, 2, {type: "contextmenu", button: 2});
+ yield shownPromise;
+
+ let expectedEntries = [
+ [".customize-context-addToToolbar", true],
+ [".customize-context-addToPanel", true]
+ ];
+ checkContextMenu(contextMenu, expectedEntries);
+
+ let hiddenContextPromise = popupHidden(contextMenu);
+ contextMenu.hidePopup();
+ yield hiddenContextPromise;
+});
+
+// Right-click on an item in the panel while in customization mode
+// should show a context menu with options to move it.
+add_task(function*() {
+ let contextMenu = document.getElementById("customizationPanelItemContextMenu");
+ let shownPromise = popupShown(contextMenu);
+ let newWindowButton = document.getElementById("wrapper-new-window-button");
+ EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2});
+ yield shownPromise;
+
+ let expectedEntries = [
+ [".customize-context-moveToToolbar", true],
+ [".customize-context-removeFromPanel", true],
+ ["---"],
+ [".viewCustomizeToolbar", false]
+ ];
+ checkContextMenu(contextMenu, expectedEntries);
+
+ let hiddenContextPromise = popupHidden(contextMenu);
+ contextMenu.hidePopup();
+ yield hiddenContextPromise;
+ yield endCustomizing();
+});
+
+// Test the toolbarbutton panel context menu in customization mode
+// without opening the panel before customization mode
+add_task(function*() {
+ this.otherWin = yield openAndLoadWindow(null, true);
+
+ yield new Promise(resolve => waitForFocus(resolve, this.otherWin));
+
+ yield startCustomizing(this.otherWin);
+
+ let contextMenu = this.otherWin.document.getElementById("customizationPanelItemContextMenu");
+ let shownPromise = popupShown(contextMenu);
+ let newWindowButton = this.otherWin.document.getElementById("wrapper-new-window-button");
+ EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2}, this.otherWin);
+ yield shownPromise;
+
+ let expectedEntries = [
+ [".customize-context-moveToToolbar", true],
+ [".customize-context-removeFromPanel", true],
+ ["---"],
+ [".viewCustomizeToolbar", false]
+ ];
+ checkContextMenu(contextMenu, expectedEntries, this.otherWin);
+
+ let hiddenContextPromise = popupHidden(contextMenu);
+ contextMenu.hidePopup();
+ yield hiddenContextPromise;
+ yield endCustomizing(this.otherWin);
+ yield promiseWindowClosed(this.otherWin);
+ this.otherWin = null;
+
+ yield new Promise(resolve => waitForFocus(resolve, window));
+});
+
+// Bug 945191 - Combined buttons show wrong context menu options
+// when they are in the toolbar.
+add_task(function*() {
+ yield startCustomizing();
+ let contextMenu = document.getElementById("customizationPanelItemContextMenu");
+ let shownPromise = popupShown(contextMenu);
+ let zoomControls = document.getElementById("wrapper-zoom-controls");
+ EventUtils.synthesizeMouse(zoomControls, 2, 2, {type: "contextmenu", button: 2});
+ yield shownPromise;
+ // Execute the command to move the item from the panel to the toolbar.
+ contextMenu.childNodes[0].doCommand();
+ let hiddenPromise = popupHidden(contextMenu);
+ contextMenu.hidePopup();
+ yield hiddenPromise;
+ yield endCustomizing();
+
+ zoomControls = document.getElementById("zoom-controls");
+ is(zoomControls.parentNode.id, "nav-bar-customization-target", "Zoom-controls should be on the nav-bar");
+
+ contextMenu = document.getElementById("toolbar-context-menu");
+ shownPromise = popupShown(contextMenu);
+ EventUtils.synthesizeMouse(zoomControls, 2, 2, {type: "contextmenu", button: 2});
+ yield shownPromise;
+
+ let expectedEntries = [
+ [".customize-context-moveToPanel", true],
+ [".customize-context-removeFromToolbar", true],
+ ["---"]
+ ];
+ if (!isOSX) {
+ expectedEntries.push(["#toggle_toolbar-menubar", true]);
+ }
+ expectedEntries.push(
+ ["#toggle_PersonalToolbar", true],
+ ["---"],
+ [".viewCustomizeToolbar", true]
+ );
+ checkContextMenu(contextMenu, expectedEntries);
+
+ hiddenPromise = popupHidden(contextMenu);
+ contextMenu.hidePopup();
+ yield hiddenPromise;
+ yield resetCustomization();
+});
+
+// Bug 947586 - After customization, panel items show wrong context menu options
+add_task(function*() {
+ yield startCustomizing();
+ yield endCustomizing();
+
+ yield PanelUI.show();
+
+ let contextMenu = document.getElementById("customizationPanelItemContextMenu");
+ let shownContextPromise = popupShown(contextMenu);
+ let newWindowButton = document.getElementById("new-window-button");
+ ok(newWindowButton, "new-window-button was found");
+ EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2});
+ yield shownContextPromise;
+
+ is(PanelUI.panel.state, "open", "The PanelUI should still be open.");
+
+ let expectedEntries = [
+ [".customize-context-moveToToolbar", true],
+ [".customize-context-removeFromPanel", true],
+ ["---"],
+ [".viewCustomizeToolbar", true]
+ ];
+ checkContextMenu(contextMenu, expectedEntries);
+
+ let hiddenContextPromise = popupHidden(contextMenu);
+ contextMenu.hidePopup();
+ yield hiddenContextPromise;
+
+ let hiddenPromise = promisePanelHidden(window);
+ PanelUI.hide();
+ yield hiddenPromise;
+});
+
+
+// Bug 982027 - moving icon around removes custom context menu.
+add_task(function*() {
+ let widgetId = "custom-context-menu-toolbarbutton";
+ let expectedContext = "myfancycontext";
+ let widget = createDummyXULButton(widgetId, "Test ctxt menu");
+ widget.setAttribute("context", expectedContext);
+ CustomizableUI.addWidgetToArea(widgetId, CustomizableUI.AREA_NAVBAR);
+ is(widget.getAttribute("context"), expectedContext, "Should have context menu when added to the toolbar.");
+
+ yield startCustomizing();
+ is(widget.getAttribute("context"), "", "Should not have own context menu in the toolbar now that we're customizing.");
+ is(widget.getAttribute("wrapped-context"), expectedContext, "Should keep own context menu wrapped when in toolbar.");
+
+ let panel = PanelUI.contents;
+ simulateItemDrag(widget, panel);
+ is(widget.getAttribute("context"), "", "Should not have own context menu when in the panel.");
+ is(widget.getAttribute("wrapped-context"), expectedContext, "Should keep own context menu wrapped now that we're in the panel.");
+
+ simulateItemDrag(widget, document.getElementById("nav-bar").customizationTarget);
+ is(widget.getAttribute("context"), "", "Should not have own context menu when back in toolbar because we're still customizing.");
+ is(widget.getAttribute("wrapped-context"), expectedContext, "Should keep own context menu wrapped now that we're back in the toolbar.");
+
+ yield endCustomizing();
+ is(widget.getAttribute("context"), expectedContext, "Should have context menu again now that we're out of customize mode.");
+ CustomizableUI.removeWidgetFromArea(widgetId);
+ widget.remove();
+ ok(CustomizableUI.inDefaultState, "Should be in default state after removing button.");
+});