Bug 1461248 - Only load ContextMenu.jsm when a contextmenu event occurs. r=mconley draft
authorFelipe Gomes <felipc@gmail.com>
Thu, 17 May 2018 16:27:04 -0300
changeset 796533 e50d0624898f05d43db6fe8010a5a181461d0152
parent 796393 24bae072acb09114c367e6b9ffde9261b2ad8a58
child 796540 9a57815438a532d8decb95fec75ec17b538390fb
child 796575 cf93406bba01a0485f4f42004708dc46893e254e
child 797312 54fd314d2d9be6c077797ded4f3e0c2b8827b65a
push id110273
push userfelipc@gmail.com
push dateThu, 17 May 2018 19:33:55 +0000
reviewersmconley
bugs1461248
milestone62.0a1
Bug 1461248 - Only load ContextMenu.jsm when a contextmenu event occurs. r=mconley MozReview-Commit-ID: 4bA2txVW78n
browser/base/content/content.js
browser/modules/ContextMenu.jsm
--- 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) {}