Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* 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";
var button, menuButton;
/* Clicking a button should close the panel */
add_task(async function plain_button() {
button = document.createXULElement("toolbarbutton");
button.id = "browser_940307_button";
button.setAttribute("label", "Button");
gNavToolbox.palette.appendChild(button);
CustomizableUI.addWidgetToArea(
button.id,
CustomizableUI.AREA_FIXED_OVERFLOW_PANEL
);
await waitForOverflowButtonShown();
await document.getElementById("nav-bar").overflowable.show();
let hiddenAgain = promiseOverflowHidden(window);
EventUtils.synthesizeMouseAtCenter(button, {});
await hiddenAgain;
CustomizableUI.removeWidgetFromArea(button.id);
button.remove();
});
add_task(async function searchbar_in_panel() {
CustomizableUI.addWidgetToArea(
"search-container",
CustomizableUI.AREA_FIXED_OVERFLOW_PANEL
);
await waitForOverflowButtonShown();
await document.getElementById("nav-bar").overflowable.show();
let searchbar = document.getElementById("searchbar");
await TestUtils.waitForCondition(
() => "value" in searchbar && searchbar.value === ""
);
// Focusing a non-empty searchbox will cause us to open the
// autocomplete panel and search for suggestions, which would
// trigger network requests. Temporarily disable suggestions.
await SpecialPowers.pushPrefEnv({
set: [["browser.search.suggest.enabled", false]],
});
let dontShowPopup = e => e.preventDefault();
let searchbarPopup = searchbar.textbox.popup;
searchbarPopup.addEventListener("popupshowing", dontShowPopup);
searchbar.value = "foo";
searchbar.focus();
// Can't use promisePanelElementShown() here since the search bar
// creates its context menu lazily the first time it is opened.
let contextMenuShown = new Promise(resolve => {
let listener = event => {
if (searchbar._menupopup && event.target == searchbar._menupopup) {
window.removeEventListener("popupshown", listener);
resolve(searchbar._menupopup);
}
};
window.addEventListener("popupshown", listener);
});
EventUtils.synthesizeMouseAtCenter(searchbar, {
type: "contextmenu",
button: 2,
});
let contextmenu = await contextMenuShown;
ok(isOverflowOpen(), "Panel should still be open");
let selectAll = contextmenu.querySelector("[cmd='cmd_selectAll']");
let contextMenuHidden = promisePanelElementHidden(window, contextmenu);
contextmenu.activateItem(selectAll);
await contextMenuHidden;
ok(isOverflowOpen(), "Panel should still be open");
let hiddenPanelPromise = promiseOverflowHidden(window);
EventUtils.synthesizeKey("KEY_Escape");
await hiddenPanelPromise;
ok(!isOverflowOpen(), "Panel should no longer be open");
// Allow search bar popup to show again.
searchbarPopup.removeEventListener("popupshowing", dontShowPopup);
// We focused the search bar earlier - ensure we don't keep doing that.
gURLBar.select();
CustomizableUI.reset();
});
add_task(async function disabled_button_in_panel() {
button = document.createXULElement("toolbarbutton");
button.id = "browser_946166_button_disabled";
button.setAttribute("disabled", "true");
button.setAttribute("label", "Button");
gNavToolbox.palette.appendChild(button);
CustomizableUI.addWidgetToArea(
button.id,
CustomizableUI.AREA_FIXED_OVERFLOW_PANEL
);
await waitForOverflowButtonShown();
await document.getElementById("nav-bar").overflowable.show();
// We intentionally turn off a11y_checks, because the following click
// is targeting a disabled control to confirm the click event won't come through.
// It is not meant to be interactive and is not expected to be accessible:
AccessibilityUtils.setEnv({
mustBeEnabled: false,
});
EventUtils.synthesizeMouseAtCenter(button, {});
AccessibilityUtils.resetEnv();
is(PanelUI.overflowPanel.state, "open", "Popup stays open");
button.removeAttribute("disabled");
let hiddenAgain = promiseOverflowHidden(window);
EventUtils.synthesizeMouseAtCenter(button, {});
await hiddenAgain;
button.remove();
});
registerCleanupFunction(async function () {
if (button && button.parentNode) {
button.remove();
}
if (menuButton && menuButton.parentNode) {
menuButton.remove();
}
if (isOverflowOpen()) {
let panelHiddenPromise = promiseOverflowHidden(window);
PanelUI.overflowPanel.hidePopup();
await panelHiddenPromise;
}
CustomizableUI.reset();
});