Bug 1471795 - Part 14: Add reload/delete button for temporary extension. r?jdescottes draft
authorDaisuke Akatsuka <dakatsuka@mozilla.com>
Thu, 19 Jul 2018 18:10:42 +0900
changeset 820263 020e51245bb7c04bae1190d31764bd2732ed52d3
parent 820262 b67a99c62c8abacddf6dce8a150f38f5a18b5742
child 820264 18422f41f9f6667e3c959f80f335e7275a127283
push id116772
push userbmo:dakatsuka@mozilla.com
push dateThu, 19 Jul 2018 09:51:56 +0000
reviewersjdescottes
bugs1471795
milestone63.0a1
Bug 1471795 - Part 14: Add reload/delete button for temporary extension. r?jdescottes MozReview-Commit-ID: HYnpnW2iHvT
devtools/client/aboutdebugging-new/src/components/debugtarget/ExtensionItem.js
devtools/client/aboutdebugging-new/src/runtimes/runtime.js
devtools/client/aboutdebugging-new/src/runtimes/this-firefox.js
--- a/devtools/client/aboutdebugging-new/src/components/debugtarget/ExtensionItem.js
+++ b/devtools/client/aboutdebugging-new/src/components/debugtarget/ExtensionItem.js
@@ -19,37 +19,80 @@ class ExtensionItem extends DebugTargetI
     return debugTarget.name;
   }
 
   inspect() {
     const { debugTarget, runtime } = this.props;
     runtime.inspectExtension(debugTarget);
   }
 
+  async reload() {
+    const { debugTarget, runtime } = this.props;
+
+    try {
+      await runtime.sendRequest({
+        to: debugTarget.actor,
+        type: "reload"
+      });
+    } catch (e) {
+      throw new Error(`Error reloading extension ${ debugTarget.id } : ${ e.message }`);
+    }
+  }
+
+  async remove() {
+    const { debugTarget, runtime } = this.props;
+
+    try {
+      await runtime.removeExtension(debugTarget);
+    } catch (e) {
+      throw new Error(`Error removing addon ${ debugTarget.id } : ${ e.message }`);
+    }
+  }
+
   parseFileUri(url) {
     // Strip a leading slash from Windows drive letter URIs.
     // file:///home/foo ~> /home/foo
     // file:///C:/foo ~> C:/foo
     const windowsRegex = /^file:\/\/\/([a-zA-Z]:\/.*)/;
 
     if (windowsRegex.test(url)) {
       return windowsRegex.exec(url)[1];
     }
 
     return url.slice("file://".length);
   }
 
   renderActionComponents() {
-    return dom.button(
-      {
-        className: "debug-target-item__actions__extension-inspect",
-        onClick: e => this.inspect(),
-      },
-      "Inspect"
-    );
+    const { debugTarget } = this.props;
+
+    return [
+      dom.button(
+        {
+          className: "debug-target-item__actions__extension-inspect",
+          onClick: e => this.inspect(),
+        },
+        "Inspect"
+      ),
+      debugTarget.temporarilyInstalled
+        ? dom.button(
+          {
+            onClick: e => this.reload(),
+          },
+          "Reload"
+        )
+        : null,
+      debugTarget.temporarilyInstalled
+        ? dom.button(
+          {
+            onClick: e => this.remove(),
+          },
+          "Remove"
+        )
+        : null
+    ];
   }
 
   renderDetailComponents() {
     return dom.div(
       {
         className: "debug-target-item__info__detail__extension",
       },
       this.renderFilePath(),
--- a/devtools/client/aboutdebugging-new/src/runtimes/runtime.js
+++ b/devtools/client/aboutdebugging-new/src/runtimes/runtime.js
@@ -107,16 +107,25 @@ class Runtime {
    * Install temporary extension.
    * Subclass should override this method.
    */
   async installTemporaryExtension() {
     throw new Error("Subclass of Runtime should override installTemporaryExtension()");
   }
 
   /**
+   * Remove given debug target of extension which can get by getTabs().
+   * Subclass should override this method.
+   * @param {Object} - debug target
+   */
+  async removeExtension(_) {
+    throw new Error("Subclass of Runtime should override removeExtension()");
+  }
+
+  /**
    * Remove a tab update listener.
    * Subclass should override this method.
    * @param {function}
    */
   removeExtensionsUpdateListener(listener) {
     throw new Error("Subclass of Runtime should override " +
                     "removeExtensionsUpdateListener()");
   }
@@ -124,11 +133,20 @@ class Runtime {
   /**
    * Remove a tab update listener.
    * Subclass should override this method.
    * @param {function}
    */
   removeTabsUpdateListener(listener) {
     throw new Error("Subclass of Runtime should override removeTabsUpdateListener()");
   }
+
+  /**
+   * Send given request to this runtime.
+   * Subclass should override this method.
+   * @return {Object}
+   */
+  async sendRequest(params) {
+    throw new Error("Subclass of Runtime should override sendRequest()");
+  }
 }
 
 module.exports = Runtime;
--- a/devtools/client/aboutdebugging-new/src/runtimes/this-firefox.js
+++ b/devtools/client/aboutdebugging-new/src/runtimes/this-firefox.js
@@ -115,28 +115,37 @@ class ThisFirefox extends Runtime {
           resolve();
         } catch (e) {
           reject(e);
         }
       });
     });
   }
 
+  async removeExtension(debugTarget) {
+    const addon = await AddonManager.getAddonByID(debugTarget.id);
+    return addon && addon.uninstall();
+  }
+
   removeExtensionsUpdateListener(listener) {
     const index = this.extensionsListeners.indexOf(listener);
 
     if (index > -1) {
       this.extensionsListeners.splice(index, 1);
     }
   }
 
   removeTabsUpdateListener(listener) {
     this.client.removeListener("tabListChanged", listener);
   }
 
+  async sendRequest(params) {
+    return this.client.request(params);
+  }
+
   onExtensionsUpdated() {
     for (const listener of this.extensionsListeners) {
       listener();
     }
   }
 
   /**
    * Mandatory callback as AddonManager listener.