Bug 1397448: Part 6 - Cache messageManager for MessageManagerProxy. r?mixedpuppy
MozReview-Commit-ID: 7eqSgBkrj4f
--- 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);
}