/* 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();
});
