bug 1290057 - fire onFocusChanged when Firefox loses/gains focus
MozReview-Commit-ID: 7OdyglGjnFQ
--- a/browser/components/extensions/ext-windows.js
+++ b/browser/components/extensions/ext-windows.js
@@ -34,22 +34,26 @@ extensions.registerSchemaAPI("windows",
fire(WindowManager.getId(window));
}).api(),
onFocusChanged: new EventManager(context, "windows.onFocusChanged", fire => {
// Keep track of the last windowId used to fire an onFocusChanged event
let lastOnFocusChangedWindowId;
let listener = event => {
- let window = WindowManager.topWindow;
- let windowId = window ? WindowManager.getId(window) : WindowManager.WINDOW_ID_NONE;
- if (windowId !== lastOnFocusChangedWindowId) {
- fire(windowId);
- lastOnFocusChangedWindowId = windowId;
- }
+ // Wait a tick to avoid firing a superfluous WINDOW_ID_NONE
+ // event when switching focus between two Firefox windows.
+ Promise.resolve().then(() => {
+ let window = Services.focus.activeWindow;
+ let windowId = window ? WindowManager.getId(window) : WindowManager.WINDOW_ID_NONE;
+ if (windowId !== lastOnFocusChangedWindowId) {
+ fire(windowId);
+ lastOnFocusChangedWindowId = windowId;
+ }
+ });
};
AllWindowEvents.addListener("focus", listener);
AllWindowEvents.addListener("blur", listener);
return () => {
AllWindowEvents.removeListener("focus", listener);
AllWindowEvents.removeListener("blur", listener);
};
}).api(),
--- a/browser/components/extensions/test/browser/browser_ext_windows_events.js
+++ b/browser/components/extensions/test/browser/browser_ext_windows_events.js
@@ -11,20 +11,25 @@ add_task(function* testWindowsEvents() {
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;
+ let lastWindowId, os;
browser.windows.onFocusChanged.addListener(function listener(windowId) {
browser.test.log(`onFocusChange: windowId=${windowId} lastWindowId=${lastWindowId}`);
+ if (windowId === browser.windows.WINDOW_ID_NONE && os === "linux") {
+ browser.test.log("Ignoring a superfluous WINDOW_ID_NONE (blur) event on Linux");
+ return;
+ }
+
browser.test.assertTrue(lastWindowId !== windowId,
"onFocusChanged fired once for the given window");
lastWindowId = windowId;
browser.test.assertTrue(Number.isInteger(windowId),
"windowId is an integer");
browser.windows.getLastFocused().then(window => {
@@ -38,17 +43,20 @@ add_task(function* testWindowsEvents() {
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.runtime.getPlatformInfo(info => {
+ os = info.os;
+ browser.test.sendMessage("ready");
+ });
}
let extension = ExtensionTestUtils.loadExtension({
background: `(${background})()`,
});
yield extension.startup();
yield extension.awaitMessage("ready");