fune/browser/components/customizableui/test/browser_customization_context_menus.js
Sam Foster a3004a21be Bug 1819675 - rename SessionStore.getClosedTabCount and getClosedTabData to getClosedTabCountForWindow and getClosedTabDataForWindow. r=dao,fxview-reviewers,kcochrane
- As closed tabs will change to mean closed tabs from all windows, rename these functions to make
  changes in later patches clearer when we mean closed tabs from this window specifically, or closed
  tabs for all private/non-private windows

Differential Revision: https://phabricator.services.mozilla.com/D177849
2023-05-30 18:54:12 +00:00

633 lines
20 KiB
JavaScript

/* 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";
const overflowButton = document.getElementById("nav-bar-overflow-button");
const overflowPanel = document.getElementById("widget-overflow");
// Right-click on the stop/reload button should
// show a context menu with options to move it.
add_task(async function home_button_context() {
let contextMenu = document.getElementById("toolbar-context-menu");
let shownPromise = popupShown(contextMenu);
let stopReloadButton = document.getElementById("stop-reload-button");
EventUtils.synthesizeMouse(stopReloadButton, 2, 2, {
type: "contextmenu",
button: 2,
});
await 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();
await 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(async function tabstrip_context() {
// ensure there are tabs to reload/bookmark:
let extraTab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
"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,
});
await shownPromise;
let closedTabsAvailable =
SessionStore.getClosedTabCountForWindow(window) == 0;
info("Closed tabs: " + closedTabsAvailable);
let expectedEntries = [
["#toolbar-context-openANewTab", true],
["---"],
["#toolbar-context-reloadSelectedTab", true],
["#toolbar-context-bookmarkSelectedTab", true],
["#toolbar-context-selectAllTabs", 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();
await hiddenPromise;
BrowserTestUtils.removeTab(extraTab);
});
// Right-click on the title bar spacer before the tabstrip should show a
// context menu without options to move it and no tab-specific options.
add_task(async function titlebar_spacer_context() {
if (!TabsInTitlebar.enabled) {
info("Skipping test that requires tabs in the title bar.");
return;
}
let contextMenu = document.getElementById("toolbar-context-menu");
let shownPromise = popupShown(contextMenu);
let spacer = document.querySelector(
"#TabsToolbar .titlebar-spacer[type='pre-tabs']"
);
EventUtils.synthesizeMouseAtCenter(spacer, {
type: "contextmenu",
button: 2,
});
await 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();
await hiddenPromise;
});
// 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(async function empty_toolbar_context() {
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,
});
await 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();
await hiddenPromise;
removeCustomToolbars();
});
// Right-click on the urlbar-container should
// show a context menu with disabled options to move it.
add_task(async function urlbar_context() {
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,
});
await 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();
await hiddenPromise;
});
// Right-click on the searchbar and moving it to the menu
// and back should move the search-container instead.
add_task(async function searchbar_context_move_to_panel_and_back() {
// This is specifically testing the addToPanel function for the search bar, so
// we have to move it to its correct position in the navigation toolbar first.
// The preference will be restored when the customizations are reset later.
Services.prefs.setBoolPref("browser.search.widget.inNavBar", true);
let searchbar = document.getElementById("searchbar");
// This fails if the screen resolution is small and the search bar overflows
// from the nav bar.
await gCustomizeMode.addToPanel(searchbar);
let placement = CustomizableUI.getPlacementOfWidget("search-container");
is(
placement.area,
CustomizableUI.AREA_FIXED_OVERFLOW_PANEL,
"Should be in panel"
);
await waitForOverflowButtonShown();
let shownPanelPromise = popupShown(overflowPanel);
overflowButton.click();
await shownPanelPromise;
let hiddenPanelPromise = popupHidden(overflowPanel);
overflowPanel.hidePopup();
await hiddenPanelPromise;
gCustomizeMode.addToToolbar(searchbar);
placement = CustomizableUI.getPlacementOfWidget("search-container");
is(placement.area, CustomizableUI.AREA_NAVBAR, "Should be in navbar");
await gCustomizeMode.removeFromArea(searchbar);
placement = CustomizableUI.getPlacementOfWidget("search-container");
is(placement, null, "Should be in palette");
CustomizableUI.reset();
placement = CustomizableUI.getPlacementOfWidget("search-container");
is(placement, null, "Should be in palette");
});
// Right-click on an item within the panel should
// show a context menu with options to move it.
add_task(async function context_within_panel() {
CustomizableUI.addWidgetToArea(
"new-window-button",
CustomizableUI.AREA_FIXED_OVERFLOW_PANEL
);
await waitForOverflowButtonShown();
let shownPanelPromise = popupShown(overflowPanel);
overflowButton.click();
await 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,
});
await shownContextPromise;
is(overflowPanel.state, "open", "The overflow panel 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();
await hiddenContextPromise;
let hiddenPromise = popupHidden(overflowPanel);
overflowPanel.hidePopup();
await hiddenPromise;
CustomizableUI.removeWidgetFromArea("new-window-button");
});
// Right-click on the stop/reload button while in customization mode
// should show a context menu with options to move it.
add_task(async function context_home_button_in_customize_mode() {
await startCustomizing();
let contextMenu = document.getElementById("toolbar-context-menu");
let shownPromise = popupShown(contextMenu);
let stopReloadButton = document.getElementById("wrapper-stop-reload-button");
EventUtils.synthesizeMouse(stopReloadButton, 2, 2, {
type: "contextmenu",
button: 2,
});
await 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();
await hiddenContextPromise;
});
// Right-click on an item in the palette should
// show a context menu with options to move it.
add_task(async function context_click_in_palette() {
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,
});
await shownPromise;
let expectedEntries = [
[".customize-context-addToToolbar", true],
[".customize-context-addToPanel", true],
];
checkContextMenu(contextMenu, expectedEntries);
let hiddenContextPromise = popupHidden(contextMenu);
contextMenu.hidePopup();
await 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(async function context_click_in_customize_mode() {
CustomizableUI.addWidgetToArea(
"new-window-button",
CustomizableUI.AREA_FIXED_OVERFLOW_PANEL
);
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,
});
await shownPromise;
let expectedEntries = [
[".customize-context-moveToToolbar", true],
[".customize-context-removeFromPanel", true],
["---"],
[".viewCustomizeToolbar", false],
];
checkContextMenu(contextMenu, expectedEntries);
let hiddenContextPromise = popupHidden(contextMenu);
contextMenu.hidePopup();
await hiddenContextPromise;
CustomizableUI.removeWidgetFromArea("new-window-button");
await endCustomizing();
});
// Test the toolbarbutton panel context menu in customization mode
// without opening the panel before customization mode
add_task(async function context_click_customize_mode_panel_not_opened() {
CustomizableUI.addWidgetToArea(
"new-window-button",
CustomizableUI.AREA_FIXED_OVERFLOW_PANEL
);
this.otherWin = await openAndLoadWindow(null, true);
await new Promise(resolve => waitForFocus(resolve, this.otherWin));
await 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
);
await shownPromise;
let expectedEntries = [
[".customize-context-moveToToolbar", true],
[".customize-context-removeFromPanel", true],
["---"],
[".viewCustomizeToolbar", false],
];
checkContextMenu(contextMenu, expectedEntries, this.otherWin);
let hiddenContextPromise = popupHidden(contextMenu);
contextMenu.hidePopup();
await hiddenContextPromise;
await endCustomizing(this.otherWin);
CustomizableUI.removeWidgetFromArea("new-window-button");
await promiseWindowClosed(this.otherWin);
this.otherWin = null;
await new Promise(resolve => waitForFocus(resolve, window));
});
// Bug 945191 - Combined buttons show wrong context menu options
// when they are in the toolbar.
add_task(async function context_combined_buttons_toolbar() {
CustomizableUI.addWidgetToArea(
"zoom-controls",
CustomizableUI.AREA_FIXED_OVERFLOW_PANEL
);
await 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,
});
await shownPromise;
// Execute the command to move the item from the panel to the toolbar.
let moveToToolbar = contextMenu.querySelector(
".customize-context-moveToToolbar"
);
moveToToolbar.doCommand();
let hiddenPromise = popupHidden(contextMenu);
contextMenu.hidePopup();
await hiddenPromise;
await 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,
});
await 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();
await hiddenPromise;
await resetCustomization();
});
// Bug 947586 - After customization, panel items show wrong context menu options
add_task(async function context_after_customization_panel() {
info("Check panel context menu is correct after customization");
await startCustomizing();
await endCustomizing();
CustomizableUI.addWidgetToArea(
"new-window-button",
CustomizableUI.AREA_FIXED_OVERFLOW_PANEL
);
let shownPanelPromise = popupShown(overflowPanel);
overflowButton.click();
await 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,
});
await shownContextPromise;
is(overflowPanel.state, "open", "The panel 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();
await hiddenContextPromise;
let hiddenPromise = popupHidden(overflowPanel);
overflowPanel.hidePopup();
await hiddenPromise;
CustomizableUI.removeWidgetFromArea("new-window-button");
});
// Bug 982027 - moving icon around removes custom context menu.
add_task(async function custom_context_menus() {
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."
);
await 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 = document.getElementById("widget-overflow-fixed-list");
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,
CustomizableUI.getCustomizationTarget(document.getElementById("nav-bar"))
);
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."
);
await 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."
);
});
// Bug 1690575 - 'pin to overflow menu' and 'remove from toolbar' should be hidden
// for flexible spaces
add_task(async function flexible_space_context_menu() {
CustomizableUI.addWidgetToArea("spring", "nav-bar");
let springs = document.querySelectorAll("#nav-bar toolbarspring");
let lastSpring = springs[springs.length - 1];
ok(lastSpring, "we added a spring");
let contextMenu = document.getElementById("toolbar-context-menu");
let shownPromise = popupShown(contextMenu);
EventUtils.synthesizeMouse(lastSpring, 2, 2, {
type: "contextmenu",
button: 2,
});
await shownPromise;
let expectedEntries = [
["#toggle_PersonalToolbar", true],
["---"],
[".viewCustomizeToolbar", true],
];
if (!isOSX) {
expectedEntries.unshift(["#toggle_toolbar-menubar", true]);
}
checkContextMenu(contextMenu, expectedEntries);
contextMenu.hidePopup();
gCustomizeMode.removeFromArea(lastSpring);
ok(!lastSpring.parentNode, "Spring should have been removed successfully.");
});