summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_contextMenus_bookmarks.js
blob: 1e95899513939dafeee94be51af6b4266cdbebff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";

Services.scriptloader.loadSubScript(
  "chrome://mochitests/content/browser/browser/components/places/tests/browser/head.js",
  this
);
/* globals withSidebarTree, synthesizeClickOnSelectedTreeCell, promiseLibrary, promiseLibraryClosed */

function bookmarkContextMenuExtension() {
  return ExtensionTestUtils.loadExtension({
    manifest: {
      permissions: ["contextMenus", "bookmarks"],
    },
    async background() {
      const CONTEXT_ENTRY_LABEL = "Test Context Entry ";

      browser.contextMenus.create(
        {
          title: CONTEXT_ENTRY_LABEL,
          contexts: ["bookmark"],
          onclick: (info, tab) => {
            browser.test.sendMessage(`clicked`, info.bookmarkId);
          },
        },
        () => {
          browser.test.assertEq(
            browser.runtime.lastError,
            null,
            "Created context menu"
          );
          browser.test.sendMessage("created", CONTEXT_ENTRY_LABEL);
        }
      );
    },
  });
}

add_task(async function test_bookmark_sidebar_contextmenu() {
  await withSidebarTree("bookmarks", async tree => {
    let extension = bookmarkContextMenuExtension();
    await extension.startup();
    let context_entry_label = await extension.awaitMessage("created");

    const expected_bookmarkID_2_virtualID = new Map([
      ["toolbar_____", "toolbar____v"], // Bookmarks Toolbar
      ["menu________", "menu_______v"], // Bookmarks Menu
      ["unfiled_____", "unfiled____v"], // Other Bookmarks
    ]);

    for (let [
      expectedBookmarkID,
      expectedVirtualID,
    ] of expected_bookmarkID_2_virtualID) {
      info(`Testing context menu for Bookmark ID "${expectedBookmarkID}"`);
      let sidebar = window.SidebarUI.browser;
      let menu = sidebar.contentDocument.getElementById("placesContext");
      tree.selectItems([expectedBookmarkID]);

      let min = {},
        max = {};
      tree.view.selection.getRangeAt(0, min, max);
      let node = tree.view.nodeForTreeIndex(min.value);
      const actualVirtualID = node.bookmarkGuid;
      Assert.equal(actualVirtualID, expectedVirtualID, "virtualIDs match");

      let shown = BrowserTestUtils.waitForEvent(menu, "popupshown");
      synthesizeClickOnSelectedTreeCell(tree, { type: "contextmenu" });
      await shown;

      let menuItem = menu.getElementsByAttribute(
        "label",
        context_entry_label
      )[0];
      closeChromeContextMenu("placesContext", menuItem, sidebar.contentWindow);

      const actualBookmarkID = await extension.awaitMessage(`clicked`);
      Assert.equal(actualBookmarkID, expectedBookmarkID, "bookmarkIDs match");
    }
    await extension.unload();
  });
});

add_task(async function test_bookmark_library_contextmenu() {
  let extension = bookmarkContextMenuExtension();
  await extension.startup();
  let context_entry_label = await extension.awaitMessage("created");

  let library = await promiseLibrary("BookmarksToolbar");
  let menu = library.document.getElementById("placesContext");
  let leftTree = library.document.getElementById("placesList");

  const treeIDs = [
    "allbms_____v",
    "history____v",
    "downloads__v",
    "tags_______v",
  ];

  for (let treeID of treeIDs) {
    info(`Testing context menu for TreeID "${treeID}"`);
    leftTree.selectItems([treeID]);

    let shown = BrowserTestUtils.waitForEvent(menu, "popupshown");
    synthesizeClickOnSelectedTreeCell(leftTree, { type: "contextmenu" });
    await shown;

    let items = menu.getElementsByAttribute("label", context_entry_label);
    Assert.equal(items.length, 0, "no extension context entry");
    closeChromeContextMenu("placesContext", null, library);
  }
  await extension.unload();
  await promiseLibraryClosed(library);
});