Bug 1461248 - Only load ContextMenu.jsm when a contextmenu event occurs. r=mconley
MozReview-Commit-ID: 4bA2txVW78n
--- a/browser/base/content/content.js
+++ b/browser/base/content/content.js
@@ -6,16 +6,19 @@
/* This content script should work in any browser or iframe and should not
* depend on the frame being contained in tabbrowser. */
/* eslint-env mozilla/frame-script */
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
ChromeUtils.import("resource://gre/modules/Services.jsm");
+// TabChildGlobal
+var global = this;
+
XPCOMUtils.defineLazyModuleGetters(this, {
BrowserUtils: "resource://gre/modules/BrowserUtils.jsm",
ContentLinkHandler: "resource:///modules/ContentLinkHandler.jsm",
ContentMetaHandler: "resource:///modules/ContentMetaHandler.jsm",
ContentWebRTC: "resource:///modules/ContentWebRTC.jsm",
InlineSpellCheckerContent: "resource://gre/modules/InlineSpellCheckerContent.jsm",
LoginManagerContent: "resource://gre/modules/LoginManagerContent.jsm",
LoginFormFactory: "resource://gre/modules/LoginManagerContent.jsm",
@@ -34,20 +37,21 @@ XPCOMUtils.defineLazyModuleGetters(this,
XPCOMUtils.defineLazyGetter(this, "gPipNSSBundle", function() {
return Services.strings.createBundle("chrome://pipnss/locale/pipnss.properties");
});
XPCOMUtils.defineLazyGetter(this, "gNSSErrorsBundle", function() {
return Services.strings.createBundle("chrome://pipnss/locale/nsserrors.properties");
});
-// TabChildGlobal
-var global = this;
+XPCOMUtils.defineLazyProxy(this, "contextMenu", () => {
+ return new ContextMenu(global);
+});
-var contextMenu = this.contextMenu = new ContextMenu(global);
+Services.els.addSystemEventListener(global, "contextmenu", contextMenu, false);
// Load the form validation popup handler
var formSubmitObserver = new FormSubmitObserver(content, this);
addMessageListener("RemoteLogins:fillForm", function(message) {
// intercept if ContextMenu.jsm had sent a plain object for remote targets
message.objects.inputElement = contextMenu.getTarget(message, "inputElement");
LoginManagerContent.receiveMessage(message, content);
--- a/browser/modules/ContextMenu.jsm
+++ b/browser/modules/ContextMenu.jsm
@@ -227,19 +227,16 @@ const messageListeners = {
class ContextMenu {
// PUBLIC
constructor(global) {
this.target = null;
this.context = null;
this.global = global;
this.content = global.content;
- Services.els.addSystemEventListener(global, "contextmenu",
- this._handleContentContextMenu.bind(this), false);
-
Object.keys(messageListeners).forEach(key =>
global.addMessageListener(key, messageListeners[key].bind(this))
);
}
/**
* Returns the event target of the context menu, using a locally stored
* reference if possible. If not, and aMessage.objects is defined,
@@ -482,17 +479,17 @@ class ContextMenu {
while (aNode) {
selectors.unshift(findCssSelector(aNode));
aNode = aNode.ownerGlobal.frameElement;
}
return selectors;
}
- _handleContentContextMenu(aEvent) {
+ handleEvent(aEvent) {
let defaultPrevented = aEvent.defaultPrevented;
if (!Services.prefs.getBoolPref("dom.event.contextmenu.enabled")) {
let plugin = null;
try {
plugin = aEvent.composedTarget.QueryInterface(Ci.nsIObjectLoadingContent);
} catch (e) {}