/* 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";

/**
 *  Test removing bookmarks from the Bookmarks Toolbar and Library.
 */

const TEST_URL = "about:mozilla";

add_setup(async function () {
  await PlacesUtils.bookmarks.eraseEverything();

  let toolbar = document.getElementById("PersonalToolbar");
  let wasCollapsed = toolbar.collapsed;

  // Uncollapse the personal toolbar if needed.
  if (wasCollapsed) {
    await promiseSetToolbarVisibility(toolbar, true);
  }

  registerCleanupFunction(async () => {
    // Collapse the personal toolbar if needed.
    if (wasCollapsed) {
      await promiseSetToolbarVisibility(toolbar, false);
    }
    await PlacesUtils.bookmarks.eraseEverything();
  });
});

add_task(async function test_remove_bookmark_from_toolbar() {
  let toolbarBookmark = await PlacesUtils.bookmarks.insert({
    parentGuid: PlacesUtils.bookmarks.toolbarGuid,
    title: "Bookmark Title",
    url: TEST_URL,
  });

  let toolbarNode = getToolbarNodeForItemGuid(toolbarBookmark.guid);

  let contextMenu = document.getElementById("placesContext");
  let popupShownPromise = BrowserTestUtils.waitForEvent(
    contextMenu,
    "popupshown"
  );

  EventUtils.synthesizeMouseAtCenter(toolbarNode, {
    button: 2,
    type: "contextmenu",
  });
  await popupShownPromise;

  let contextMenuDeleteBookmark = document.getElementById(
    "placesContext_deleteBookmark"
  );

  let removePromise = PlacesTestUtils.waitForNotification(
    "bookmark-removed",
    events => events.some(event => event.url == TEST_URL)
  );

  contextMenu.activateItem(contextMenuDeleteBookmark, {});

  await removePromise;

  Assert.deepEqual(
    PlacesUtils.bookmarks.fetch({ url: TEST_URL }),
    {},
    "Should have removed the bookmark from the database"
  );
});

add_task(async function test_remove_bookmark_from_library() {
  const uris = [
    "http://example.com/1",
    "http://example.com/2",
    "http://example.com/3",
  ];

  let children = uris.map((uri, index) => {
    return {
      title: `bm${index}`,
      url: uri,
    };
  });

  // Insert bookmarks.
  await PlacesUtils.bookmarks.insertTree({
    guid: PlacesUtils.bookmarks.unfiledGuid,
    children,
  });

  // Open the Library and select the "UnfiledBookmarks".
  let library = await promiseLibrary("UnfiledBookmarks");

  registerCleanupFunction(async function () {
    await promiseLibraryClosed(library);
  });

  let PO = library.PlacesOrganizer;

  Assert.equal(
    PlacesUtils.getConcreteItemGuid(PO._places.selectedNode),
    PlacesUtils.bookmarks.unfiledGuid,
    "Should have selected unfiled bookmarks."
  );

  let contextMenu = library.document.getElementById("placesContext");
  let contextMenuDeleteBookmark = library.document.getElementById(
    "placesContext_deleteBookmark"
  );

  let popupShownPromise = BrowserTestUtils.waitForEvent(
    contextMenu,
    "popupshown"
  );

  let firstColumn = library.ContentTree.view.columns[0];
  let firstBookmarkRect = library.ContentTree.view.getCoordsForCellItem(
    0,
    firstColumn,
    "bm0"
  );

  EventUtils.synthesizeMouse(
    library.ContentTree.view.body,
    firstBookmarkRect.x,
    firstBookmarkRect.y,
    { type: "contextmenu", button: 2 },
    library
  );

  await popupShownPromise;

  Assert.equal(
    library.ContentTree.view.result.root.childCount,
    3,
    "Number of bookmarks before removal is right"
  );

  let removePromise = PlacesTestUtils.waitForNotification(
    "bookmark-removed",
    events => events.some(event => event.url == uris[0])
  );
  contextMenu.activateItem(contextMenuDeleteBookmark, {});

  await removePromise;

  Assert.equal(
    library.ContentTree.view.result.root.childCount,
    2,
    "Should have removed the bookmark from the display"
  );
});
