Bug 1402944: Part 6 - Optimize getBrowserInfo some more. r?mixedpuppy
MozReview-Commit-ID: 8kdeVqKb889
--- a/browser/components/extensions/ext-browser.js
+++ b/browser/components/extensions/ext-browser.js
@@ -200,16 +200,17 @@ global.WindowEventManager = class extend
}
};
class TabTracker extends TabTrackerBase {
constructor() {
super();
this._tabs = new WeakMap();
+ this._browsers = new WeakMap();
this._tabIds = new Map();
this._nextId = 1;
this._handleTabDestroyed = this._handleTabDestroyed.bind(this);
}
init() {
if (this.initialized) {
@@ -230,29 +231,48 @@ class TabTracker extends TabTrackerBase
/* eslint-disable mozilla/balanced-listeners */
this.on("tab-detached", this._handleTabDestroyed);
this.on("tab-removed", this._handleTabDestroyed);
/* eslint-enable mozilla/balanced-listeners */
}
getId(nativeTab) {
- if (this._tabs.has(nativeTab)) {
- return this._tabs.get(nativeTab);
+ let id = this._tabs.get(nativeTab);
+ if (id) {
+ return id;
}
this.init();
- let id = this._nextId++;
+ id = this._nextId++;
this.setId(nativeTab, id);
return id;
}
+ getBrowserTabId(browser) {
+ let id = this._browsers.get(browser);
+ if (id) {
+ return id;
+ }
+
+ let tab = browser.ownerGlobal.gBrowser.getTabForBrowser(browser);
+ if (tab) {
+ id = this.getId(tab);
+ this._browsers.set(browser, id);
+ return id;
+ }
+ return -1;
+ }
+
setId(nativeTab, id) {
this._tabs.set(nativeTab, id);
+ if (nativeTab.linkedBrowser) {
+ this._browsers.set(nativeTab.linkedBrowser, id);
+ }
this._tabIds.set(id, nativeTab);
}
_handleTabDestroyed(event, {nativeTab}) {
let id = this._tabs.get(nativeTab);
if (id) {
this._tabs.delete(nativeTab);
if (this._tabIds.get(id) === nativeTab) {
@@ -498,40 +518,37 @@ class TabTracker extends TabTrackerBase
emitRemoved(nativeTab, isWindowClosing) {
let windowId = windowTracker.getId(nativeTab.ownerGlobal);
let tabId = this.getId(nativeTab);
this.emit("tab-removed", {nativeTab, tabId, windowId, isWindowClosing});
}
getBrowserData(browser) {
- if (browser.ownerDocument.documentURI === "about:addons") {
- // When we're loaded into a <browser> inside about:addons, we need to go up
- // one more level.
- browser = browser.ownerDocument.docShell.chromeEventHandler;
- }
+ let {gBrowser} = browser.ownerGlobal;
+ // Some non-browser windows have gBrowser but not getTabForBrowser!
+ if (!gBrowser || !gBrowser.getTabForBrowser) {
+ if (browser.ownerDocument.documentURI === "about:addons") {
+ // When we're loaded into a <browser> inside about:addons, we need to go up
+ // one more level.
+ browser = browser.ownerDocument.docShell.chromeEventHandler;
- let result = {
- tabId: -1,
- windowId: -1,
- };
-
- let {gBrowser} = browser.ownerGlobal;
- // Some non-browser windows have gBrowser but not
- // getTabForBrowser!
- if (gBrowser && gBrowser.getTabForBrowser) {
- result.windowId = windowTracker.getId(browser.ownerGlobal);
-
- let nativeTab = gBrowser.getTabForBrowser(browser);
- if (nativeTab) {
- result.tabId = this.getId(nativeTab);
+ ({gBrowser} = browser.ownerGlobal);
+ } else {
+ return {
+ tabId: -1,
+ windowId: -1,
+ };
}
}
- return result;
+ return {
+ tabId: this.getBrowserTabId(browser),
+ windowId: windowTracker.getId(browser.ownerGlobal),
+ };
}
get activeTab() {
let window = windowTracker.topWindow;
if (window && window.gBrowser) {
return window.gBrowser.selectedTab;
}
return null;