Bug 1397448: Part 6 - Cache messageManager for MessageManagerProxy. r?mixedpuppy draft
authorKris Maglione <maglione.k@gmail.com>
Fri, 08 Sep 2017 21:36:00 -0700
changeset 661999 a62b240e3ed9af71d5346f58e4fa94955ac9c22f
parent 661998 bb6693aaf7fb1454217d19588775c76bc3750e0e
child 730715 2f44d08b9a761f0a7290eeb240962c95a14b64c8
push id78919
push usermaglione.k@gmail.com
push dateSat, 09 Sep 2017 23:05:23 +0000
reviewersmixedpuppy
bugs1397448
milestone57.0a1
Bug 1397448: Part 6 - Cache messageManager for MessageManagerProxy. r?mixedpuppy MozReview-Commit-ID: 7eqSgBkrj4f
toolkit/components/extensions/ExtensionUtils.jsm
--- a/toolkit/components/extensions/ExtensionUtils.jsm
+++ b/toolkit/components/extensions/ExtensionUtils.jsm
@@ -484,21 +484,17 @@ function defineLazyGetter(object, prop, 
  *        The target message manager on which to send messages, or the
  *        <browser> element which owns it.
  */
 class MessageManagerProxy {
   constructor(target) {
     this.listeners = new DefaultMap(() => new Map());
 
     if (target instanceof Ci.nsIMessageSender) {
-      Object.defineProperty(this, "messageManager", {
-        value: target,
-        configurable: true,
-        writable: true,
-      });
+      this.messageManager = target;
     } else {
       this.addListeners(target);
     }
   }
 
   /**
    * Disposes of the proxy object, removes event listeners, and drops
    * all references to the underlying message manager.
@@ -506,19 +502,18 @@ class MessageManagerProxy {
    * Must be called before the last reference to the proxy is dropped,
    * unless the underlying message manager or <browser> is also being
    * destroyed.
    */
   dispose() {
     if (this.eventTarget) {
       this.removeListeners(this.eventTarget);
       this.eventTarget = null;
-    } else {
-      this.messageManager = null;
     }
+    this.messageManager = null;
   }
 
   /**
    * Returns true if the given target is the same as, or owns, the given
    * message manager.
    *
    * @param {nsIMessageSender|MessageManagerProxy|Element} target
    *        The message manager, MessageManagerProxy, or <browser>
@@ -536,19 +531,16 @@ class MessageManagerProxy {
   }
 
   /**
    * @property {nsIMessageSender|null} messageManager
    *        The message manager that is currently being proxied. This
    *        may change during the life of the proxy object, so should
    *        not be stored elsewhere.
    */
-  get messageManager() {
-    return this.eventTarget && this.eventTarget.messageManager;
-  }
 
   /**
    * Sends a message on the proxied message manager.
    *
    * @param {array} args
    *        Arguments to be passed verbatim to the underlying
    *        sendAsyncMessage method.
    * @returns {undefined}
@@ -617,35 +609,36 @@ class MessageManagerProxy {
    * Adds docShell swap listeners to the message manager owner.
    *
    * @param {Element} target
    *        The target element.
    */
   addListeners(target) {
     target.addEventListener("SwapDocShells", this);
 
+    this.eventTarget = target;
+    this.messageManager = target.messageManager;
+
     for (let {message, listener, listenWhenClosed} of this.iterListeners()) {
-      target.addMessageListener(message, listener, listenWhenClosed);
+      this.messageManager.addMessageListener(message, listener, listenWhenClosed);
     }
-
-    this.eventTarget = target;
   }
 
   /**
    * @private
    * Removes docShell swap listeners to the message manager owner.
    *
    * @param {Element} target
    *        The target element.
    */
   removeListeners(target) {
     target.removeEventListener("SwapDocShells", this);
 
     for (let {message, listener} of this.iterListeners()) {
-      target.removeMessageListener(message, listener);
+      this.messageManager.removeMessageListener(message, listener);
     }
   }
 
   handleEvent(event) {
     if (event.type == "SwapDocShells") {
       this.removeListeners(this.eventTarget);
       this.addListeners(event.detail);
     }