summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_contextMenus_checkboxes.js
blob: a471ae7e587f772eaab06fdd13c14f1f463de981 (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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";

add_task(async function () {
  let tab1 = await BrowserTestUtils.openNewForegroundTab(
    gBrowser,
    "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context.html"
  );

  gBrowser.selectedTab = tab1;

  let extension = ExtensionTestUtils.loadExtension({
    manifest: {
      permissions: ["contextMenus"],
    },

    background: function () {
      // Report onClickData info back.
      browser.contextMenus.onClicked.addListener(info => {
        browser.test.sendMessage("contextmenus-click", info);
      });

      browser.contextMenus.create({
        title: "Checkbox",
        type: "checkbox",
      });

      browser.test.sendMessage("single-contextmenu-item-added");

      browser.test.onMessage.addListener(msg => {
        if (msg !== "add-additional-menu-items") {
          return;
        }

        browser.contextMenus.create({
          type: "separator",
        });

        browser.contextMenus.create({
          title: "Checkbox",
          type: "checkbox",
          checked: true,
        });

        browser.contextMenus.create({
          title: "Checkbox",
          type: "checkbox",
        });

        browser.test.notifyPass("contextmenus-checkboxes");
      });
    },
  });

  await extension.startup();

  await extension.awaitMessage("single-contextmenu-item-added");

  async function testSingleCheckboxItem() {
    let extensionMenuRoot = await openExtensionContextMenu();

    // On Linux, the single menu item should be contained in a submenu.
    if (AppConstants.platform === "linux") {
      let items = extensionMenuRoot.getElementsByAttribute("type", "checkbox");
      is(items.length, 1, "single checkbox should be in the submenu on Linux");
      await closeContextMenu();
    } else {
      is(
        extensionMenuRoot,
        null,
        "there should be no submenu for a single checkbox item"
      );
      await closeContextMenu();
    }
  }

  await testSingleCheckboxItem();

  extension.sendMessage("add-additional-menu-items");
  await extension.awaitFinish("contextmenus-checkboxes");

  function confirmCheckboxStates(extensionMenuRoot, expectedStates) {
    let checkboxItems = extensionMenuRoot.getElementsByAttribute(
      "type",
      "checkbox"
    );

    is(
      checkboxItems.length,
      3,
      "there should be 3 checkbox items in the context menu"
    );

    is(
      checkboxItems[0].hasAttribute("checked"),
      expectedStates[0],
      `checkbox item 1 has state (checked=${expectedStates[0]})`
    );
    is(
      checkboxItems[1].hasAttribute("checked"),
      expectedStates[1],
      `checkbox item 2 has state (checked=${expectedStates[1]})`
    );
    is(
      checkboxItems[2].hasAttribute("checked"),
      expectedStates[2],
      `checkbox item 3 has state (checked=${expectedStates[2]})`
    );

    return extensionMenuRoot.getElementsByAttribute("type", "checkbox");
  }

  function confirmOnClickData(onClickData, id, was, checked) {
    is(
      onClickData.wasChecked,
      was,
      `checkbox item ${id} was ${was ? "" : "not "}checked before the click`
    );
    is(
      onClickData.checked,
      checked,
      `checkbox item ${id} is ${checked ? "" : "not "}checked after the click`
    );
  }

  let extensionMenuRoot = await openExtensionContextMenu();
  let items = confirmCheckboxStates(extensionMenuRoot, [false, true, false]);
  await closeExtensionContextMenu(items[0]);

  let result = await extension.awaitMessage("contextmenus-click");
  confirmOnClickData(result, 1, false, true);

  extensionMenuRoot = await openExtensionContextMenu();
  items = confirmCheckboxStates(extensionMenuRoot, [true, true, false]);
  await closeExtensionContextMenu(items[2]);

  result = await extension.awaitMessage("contextmenus-click");
  confirmOnClickData(result, 3, false, true);

  extensionMenuRoot = await openExtensionContextMenu();
  items = confirmCheckboxStates(extensionMenuRoot, [true, true, true]);
  await closeExtensionContextMenu(items[0]);

  result = await extension.awaitMessage("contextmenus-click");
  confirmOnClickData(result, 1, true, false);

  extensionMenuRoot = await openExtensionContextMenu();
  items = confirmCheckboxStates(extensionMenuRoot, [false, true, true]);
  await closeExtensionContextMenu(items[2]);

  result = await extension.awaitMessage("contextmenus-click");
  confirmOnClickData(result, 3, true, false);

  await extension.unload();
  BrowserTestUtils.removeTab(tab1);
});