Bug 1274919 - part1 : send the msg "Browser:UnselectedTabHover" when the cursor is hovering over or leaving the unselected tab draft
authorAlastor Wu <alwu@mozilla.com>
Thu, 20 Jul 2017 14:13:08 +0800
changeset 611974 9ce59bcdd74356bd775acda9a62829f67ee3a71d
parent 610973 1b065ffd8a535a0ad4c39a912af18e948e6a42c1
child 611975 7601e43eb7f77e32f7eb49af3f191a761997d029
push id69345
push useralwu@mozilla.com
push dateThu, 20 Jul 2017 06:33:46 +0000
bugs1274919
milestone56.0a1
Bug 1274919 - part1 : send the msg "Browser:UnselectedTabHover" when the cursor is hovering over or leaving the unselected tab This msg is used to notify the status whether the cursor is hovering over the unselected tab or not. It's used for the media's feature, resuming the background video decoding. MozReview-Commit-ID: GuAyLNdH10c
browser/base/content/tabbrowser.xml
toolkit/content/browser-content.js
toolkit/content/widgets/browser.xml
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -7570,32 +7570,38 @@
             let candidate = visibleTabs[tabIndex + 1];
             if (!candidate.selected) {
               tabContainer._afterHoveredTab = candidate;
               candidate.setAttribute("afterhovered", "true");
             }
           }
 
           tabContainer._hoveredTab = this;
+          if (this.linkedPanel && !this.selected) {
+            this.linkedBrowser.unselectedTabHover(true);
+          }
         ]]></body>
       </method>
 
       <method name="_mouseleave">
         <body><![CDATA[
           let tabContainer = this.parentNode;
           if (tabContainer._beforeHoveredTab) {
             tabContainer._beforeHoveredTab.removeAttribute("beforehovered");
             tabContainer._beforeHoveredTab = null;
           }
           if (tabContainer._afterHoveredTab) {
             tabContainer._afterHoveredTab.removeAttribute("afterhovered");
             tabContainer._afterHoveredTab = null;
           }
 
           tabContainer._hoveredTab = null;
+          if (this.linkedPanel && !this.selected) {
+            this.linkedBrowser.unselectedTabHover(false);
+          }
         ]]></body>
       </method>
 
       <method name="startMediaBlockTimer">
         <body><![CDATA[
           TelemetryStopwatch.start("TAB_MEDIA_BLOCKING_TIME_MS", this);
         ]]></body>
       </method>
--- a/toolkit/content/browser-content.js
+++ b/toolkit/content/browser-content.js
@@ -977,16 +977,20 @@ addMessageListener("WebChannelMessageToC
     } else {
       Cu.reportError("WebChannel message failed. Principal mismatch.");
     }
   } else {
     Cu.reportError("WebChannel message failed. No message data.");
   }
 });
 
+addMessageListener("Browser:UnselectedTabHover", message => {
+  Services.obs.notifyObservers(content.window, "unselected-tab-hover", message.data.hovered);
+});
+
 var AudioPlaybackListener = {
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
 
   init() {
     Services.obs.addObserver(this, "audio-playback");
 
     addMessageListener("AudioPlayback", this);
     addEventListener("unload", () => {
--- a/toolkit/content/widgets/browser.xml
+++ b/toolkit/content/widgets/browser.xml
@@ -845,16 +845,27 @@
               let event = document.createEvent("Events");
               event.initEvent("DOMAudioPlaybackBlockStopped", true, false);
               this.dispatchEvent(event);
             }
           ]]>
         </body>
       </method>
 
+      <method name="unselectedTabHover">
+        <parameter name="hovered"/>
+        <body>
+          <![CDATA[
+            // TODO : only dispatch event when someone is waiting for this message
+            this.messageManager.sendAsyncMessage("Browser:UnselectedTabHover",
+              { hovered });
+          ]]>
+        </body>
+      </method>
+
       <property name="securityUI">
         <getter>
           <![CDATA[
             if (!this.docShell.securityUI) {
               const SECUREBROWSERUI_CONTRACTID = "@mozilla.org/secure_browser_ui;1";
               if (!this.hasAttribute("disablesecurity") &&
                   SECUREBROWSERUI_CONTRACTID in Components.classes) {
                 var securityUI = Components.classes[SECUREBROWSERUI_CONTRACTID]