summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_sidebarAction.js
blob: e943b708cb4114d5943c68b2cbb1f0ed98fe739c (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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";

requestLongerTimeout(2);

let extData = {
  manifest: {
    sidebar_action: {
      default_panel: "sidebar.html",
    },
  },
  useAddonManager: "temporary",

  files: {
    "sidebar.html": `
      <!DOCTYPE html>
      <html>
      <head><meta charset="utf-8"/>
      <script src="sidebar.js"></script>
      </head>
      <body>
      A Test Sidebar
      </body></html>
    `,

    "sidebar.js": function () {
      window.onload = () => {
        browser.test.sendMessage("sidebar");
      };
    },
  },

  background: function () {
    browser.test.onMessage.addListener(async ({ msg, data }) => {
      if (msg === "set-panel") {
        await browser.sidebarAction.setPanel({ panel: null });
        browser.test.assertEq(
          await browser.sidebarAction.getPanel({}),
          browser.runtime.getURL("sidebar.html"),
          "Global panel can be reverted to the default."
        );
      } else if (msg === "isOpen") {
        let { arg = {}, result } = data;
        let isOpen = await browser.sidebarAction.isOpen(arg);
        browser.test.assertEq(result, isOpen, "expected value from isOpen");
      }
      browser.test.sendMessage("done");
    });
  },
};

function getExtData(manifestUpdates = {}) {
  return {
    ...extData,
    manifest: {
      ...extData.manifest,
      ...manifestUpdates,
    },
  };
}

async function sendMessage(ext, msg, data = undefined) {
  ext.sendMessage({ msg, data });
  await ext.awaitMessage("done");
}

add_task(async function sidebar_initial_install() {
  ok(
    document.getElementById("sidebar-box").hidden,
    "sidebar box is not visible"
  );
  let extension = ExtensionTestUtils.loadExtension(getExtData());
  await extension.startup();
  await extension.awaitMessage("sidebar");

  // Test sidebar is opened on install
  ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible");

  await extension.unload();
  // Test that the sidebar was closed on unload.
  ok(
    document.getElementById("sidebar-box").hidden,
    "sidebar box is not visible"
  );
});

add_task(async function sidebar__install_closed() {
  ok(
    document.getElementById("sidebar-box").hidden,
    "sidebar box is not visible"
  );
  let tempExtData = getExtData();
  tempExtData.manifest.sidebar_action.open_at_install = false;
  let extension = ExtensionTestUtils.loadExtension(tempExtData);
  await extension.startup();

  // Test sidebar is closed on install
  ok(document.getElementById("sidebar-box").hidden, "sidebar box is hidden");

  await extension.unload();
  // This is the default value
  tempExtData.manifest.sidebar_action.open_at_install = true;
});

add_task(async function sidebar_two_sidebar_addons() {
  let extension2 = ExtensionTestUtils.loadExtension(getExtData());
  await extension2.startup();
  // Test sidebar is opened on install
  await extension2.awaitMessage("sidebar");
  ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible");

  // Test second sidebar install opens new sidebar
  let extension3 = ExtensionTestUtils.loadExtension(getExtData());
  await extension3.startup();
  // Test sidebar is opened on install
  await extension3.awaitMessage("sidebar");
  ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible");
  await extension3.unload();

  // We just close the sidebar on uninstall of the current sidebar.
  ok(
    document.getElementById("sidebar-box").hidden,
    "sidebar box is not visible"
  );

  await extension2.unload();
});

add_task(async function sidebar_empty_panel() {
  let extension = ExtensionTestUtils.loadExtension(getExtData());
  await extension.startup();
  // Test sidebar is opened on install
  await extension.awaitMessage("sidebar");
  ok(
    !document.getElementById("sidebar-box").hidden,
    "sidebar box is visible in first window"
  );
  await sendMessage(extension, "set-panel");
  await extension.unload();
});

add_task(async function sidebar_isOpen() {
  info("Load extension1");
  let extension1 = ExtensionTestUtils.loadExtension(getExtData());
  await extension1.startup();

  info("Test extension1's sidebar is opened on install");
  await extension1.awaitMessage("sidebar");
  await sendMessage(extension1, "isOpen", { result: true });
  let sidebar1ID = SidebarUI.currentID;

  info("Load extension2");
  let extension2 = ExtensionTestUtils.loadExtension(getExtData());
  await extension2.startup();

  info("Test extension2's sidebar is opened on install");
  await extension2.awaitMessage("sidebar");
  await sendMessage(extension1, "isOpen", { result: false });
  await sendMessage(extension2, "isOpen", { result: true });

  info("Switch back to extension1's sidebar");
  SidebarUI.show(sidebar1ID);
  await extension1.awaitMessage("sidebar");
  await sendMessage(extension1, "isOpen", { result: true });
  await sendMessage(extension2, "isOpen", { result: false });

  info("Test passing a windowId parameter");
  let windowId = window.docShell.outerWindowID;
  let WINDOW_ID_CURRENT = -2;
  await sendMessage(extension1, "isOpen", { arg: { windowId }, result: true });
  await sendMessage(extension2, "isOpen", { arg: { windowId }, result: false });
  await sendMessage(extension1, "isOpen", {
    arg: { windowId: WINDOW_ID_CURRENT },
    result: true,
  });
  await sendMessage(extension2, "isOpen", {
    arg: { windowId: WINDOW_ID_CURRENT },
    result: false,
  });

  info("Open a new window");
  open("", "", "noopener");
  let newWin = Services.wm.getMostRecentWindow("navigator:browser");

  info("The new window has no sidebar");
  await sendMessage(extension1, "isOpen", { result: false });
  await sendMessage(extension2, "isOpen", { result: false });

  info("But the original window still does");
  await sendMessage(extension1, "isOpen", { arg: { windowId }, result: true });
  await sendMessage(extension2, "isOpen", { arg: { windowId }, result: false });

  info("Close the new window");
  newWin.close();

  info("Close the sidebar in the original window");
  SidebarUI.hide();
  await sendMessage(extension1, "isOpen", { result: false });
  await sendMessage(extension2, "isOpen", { result: false });

  await extension1.unload();
  await extension2.unload();
});

add_task(async function testShortcuts() {
  function verifyShortcut(id, commandKey) {
    // We're just testing the command key since the modifiers have different
    // icons on different platforms.
    let button = document.getElementById(
      `button_${makeWidgetId(id)}-sidebar-action`
    );
    ok(button.hasAttribute("key"), "The menu item has a key specified");
    let key = document.getElementById(button.getAttribute("key"));
    ok(key, "The key attribute finds the related key element");
    ok(
      button.getAttribute("shortcut").endsWith(commandKey),
      "The shortcut has the right key"
    );
  }

  let extension1 = ExtensionTestUtils.loadExtension(
    getExtData({
      commands: {
        _execute_sidebar_action: {
          suggested_key: {
            default: "Ctrl+Shift+I",
          },
        },
      },
    })
  );
  let extension2 = ExtensionTestUtils.loadExtension(
    getExtData({
      commands: {
        _execute_sidebar_action: {
          suggested_key: {
            default: "Ctrl+Shift+E",
          },
        },
      },
    })
  );

  await extension1.startup();
  await extension1.awaitMessage("sidebar");

  // Open and close the switcher panel to trigger shortcut content rendering.
  let switcherPanelShown = promisePopupShown(SidebarUI._switcherPanel);
  SidebarUI.showSwitcherPanel();
  await switcherPanelShown;
  let switcherPanelHidden = promisePopupHidden(SidebarUI._switcherPanel);
  SidebarUI.hideSwitcherPanel();
  await switcherPanelHidden;

  // Test that the key is set for the extension after the shortcuts are rendered.
  verifyShortcut(extension1.id, "I");

  await extension2.startup();
  await extension2.awaitMessage("sidebar");

  // Once the switcher panel has been opened new shortcuts should be added
  // automatically.
  verifyShortcut(extension2.id, "E");

  await extension1.unload();
  await extension2.unload();
});