From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../browser/browser_ext_tabs_update_highlighted.js | 183 +++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 browser/components/extensions/test/browser/browser_ext_tabs_update_highlighted.js (limited to 'browser/components/extensions/test/browser/browser_ext_tabs_update_highlighted.js') 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(); +}); -- cgit v1.2.3