Bug 1260450 - about:performance should not offer to disable or uninstall hidden or non-removable add-ons r?Yoric draft
authorRobert Helmer <rhelmer@mozilla.com>
Mon, 20 Jun 2016 17:01:45 -0700
changeset 380296 5838e3bb576d0a5f9b33fde078960e89aacbaeaa
parent 377994 127e74cb33c31192517e414f003715469b2d4b30
child 523695 a4c9f80f1499a39eb548d5a40acfa0e0d04d9567
push id21188
push userrhelmer@mozilla.com
push dateTue, 21 Jun 2016 14:18:07 +0000
reviewersYoric
bugs1260450
milestone50.0a1
Bug 1260450 - about:performance should not offer to disable or uninstall hidden or non-removable add-ons r?Yoric MozReview-Commit-ID: JR4Oce9yPmr
toolkit/components/aboutperformance/content/aboutPerformance.js
--- a/toolkit/components/aboutperformance/content/aboutPerformance.js
+++ b/toolkit/components/aboutperformance/content/aboutPerformance.js
@@ -754,54 +754,66 @@ var View = {
           eltDetails.classList.add("hidden");
           eltShowMore.textContent = "more";
         }
       });
 
       // Add buttons
       if (nature == "addons") {
         eltSpan.appendChild(document.createElement("br"));
-        let eltDisable = document.createElement("button");
-        eltDisable.textContent = "Disable";
-        eltSpan.appendChild(eltDisable);
 
-        let eltUninstall = document.createElement("button");
-        eltUninstall.textContent = "Uninstall";
-        eltSpan.appendChild(eltUninstall);
+        AddonManager.getAddonByID(delta.diff.addonId, addon => {
+          if (addon.hidden) {
+            // Hidden add-ons should not be disabled,
+            // for example temporary and system add-ons.
+            return;
+          }
 
-        let eltRestart = document.createElement("button");
-        eltRestart.textContent = `Restart ${BRAND_NAME} to apply your changes.`
-        eltRestart.classList.add("hidden");
-        eltSpan.appendChild(eltRestart);
+          let eltRestart = document.createElement("button");
+          eltRestart.textContent = `Restart ${BRAND_NAME} to apply your changes.`
+          eltRestart.classList.add("hidden");
+          eltSpan.appendChild(eltRestart);
 
-        eltRestart.addEventListener("click", () => {
-          Services.startup.quit(Services.startup.eForceQuit | Services.startup.eRestart);
-        });
-        AddonManager.getAddonByID(delta.diff.addonId, addon => {
+          eltRestart.addEventListener("click", () => {
+            Services.startup.quit(Services.startup.eForceQuit | Services.startup.eRestart);
+          });
+
+          let eltDisable = document.createElement("button");
+          eltDisable.textContent = "Disable";
+          eltSpan.appendChild(eltDisable);
+
           eltDisable.addEventListener("click", () => {
             addon.userDisabled = true;
             if (addon.pendingOperations == addon.PENDING_NONE) {
               // Restartless add-on is now disabled.
               return;
             }
             eltDisable.classList.add("hidden");
             eltUninstall.classList.add("hidden");
             eltRestart.classList.remove("hidden");
           });
 
-          eltUninstall.addEventListener("click", () => {
-            addon.uninstall();
-            if (addon.pendingOperations == addon.PENDING_NONE) {
-              // Restartless add-on is now disabled.
-              return;
-            }
-            eltDisable.classList.add("hidden");
-            eltUninstall.classList.add("hidden");
-            eltRestart.classList.remove("hidden");
-          });
+          if (addon.permissions & AddonManager.PERM_CAN_UNINSTALL) {
+            // Some add-ons cannot be uninstalled, for instance if the
+            // install location is not user-writable.
+            let eltUninstall = document.createElement("button");
+            eltUninstall.textContent = "Uninstall";
+            eltSpan.appendChild(eltUninstall);
+
+            eltUninstall.addEventListener("click", () => {
+              addon.uninstall();
+              if (addon.pendingOperations == addon.PENDING_NONE) {
+                // Restartless add-on is now disabled.
+                return;
+              }
+              eltDisable.classList.add("hidden");
+              eltUninstall.classList.add("hidden");
+              eltRestart.classList.remove("hidden");
+            });
+          }
         });
       } else if (nature == "webpages") {
         eltSpan.appendChild(document.createElement("br"));
 
         let eltCloseTab = document.createElement("button");
         eltCloseTab.textContent = "Close tab";
         eltSpan.appendChild(eltCloseTab);
         let windowIds = delta.diff.windowIds;