Bug 1436720 use sessionstore to track controlling extension, r?Gijs,rpl draft
authorShane Caraveo <scaraveo@mozilla.com>
Thu, 08 Feb 2018 16:11:51 -0700
changeset 752784 cc15b2be0f4ddf9ae62a8b8cd848f8d002ca7798
parent 752511 0ac953fcddf10132eaecdb753d72b2ba5a43c32a
push id98383
push usermixedpuppy@gmail.com
push dateThu, 08 Feb 2018 23:12:25 +0000
reviewersGijs, rpl
bugs1436720
milestone60.0a1
Bug 1436720 use sessionstore to track controlling extension, r?Gijs,rpl MozReview-Commit-ID: 7OM1Jm56Uax
browser/base/content/tabbrowser.xml
browser/components/extensions/ext-tabs.js
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -3886,37 +3886,40 @@
 
             this.tabContainer._updateCloseButtons();
 
             this.tabContainer._setPositionalAttributes();
 
             let event = document.createEvent("Events");
             event.initEvent("TabShow", true, false);
             aTab.dispatchEvent(event);
+            SessionStore.deleteTabValue(aTab, "hiddenBy");
           }
         ]]>
         </body>
       </method>
 
       <method name="hideTab">
         <parameter name="aTab"/>
+        <parameter name="aSource"/>
         <body>
         <![CDATA[
           if (!aTab.hidden && !aTab.pinned && !aTab.selected &&
               !aTab.closing && !aTab._sharingState) {
             aTab.setAttribute("hidden", "true");
             this._visibleTabs = null; // invalidate cache
 
             this.tabContainer._updateCloseButtons();
 
             this.tabContainer._setPositionalAttributes();
 
             let event = document.createEvent("Events");
             event.initEvent("TabHide", true, false);
             aTab.dispatchEvent(event);
+            SessionStore.setTabValue(aTab, "hiddenBy", aSource);
           }
         ]]>
         </body>
       </method>
 
       <method name="selectTabAtIndex">
         <parameter name="aIndex"/>
         <parameter name="aEvent"/>
--- a/browser/components/extensions/ext-tabs.js
+++ b/browser/components/extensions/ext-tabs.js
@@ -6,30 +6,29 @@
 /* import-globals-from ext-browser.js */
 
 ChromeUtils.defineModuleGetter(this, "PrivateBrowsingUtils",
                                "resource://gre/modules/PrivateBrowsingUtils.jsm");
 ChromeUtils.defineModuleGetter(this, "PromiseUtils",
                                "resource://gre/modules/PromiseUtils.jsm");
 ChromeUtils.defineModuleGetter(this, "Services",
                                "resource://gre/modules/Services.jsm");
+ChromeUtils.defineModuleGetter(this, "SessionStore",
+                               "resource:///modules/sessionstore/SessionStore.jsm");
 
 XPCOMUtils.defineLazyGetter(this, "strBundle", function() {
   return Services.strings.createBundle("chrome://global/locale/extensions.properties");
 });
 
 var {
   ExtensionError,
 } = ExtensionUtils;
 
 const TABHIDE_PREFNAME = "extensions.webextensions.tabhide.enabled";
 
-// WeakMap[Tab -> ExtensionID]
-let hiddenTabs = new WeakMap();
-
 let tabListener = {
   tabReadyInitialized: false,
   tabReadyPromises: new WeakMap(),
   initializingTabs: new WeakSet(),
 
   initTabReady() {
     if (!this.tabReadyInitialized) {
       windowTracker.addListener("progress", this);
@@ -88,21 +87,19 @@ this.tabs = class extends ExtensionAPI {
     }
     if (reason == "ADDON_DISABLE" ||
         reason == "ADDON_UNINSTALL") {
       // Show all hidden tabs if a tab managing extension is uninstalled or
       // disabled.  If a user has more than one, the extensions will need to
       // self-manage re-hiding tabs.
       for (let tab of this.extension.tabManager.query()) {
         let nativeTab = tabTracker.getTab(tab.id);
-        if (hiddenTabs.get(nativeTab) === this.extension.id) {
-          hiddenTabs.delete(nativeTab);
-          if (nativeTab.ownerGlobal) {
-            nativeTab.ownerGlobal.gBrowser.showTab(nativeTab);
-          }
+        if (nativeTab.hidden && nativeTab.ownerGlobal &&
+            SessionStore.getTabValue(nativeTab, "hiddenBy") === this.extension.id) {
+          nativeTab.ownerGlobal.gBrowser.showTab(nativeTab);
         }
       }
     }
   }
 
   getAPI(context) {
     let {extension} = context;
 
@@ -296,18 +293,16 @@ this.tabs = class extends ExtensionAPI {
               needed.push("pinned");
             } else if (event.type == "TabBrowserInserted" &&
                        !event.detail.insertedOnTabCreation) {
               needed.push("discarded");
             } else if (event.type == "TabBrowserDiscarded") {
               needed.push("discarded");
             } else if (event.type == "TabShow") {
               needed.push("hidden");
-              // Always remove the tab from the hiddenTabs map.
-              hiddenTabs.delete(event.originalTarget);
             } else if (event.type == "TabHide") {
               needed.push("hidden");
             }
 
             let tab = tabManager.getWrapper(event.originalTarget);
             let changeInfo = {};
             for (let prop of needed) {
               changeInfo[prop] = tab[prop];
@@ -1059,17 +1054,16 @@ this.tabs = class extends ExtensionAPI {
 
           if (!Array.isArray(tabIds)) {
             tabIds = [tabIds];
           }
 
           for (let tabId of tabIds) {
             let tab = tabTracker.getTab(tabId);
             if (tab.ownerGlobal) {
-              hiddenTabs.delete(tab);
               tab.ownerGlobal.gBrowser.showTab(tab);
             }
           }
         },
 
         hide(tabIds) {
           if (!Services.prefs.getBoolPref(TABHIDE_PREFNAME, false)) {
             throw new ExtensionError(`tabs.hide is currently experimental and must be enabled with the ${TABHIDE_PREFNAME} preference.`);
@@ -1078,19 +1072,18 @@ this.tabs = class extends ExtensionAPI {
           if (!Array.isArray(tabIds)) {
             tabIds = [tabIds];
           }
 
           let hidden = [];
           let tabs = tabIds.map(tabId => tabTracker.getTab(tabId));
           for (let tab of tabs) {
             if (tab.ownerGlobal && !tab.hidden) {
-              tab.ownerGlobal.gBrowser.hideTab(tab);
+              tab.ownerGlobal.gBrowser.hideTab(tab, extension.id);
               if (tab.hidden) {
-                hiddenTabs.set(tab, extension.id);
                 hidden.push(tabTracker.getId(tab));
               }
             }
           }
           return hidden;
         },
       },
     };