/* Any copyright is dedicated to the Public Domain.
 * https://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

add_task(async function testPopup() {
  let bookmark = await PlacesUtils.bookmarks.insert({
    parentGuid: PlacesUtils.bookmarks.toolbarGuid,
    url: "http://example.com",
    title: "firefox",
  });
  registerCleanupFunction(async () => {
    await PlacesUtils.bookmarks.remove(bookmark);
    Services.prefs.clearUserPref("browser.toolbars.bookmarks.visibility");
  });

  for (let state of ["always", "newtab"]) {
    info(`Testing with state set to '${state}'`);
    await SpecialPowers.pushPrefEnv({
      set: [["browser.toolbars.bookmarks.visibility", state]],
    });

    let newtab = await BrowserTestUtils.openNewForegroundTab({
      gBrowser,
      opening: "about:newtab",
      waitForLoad: false,
    });

    let bookmarksToolbar = document.getElementById("PersonalToolbar");
    await TestUtils.waitForCondition(
      () => !bookmarksToolbar.collapsed,
      "Wait for toolbar to become visible"
    );
    ok(!bookmarksToolbar.collapsed, "Bookmarks toolbar should be visible");

    // 1. Right-click on a bookmark and check that the submenu is visible
    let bookmarkItem = bookmarksToolbar.querySelector(
      `.bookmark-item[label="firefox"]`
    );
    ok(bookmarkItem, "Got bookmark");
    let contextMenu = document.getElementById("placesContext");
    let popup = await openContextMenu(contextMenu, bookmarkItem);
    ok(
      !popup.target.querySelector("#toggle_PersonalToolbar").hidden,
      "Bookmarks toolbar submenu should appear on a .bookmark-item"
    );
    contextMenu.hidePopup();

    // 2. Right-click on the empty area and check that the submenu is visible
    popup = await openContextMenu(contextMenu, bookmarksToolbar);
    ok(
      !popup.target.querySelector("#toggle_PersonalToolbar").hidden,
      "Bookmarks toolbar submenu should appear on the empty part of the toolbar"
    );

    let bookmarksToolbarMenu = document.querySelector(
      "#toggle_PersonalToolbar"
    );
    let subMenu = bookmarksToolbarMenu.querySelector("menupopup");
    bookmarksToolbarMenu.openMenu(true);
    await BrowserTestUtils.waitForPopupEvent(subMenu, "shown");
    let menuitems = subMenu.querySelectorAll("menuitem");
    for (let menuitem of menuitems) {
      let expected = menuitem.dataset.visibilityEnum == state;
      is(
        menuitem.getAttribute("checked"),
        expected.toString(),
        `The corresponding menuitem, ${menuitem.dataset.visibilityEnum}, ${
          expected ? "should" : "shouldn't"
        } be checked if state=${state}`
      );
    }

    contextMenu.hidePopup();

    BrowserTestUtils.removeTab(newtab);
  }
});

function openContextMenu(contextMenu, target) {
  let popupPromise = BrowserTestUtils.waitForPopupEvent(contextMenu, "shown");
  EventUtils.synthesizeMouseAtCenter(target, {
    type: "contextmenu",
    button: 2,
  });
  return popupPromise;
}
