summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_windows_events.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/extensions/test/browser/browser_ext_windows_events.js')
-rw-r--r--browser/components/extensions/test/browser/browser_ext_windows_events.js222
1 files changed, 222 insertions, 0 deletions
diff --git a/browser/components/extensions/test/browser/browser_ext_windows_events.js b/browser/components/extensions/test/browser/browser_ext_windows_events.js
new file mode 100644
index 0000000000..aa8a2655ce
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_windows_events.js
@@ -0,0 +1,222 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+SimpleTest.requestCompleteLog();
+
+add_task(async function test_windows_events_not_allowed() {
+ let monitor = await startIncognitoMonitorExtension();
+
+ function background() {
+ browser.windows.onCreated.addListener(window => {
+ browser.test.log(`onCreated: windowId=${window.id}`);
+
+ browser.test.assertTrue(
+ Number.isInteger(window.id),
+ "Window object's id is an integer"
+ );
+ browser.test.assertEq(
+ "normal",
+ window.type,
+ "Window object returned with the correct type"
+ );
+ browser.test.sendMessage("window-created", window.id);
+ });
+
+ let lastWindowId;
+ browser.windows.onFocusChanged.addListener(async eventWindowId => {
+ browser.test.log(
+ `onFocusChange: windowId=${eventWindowId} lastWindowId=${lastWindowId}`
+ );
+
+ browser.test.assertTrue(
+ lastWindowId !== eventWindowId,
+ "onFocusChanged fired once for the given window"
+ );
+ lastWindowId = eventWindowId;
+
+ browser.test.assertTrue(
+ Number.isInteger(eventWindowId),
+ "windowId is an integer"
+ );
+ let window = await browser.windows.getLastFocused();
+ browser.test.sendMessage("window-focus-changed", {
+ winId: eventWindowId,
+ lastFocusedWindowId: window.id,
+ });
+ });
+
+ browser.windows.onRemoved.addListener(windowId => {
+ browser.test.log(`onRemoved: windowId=${windowId}`);
+
+ browser.test.assertTrue(
+ Number.isInteger(windowId),
+ "windowId is an integer"
+ );
+ browser.test.sendMessage("window-removed", windowId);
+ browser.test.notifyPass("windows.events");
+ });
+
+ browser.test.sendMessage("ready", browser.windows.WINDOW_ID_NONE);
+ }
+
+ let extension = ExtensionTestUtils.loadExtension({
+ manifest: {},
+ background,
+ incognitoOverride: "spanning",
+ });
+
+ await extension.startup();
+ const WINDOW_ID_NONE = await extension.awaitMessage("ready");
+
+ async function awaitFocusChanged() {
+ let windowInfo = await extension.awaitMessage("window-focus-changed");
+ if (windowInfo.winId === WINDOW_ID_NONE) {
+ info("Ignoring a superfluous WINDOW_ID_NONE (blur) event.");
+ windowInfo = await extension.awaitMessage("window-focus-changed");
+ }
+ is(
+ windowInfo.winId,
+ windowInfo.lastFocusedWindowId,
+ "Last focused window has the correct id"
+ );
+ return windowInfo.winId;
+ }
+
+ const {
+ Management: {
+ global: { windowTracker },
+ },
+ } = ChromeUtils.importESModule("resource://gre/modules/Extension.sys.mjs");
+
+ let currentWindow = window;
+ let currentWindowId = windowTracker.getId(currentWindow);
+ info(`Current window ID: ${currentWindowId}`);
+
+ info("Create browser window 1");
+ let win1 = await BrowserTestUtils.openNewBrowserWindow();
+ let win1Id = await extension.awaitMessage("window-created");
+ info(`Window 1 ID: ${win1Id}`);
+
+ // This shouldn't be necessary, but tests intermittently fail, so let's give
+ // it a try.
+ win1.focus();
+
+ let winId = await awaitFocusChanged();
+ is(winId, win1Id, "Got focus change event for the correct window ID.");
+
+ info("Create browser window 2");
+ let win2 = await BrowserTestUtils.openNewBrowserWindow({ private: true });
+ let win2Id = await extension.awaitMessage("window-created");
+ info(`Window 2 ID: ${win2Id}`);
+
+ win2.focus();
+
+ winId = await awaitFocusChanged();
+ is(winId, win2Id, "Got focus change event for the correct window ID.");
+
+ info("Focus browser window 1");
+ await focusWindow(win1);
+
+ winId = await awaitFocusChanged();
+ is(winId, win1Id, "Got focus change event for the correct window ID.");
+
+ info("Close browser window 2");
+ await BrowserTestUtils.closeWindow(win2);
+
+ winId = await extension.awaitMessage("window-removed");
+ is(winId, win2Id, "Got removed event for the correct window ID.");
+
+ info("Close browser window 1");
+ await BrowserTestUtils.closeWindow(win1);
+
+ currentWindow.focus();
+
+ winId = await extension.awaitMessage("window-removed");
+ is(winId, win1Id, "Got removed event for the correct window ID.");
+
+ winId = await awaitFocusChanged();
+ is(
+ winId,
+ currentWindowId,
+ "Got focus change event for the correct window ID."
+ );
+
+ await extension.awaitFinish("windows.events");
+ await extension.unload();
+ await monitor.unload();
+});
+
+add_task(async function test_windows_event_page() {
+ await SpecialPowers.pushPrefEnv({
+ set: [["extensions.eventPages.enabled", true]],
+ });
+
+ let extension = ExtensionTestUtils.loadExtension({
+ useAddonManager: "permanent",
+ manifest: {
+ browser_specific_settings: { gecko: { id: "eventpage@windows" } },
+ background: { persistent: false },
+ },
+ background() {
+ let removed;
+ browser.windows.onCreated.addListener(window => {
+ browser.test.sendMessage("onCreated", window.id);
+ });
+ browser.windows.onRemoved.addListener(wid => {
+ removed = wid;
+ browser.test.sendMessage("onRemoved", wid);
+ });
+ browser.windows.onFocusChanged.addListener(wid => {
+ if (wid != browser.windows.WINDOW_ID_NONE && wid != removed) {
+ browser.test.sendMessage("onFocusChanged", wid);
+ }
+ });
+ browser.test.sendMessage("ready");
+ },
+ });
+
+ const EVENTS = ["onCreated", "onRemoved", "onFocusChanged"];
+
+ await extension.startup();
+ await extension.awaitMessage("ready");
+ for (let event of EVENTS) {
+ assertPersistentListeners(extension, "windows", event, {
+ primed: false,
+ });
+ }
+
+ // test events waken background
+ await extension.terminateBackground();
+ for (let event of EVENTS) {
+ assertPersistentListeners(extension, "windows", event, {
+ primed: true,
+ });
+ }
+
+ let win = await BrowserTestUtils.openNewBrowserWindow();
+
+ await extension.awaitMessage("ready");
+ let windowId = await extension.awaitMessage("onCreated");
+ ok(true, "persistent event woke background");
+ for (let event of EVENTS) {
+ assertPersistentListeners(extension, "windows", event, {
+ primed: false,
+ });
+ }
+ // focus returns the new window
+ let focusedId = await extension.awaitMessage("onFocusChanged");
+ Assert.equal(windowId, focusedId, "new window was focused");
+ await extension.terminateBackground();
+
+ await BrowserTestUtils.closeWindow(win);
+ await extension.awaitMessage("ready");
+ let removedId = await extension.awaitMessage("onRemoved");
+ Assert.equal(windowId, removedId, "window was removed");
+ // focus returns the window focus was passed to
+ focusedId = await extension.awaitMessage("onFocusChanged");
+ Assert.notEqual(windowId, focusedId, "old window was focused");
+
+ await extension.unload();
+ await SpecialPowers.popPrefEnv();
+});