Bug 1370716 - Only try to add _action menus if extension has permission draft
authorTomislav Jovanovic <tomica@gmail.com>
Sun, 06 Aug 2017 23:27:10 +0200
changeset 641427 65f8c6882570074e37a48430a4cf8c73ebd8ff9f
parent 618383 26516ba270816a6cc90f5c42a9b66701369a551f
child 724776 8cb7035b71a7a29f33a73e30310461752638d46c
push id72510
push userbmo:tomica@gmail.com
push dateSun, 06 Aug 2017 23:57:33 +0000
bugs1370716
milestone56.0a1
Bug 1370716 - Only try to add _action menus if extension has permission MozReview-Commit-ID: KpT1RH30NMh
browser/components/extensions/ext-browserAction.js
browser/components/extensions/ext-menus.js
browser/components/extensions/ext-pageAction.js
--- a/browser/components/extensions/ext-browserAction.js
+++ b/browser/components/extensions/ext-browserAction.js
@@ -136,17 +136,21 @@ this.browserAction = class extends Exten
 
       onBeforeCreated: document => {
         let view = document.createElementNS(XUL_NS, "panelview");
         view.id = this.viewId;
         view.setAttribute("flex", "1");
         view.setAttribute("extension", true);
 
         document.getElementById("PanelUI-multiView").appendChild(view);
-        document.addEventListener("popupshowing", this);
+
+        if (this.extension.hasPermission("menus") ||
+            this.extension.hasPermission("contextMenus")) {
+          document.addEventListener("popupshowing", this);
+        }
       },
 
       onDestroyed: document => {
         document.removeEventListener("popupshowing", this);
 
         let view = document.getElementById(this.viewId);
         if (view) {
           this.clearPopup();
@@ -331,20 +335,16 @@ this.browserAction = class extends Exten
             this.eventQueue = [];
           }
           this.clearPopup();
         }
         break;
 
 
       case "popupshowing":
-        if (!global.actionContextMenu) {
-          break;
-        }
-
         const menu = event.target;
         const trigger = menu.triggerNode;
         const node = window.document.getElementById(this.id);
         const contexts = ["toolbar-context-menu", "customizationPanelItemContextMenu"];
 
         if (contexts.includes(menu.id) && node && isAncestorOrSelf(node, trigger)) {
           global.actionContextMenu({
             extension: this.extension,
--- a/browser/components/extensions/ext-menus.js
+++ b/browser/components/extensions/ext-menus.js
@@ -76,16 +76,20 @@ var gMenuBuilder = {
   // Builds a context menu for browserAction and pageAction buttons.
   buildActionContextMenu(contextData) {
     const {menu} = contextData;
 
     contextData.tab = tabTracker.activeTab;
     contextData.pageUrl = contextData.tab.linkedBrowser.currentURI.spec;
 
     const root = gRootItems.get(contextData.extension);
+    if (!root) {
+      return;
+    }
+
     const children = this.buildChildren(root, contextData);
     const visible = children.slice(0, ACTION_MENU_TOP_LEVEL_LIMIT);
 
     if (visible.length) {
       this.xulMenu = menu;
       menu.addEventListener("popuphidden", this);
 
       const separator = menu.ownerDocument.createElement("menuseparator");
--- a/browser/components/extensions/ext-pageAction.js
+++ b/browser/components/extensions/ext-pageAction.js
@@ -160,17 +160,21 @@ this.pageAction = class extends Extensio
   addButton(window) {
     let document = window.document;
 
     let button = document.createElement("image");
     button.id = this.id;
     button.setAttribute("class", "urlbar-icon");
 
     button.addEventListener("click", this); // eslint-disable-line mozilla/balanced-listeners
-    document.addEventListener("popupshowing", this);
+
+    if (this.extension.hasPermission("menus") ||
+        this.extension.hasPermission("contextMenus")) {
+      document.addEventListener("popupshowing", this);
+    }
 
     document.getElementById("urlbar-icons").appendChild(button);
 
     return button;
   }
 
   // Returns the page action button for the given window, creating it if
   // it doesn't already exist.
@@ -204,20 +208,16 @@ this.pageAction = class extends Extensio
     switch (event.type) {
       case "click":
         if (event.button === 0) {
           this.handleClick(window);
         }
         break;
 
       case "popupshowing":
-        if (!global.actionContextMenu) {
-          break;
-        }
-
         const menu = event.target;
         const trigger = menu.triggerNode;
 
         if (menu.id === "toolbar-context-menu" && trigger && trigger.id === this.id) {
           global.actionContextMenu({
             extension: this.extension,
             onPageAction: true,
             menu: menu,