summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_tabs_onHighlighted.js
blob: a614dc6144581cfaf11b54cf9f27fb33396bb933 (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
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
/* eslint-disable mozilla/no-arbitrary-setTimeout */
"use strict";

add_task(async function test_onHighlighted() {
  let extension = ExtensionTestUtils.loadExtension({
    manifest: {
      permissions: ["tabs"],
    },

    background: async function () {
      async function expectHighlighted(fn, action) {
        let resolve;
        let promise = new Promise(r => {
          resolve = r;
        });
        let expected;
        let events = [];
        let listener = highlightInfo => {
          events.push(highlightInfo);
          if (expected && expected.length >= events.length) {
            resolve();
          }
        };
        browser.tabs.onHighlighted.addListener(listener);
        expected = (await fn()) || [];
        if (events.length < expected.length) {
          await promise;
        }
        let unexpected = events.splice(expected.length);
        browser.test.assertEq(
          JSON.stringify(expected),
          JSON.stringify(events),
          `Should get ${expected.length} expected onHighlighted events when ${action}`
        );
        if (unexpected.length) {
          browser.test.fail(
            `${unexpected.length} unexpected onHighlighted events when ${action}: ` +
              JSON.stringify(unexpected)
          );
        }
        browser.tabs.onHighlighted.removeListener(listener);
      }

      let [{ id, windowId }] = await browser.tabs.query({
        active: true,
        currentWindow: true,
      });
      let windows = [windowId];
      let tabs = [id];

      await expectHighlighted(async () => {
        let tab = await browser.tabs.create({
          active: true,
          url: "about:blank?1",
        });
        tabs.push(tab.id);
        return [{ tabIds: [tabs[1]], windowId: windows[0] }];
      }, "creating a new active tab");

      await expectHighlighted(async () => {
        await browser.tabs.update(tabs[0], { active: true });
        return [{ tabIds: [tabs[0]], windowId: windows[0] }];
      }, "selecting former tab");

      await expectHighlighted(async () => {
        await browser.tabs.highlight({ tabs: [0, 1] });
        return [{ tabIds: [tabs[0], tabs[1]], windowId: windows[0] }];
      }, "highlighting both tabs");

      await expectHighlighted(async () => {
        await browser.tabs.highlight({ tabs: [1, 0] });
        return [{ tabIds: [tabs[0], tabs[1]], windowId: windows[0] }];
      }, "highlighting same tabs but changing selected one");

      await expectHighlighted(async () => {
        let tab = await browser.tabs.create({
          active: false,
          url: "about:blank?2",
        });
        tabs.push(tab.id);
      }, "create a new inactive tab");

      await expectHighlighted(async () => {
        await browser.tabs.highlight({ tabs: [2, 0, 1] });
        return [{ tabIds: [tabs[0], tabs[1], tabs[2]], windowId: windows[0] }];
      }, "highlighting all tabs");

      await expectHighlighted(async () => {
        await browser.tabs.move(tabs[1], { index: 0 });
      }, "reordering tabs");

      await expectHighlighted(async () => {
        await browser.tabs.highlight({ tabs: [0] });
        return [{ tabIds: [tabs[1]], windowId: windows[0] }];
      }, "highlighting moved tab");

      await expectHighlighted(async () => {
        await browser.tabs.highlight({ tabs: [0] });
      }, "highlighting again");

      await expectHighlighted(async () => {
        await browser.tabs.highlight({ tabs: [2, 1, 0] });
        return [{ tabIds: [tabs[1], tabs[0], tabs[2]], windowId: windows[0] }];
      }, "highlighting all tabs");

      await expectHighlighted(async () => {
        await browser.tabs.highlight({ tabs: [2, 0, 1] });
      }, "highlighting same tabs with different order");

      await expectHighlighted(async () => {
        let window = await browser.windows.create({ tabId: tabs[2] });
        windows.push(window.id);
        // Bug 1481185: on Chrome it's [tabs[1], tabs[0]] instead of [tabs[0]]
        return [
          { tabIds: [tabs[0]], windowId: windows[0] },
          { tabIds: [tabs[2]], windowId: windows[1] },
        ];
      }, "moving selected tab into a new window");

      await browser.tabs.remove(tabs.slice(1));
      browser.test.notifyPass("test-finished");
    },
  });

  await extension.startup();
  await extension.awaitFinish("test-finished");
  await extension.unload();
});