summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_tabs_hide_update.js
blob: 7fbf185704a8e289662db92bca802a9f2989276b (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
"use strict";

const { AddonTestUtils } = ChromeUtils.importESModule(
  "resource://testing-common/AddonTestUtils.sys.mjs"
);

AddonTestUtils.initMochitest(this);

const ID = "@test-tabs-addon";

async function updateExtension(ID, options) {
  let xpi = AddonTestUtils.createTempWebExtensionFile(options);
  await Promise.all([
    AddonTestUtils.promiseWebExtensionStartup(ID),
    AddonManager.installTemporaryAddon(xpi),
  ]);
}

async function disableExtension(ID) {
  let disabledPromise = awaitEvent("shutdown", ID);
  let addon = await AddonManager.getAddonByID(ID);
  await addon.disable();
  await disabledPromise;
}

function getExtension() {
  async function background() {
    let tabs = await browser.tabs.query({ url: "http://example.com/" });
    let testTab = tabs[0];

    browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
      if ("hidden" in changeInfo) {
        browser.test.assertEq(tabId, testTab.id, "correct tab was hidden");
        browser.test.assertTrue(changeInfo.hidden, "tab is hidden");
        browser.test.sendMessage("changeInfo");
      }
    });

    let hidden = await browser.tabs.hide(testTab.id);
    browser.test.assertEq(hidden[0], testTab.id, "tabs.hide hide the tab");
    tabs = await browser.tabs.query({ hidden: true });
    browser.test.assertEq(
      tabs[0].id,
      testTab.id,
      "tabs.query result was hidden"
    );
    browser.test.sendMessage("ready");
  }

  let extdata = {
    manifest: {
      version: "1.0",
      browser_specific_settings: {
        gecko: {
          id: ID,
        },
      },
      permissions: ["tabs", "tabHide"],
    },
    background,
    useAddonManager: "temporary",
  };
  return ExtensionTestUtils.loadExtension(extdata);
}

// Test our update handling.  Currently this means any hidden tabs will be
// shown when a tabHide extension is shutdown.  We additionally test the
// tabs.onUpdated listener gets called with hidden state changes.
add_task(async function test_tabs_update() {
  let tab = await BrowserTestUtils.openNewForegroundTab(
    gBrowser,
    "http://example.com/"
  );
  await BrowserTestUtils.switchTab(gBrowser, gBrowser.tabs[0]);

  const extension = getExtension();
  await extension.startup();

  // test onUpdated
  await Promise.all([
    extension.awaitMessage("ready"),
    extension.awaitMessage("changeInfo"),
  ]);
  Assert.ok(tab.hidden, "Tab is hidden by extension");

  // Test that update doesn't hide tabs when tabHide permission is present.
  let extdata = {
    manifest: {
      version: "2.0",
      browser_specific_settings: {
        gecko: {
          id: ID,
        },
      },
      permissions: ["tabs", "tabHide"],
    },
  };
  await updateExtension(ID, extdata);
  Assert.ok(tab.hidden, "Tab is hidden hidden after update");

  // Test that update does hide tabs when tabHide permission is removed.
  extdata.manifest = {
    version: "3.0",
    browser_specific_settings: {
      gecko: {
        id: ID,
      },
    },
    permissions: ["tabs"],
  };
  await updateExtension(ID, extdata);
  Assert.ok(!tab.hidden, "Tab is not hidden hidden after update");

  await extension.unload();

  BrowserTestUtils.removeTab(tab);
});

// Test our update handling.  Currently this means any hidden tabs will be
// shown when a tabHide extension is shutdown.  We additionally test the
// tabs.onUpdated listener gets called with hidden state changes.
add_task(async function test_tabs_disable() {
  let tab = await BrowserTestUtils.openNewForegroundTab(
    gBrowser,
    "http://example.com/"
  );
  await BrowserTestUtils.switchTab(gBrowser, gBrowser.tabs[0]);

  const extension = getExtension();
  await extension.startup();

  // test onUpdated
  await Promise.all([
    extension.awaitMessage("ready"),
    extension.awaitMessage("changeInfo"),
  ]);
  Assert.ok(tab.hidden, "Tab is hidden by extension");

  // Test that disable does hide tabs.
  await disableExtension(ID);
  Assert.ok(!tab.hidden, "Tab is not hidden hidden after disable");

  await extension.unload();

  BrowserTestUtils.removeTab(tab);
});