Bug 1471795 - Part 14: Add reload/delete button for temporary extension. r?jdescottes
MozReview-Commit-ID: HYnpnW2iHvT
--- 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.