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

/**
 * Test PlacesUIUtils.maybeToggleBookmarkToolbarVisibility() code running for new profiles.
 * Ensure that the bookmarks toolbar is hidden in a default configuration.
 * If new default bookmarks are added to the toolbar then the threshold of > 3
 * in NUM_TOOLBAR_BOOKMARKS_TO_UNHIDE may need to be adjusted there.
 */

add_setup(async function () {
  registerCleanupFunction(() => {
    Services.prefs.clearUserPref("browser.toolbars.bookmarks.visibility");
  });
});

add_task(async function test_default_bookmark_toolbar_visibility() {
  // The Bookmarks Toolbar visibility state should be set only after
  // Places has notified that it's done initializing.
  const browserGlue = Cc["@mozilla.org/browser/browserglue;1"].getService(
    Ci.nsIObserver
  );

  let placesInitCompleteObserved = TestUtils.topicObserved(
    "places-browser-init-complete"
  );

  // If places-browser-init-complete has already notified, this will cause it
  // to notify again. Otherwise, we wait until the notify is done.
  browserGlue.observe(
    null,
    "browser-glue-test",
    "places-browser-init-complete"
  );

  await placesInitCompleteObserved;

  const BROWSER_DOCURL = AppConstants.BROWSER_CHROME_URL;
  let xulStore = Services.xulStore;

  is(
    xulStore.getValue(BROWSER_DOCURL, "PersonalToolbar", "collapsed"),
    "",
    "Check that @collapsed isn't persisted"
  );
  ok(
    document.getElementById("PersonalToolbar").collapsed,
    "The bookmarks toolbar should be collapsed by default"
  );
});

/**
 * Ensure that the bookmarks toolbar is visible in a new profile
 * if the toolbar has > 3 (NUM_TOOLBAR_BOOKMARKS_TO_UNHIDE) bookmarks.
 */
add_task(async function test_bookmark_toolbar_visible_when_populated() {
  const { Bookmarks } = ChromeUtils.importESModule(
    "resource://gre/modules/Bookmarks.sys.mjs"
  );
  const { PlacesUIUtils } = ChromeUtils.importESModule(
    "resource:///modules/PlacesUIUtils.sys.mjs"
  );

  let bookmark = {
    type: Bookmarks.TYPE_BOOKMARK,
    parentGuid: Bookmarks.toolbarGuid,
  };
  let bookmarksInserted = await Promise.all([
    Bookmarks.insert(Object.assign({ url: "https://example.com/1" }, bookmark)),
    Bookmarks.insert(Object.assign({ url: "https://example.com/2" }, bookmark)),
    Bookmarks.insert(Object.assign({ url: "https://example.com/3" }, bookmark)),
    Bookmarks.insert(Object.assign({ url: "https://example.com/4" }, bookmark)),
    Bookmarks.insert(Object.assign({ url: "https://example.com/5" }, bookmark)),
    Bookmarks.insert(Object.assign({ url: "https://example.com/6" }, bookmark)),
  ]);

  await PlacesUIUtils.maybeToggleBookmarkToolbarVisibility();

  const personalToolbar = document.getElementById("PersonalToolbar");
  ok(
    !personalToolbar.collapsed,
    "The bookmarks toolbar should be visible since it has many bookmarks"
  );

  for (let insertedBookmark of bookmarksInserted) {
    await Bookmarks.remove(insertedBookmark.guid);
  }
  personalToolbar.collapsed = true;
});
