summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_tabs_update_highlighted.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/extensions/test/browser/browser_ext_tabs_update_highlighted.js')
-rw-r--r--browser/components/extensions/test/browser/browser_ext_tabs_update_highlighted.js183
1 files changed, 183 insertions, 0 deletions
diff --git a/browser/components/extensions/test/browser/browser_ext_tabs_update_highlighted.js b/browser/components/extensions/test/browser/browser_ext_tabs_update_highlighted.js
new file mode 100644
index 0000000000..0adb05e827
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_update_highlighted.js
@@ -0,0 +1,183 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+add_task(async function test_update_highlighted() {
+ let extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ permissions: ["tabs"],
+ },
+
+ background: async function () {
+ const trackedEvents = ["onActivated", "onHighlighted"];
+ async function expectResults(fn, action) {
+ let resolve;
+ let reject;
+ let promise = new Promise((...args) => {
+ [resolve, reject] = args;
+ });
+ let expectedEvents;
+ let events = [];
+ let listeners = {};
+ for (let trackedEvent of trackedEvents) {
+ listeners[trackedEvent] = data => {
+ events.push([trackedEvent, data]);
+ if (expectedEvents && expectedEvents.length >= events.length) {
+ resolve();
+ }
+ };
+ browser.tabs[trackedEvent].addListener(listeners[trackedEvent]);
+ }
+ let expectedData = await fn();
+ let expectedHighlighted = expectedData.highlighted;
+ let expectedActive = expectedData.active;
+ expectedEvents = expectedData.events;
+ if (events.length < expectedEvents.length) {
+ // Wait up to 1000 ms for the expected number of events.
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ setTimeout(reject, 1000);
+ await promise.catch(() => {
+ let numMissing = expectedEvents.length - events.length;
+ browser.test.fail(`${numMissing} missing events when ${action}`);
+ });
+ }
+ let [{ id: active }] = await browser.tabs.query({ active: true });
+ browser.test.assertEq(
+ expectedActive,
+ active,
+ `The expected tab is active when ${action}`
+ );
+ let highlighted = (await browser.tabs.query({ highlighted: true })).map(
+ ({ id }) => id
+ );
+ browser.test.assertEq(
+ JSON.stringify(expectedHighlighted),
+ JSON.stringify(highlighted),
+ `The expected tabs are highlighted when ${action}`
+ );
+ let unexpectedEvents = events.splice(expectedEvents.length);
+ browser.test.assertEq(
+ JSON.stringify(expectedEvents),
+ JSON.stringify(events),
+ `Should get expected events when ${action}`
+ );
+ if (unexpectedEvents.length) {
+ browser.test.fail(
+ `${unexpectedEvents.length} unexpected events when ${action}: ` +
+ JSON.stringify(unexpectedEvents)
+ );
+ }
+ for (let trackedEvent of trackedEvents) {
+ browser.tabs[trackedEvent].removeListener(listeners[trackedEvent]);
+ }
+ }
+
+ let { id: windowId } = await browser.windows.getCurrent();
+ let { id: tab1 } = await browser.tabs.create({ url: "about:blank?1" });
+ let { id: tab2 } = await browser.tabs.create({
+ url: "about:blank?2",
+ active: true,
+ });
+
+ await expectResults(async () => {
+ await browser.tabs.update(tab2, { highlighted: true });
+ return { active: tab2, highlighted: [tab2], events: [] };
+ }, "highlighting active tab");
+
+ await expectResults(async () => {
+ await browser.tabs.update(tab2, { highlighted: false });
+ return { active: tab2, highlighted: [tab2], events: [] };
+ }, "unhighlighting active tab with no multiselection");
+
+ await expectResults(async () => {
+ await browser.tabs.update(tab1, { highlighted: true });
+ return {
+ active: tab1,
+ highlighted: [tab1, tab2],
+ events: [
+ ["onActivated", { tabId: tab1, previousTabId: tab2, windowId }],
+ ["onHighlighted", { tabIds: [tab1, tab2], windowId }],
+ ],
+ };
+ }, "highlighting non-highlighted tab");
+
+ await expectResults(async () => {
+ await browser.tabs.update(tab2, { highlighted: true });
+ return { active: tab1, highlighted: [tab1, tab2], events: [] };
+ }, "highlighting inactive highlighted tab");
+
+ await expectResults(async () => {
+ await browser.tabs.update(tab1, { highlighted: false });
+ return {
+ active: tab2,
+ highlighted: [tab2],
+ events: [
+ ["onActivated", { tabId: tab2, previousTabId: tab1, windowId }],
+ ["onHighlighted", { tabIds: [tab2], windowId }],
+ ],
+ };
+ }, "unhighlighting active tab with multiselection");
+
+ await expectResults(async () => {
+ await browser.tabs.update(tab1, { highlighted: true });
+ return {
+ active: tab1,
+ highlighted: [tab1, tab2],
+ events: [
+ ["onActivated", { tabId: tab1, previousTabId: tab2, windowId }],
+ ["onHighlighted", { tabIds: [tab1, tab2], windowId }],
+ ],
+ };
+ }, "highlighting non-highlighted tab");
+
+ await expectResults(async () => {
+ await browser.tabs.update(tab2, { highlighted: false });
+ return {
+ active: tab1,
+ highlighted: [tab1],
+ events: [["onHighlighted", { tabIds: [tab1], windowId }]],
+ };
+ }, "unhighlighting inactive highlighted tab");
+
+ await expectResults(async () => {
+ await browser.tabs.update(tab2, { highlighted: true, active: false });
+ return {
+ active: tab1,
+ highlighted: [tab1, tab2],
+ events: [["onHighlighted", { tabIds: [tab1, tab2], windowId }]],
+ };
+ }, "highlighting without activating non-highlighted tab");
+
+ await expectResults(async () => {
+ await browser.tabs.update(tab2, { highlighted: true, active: true });
+ return {
+ active: tab2,
+ highlighted: [tab2],
+ events: [
+ ["onActivated", { tabId: tab2, previousTabId: tab1, windowId }],
+ ["onHighlighted", { tabIds: [tab2], windowId }],
+ ],
+ };
+ }, "highlighting and activating inactive highlighted tab");
+
+ await expectResults(async () => {
+ await browser.tabs.update(tab1, { active: true, highlighted: true });
+ return {
+ active: tab1,
+ highlighted: [tab1],
+ events: [
+ ["onActivated", { tabId: tab1, previousTabId: tab2, windowId }],
+ ["onHighlighted", { tabIds: [tab1], windowId }],
+ ],
+ };
+ }, "highlighting and activating non-highlighted tab");
+
+ await browser.tabs.remove([tab1, tab2]);
+ browser.test.notifyPass("test-finished");
+ },
+ });
+
+ await extension.startup();
+ await extension.awaitFinish("test-finished");
+ await extension.unload();
+});