Skip to content

Instantly share code, notes, and snippets.

@kumar303
Created March 15, 2016 16:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kumar303/e26a44d4f769443a3b68 to your computer and use it in GitHub Desktop.
Save kumar303/e26a44d4f769443a3b68 to your computer and use it in GitHub Desktop.
diff --git a/devtools/client/aboutdebugging/components/addons-tab.js b/devtools/client/aboutdebugging/components/addons-tab.js
--- a/devtools/client/aboutdebugging/components/addons-tab.js
+++ b/devtools/client/aboutdebugging/components/addons-tab.js
@@ -78,17 +78,18 @@ module.exports = createClass({
updateAddonsList() {
AddonManager.getAllAddons(addons => {
let extensions = addons.filter(addon => addon.isDebuggable).map(addon => {
return {
name: addon.name,
icon: addon.iconURL || ExtensionIcon,
type: addon.type,
- addonID: addon.id
+ addonID: addon.id,
+ isRestartless: addon.isRestartless
};
});
this.setState({ extensions });
});
},
/**
* Mandatory callback as AddonManager listener.
diff --git a/devtools/client/aboutdebugging/components/target.js b/devtools/client/aboutdebugging/components/target.js
--- a/devtools/client/aboutdebugging/components/target.js
+++ b/devtools/client/aboutdebugging/components/target.js
@@ -11,30 +11,33 @@ loader.lazyRequireGetter(this, "TargetFa
loader.lazyRequireGetter(this, "gDevTools",
"devtools/client/framework/devtools", true);
loader.lazyRequireGetter(this, "Toolbox",
"devtools/client/framework/toolbox", true);
loader.lazyImporter(this, "BrowserToolboxProcess",
"resource://devtools/client/framework/ToolboxProcess.jsm");
+const { AddonManager } = require("resource://gre/modules/AddonManager.jsm");
const Services = require("Services");
const { createClass, DOM: dom } =
require("devtools/client/shared/vendor/react");
const Strings = Services.strings.createBundle(
"chrome://devtools/locale/aboutdebugging.properties");
module.exports = createClass({
displayName: "Target",
render() {
let { target, debugDisabled } = this.props;
let isServiceWorker = (target.type === "serviceworker");
let isRunning = (!isServiceWorker || target.workerActor);
+ let isReloadable = (target.type === "extension" &&
+ target.isRestartless);
return dom.div({ className: "target" },
dom.img({
className: "target-icon",
role: "presentation",
src: target.icon }),
dom.div({ className: "target-details" },
dom.div({ className: "target-name" }, target.name)
),
@@ -50,16 +53,22 @@ module.exports = createClass({
className: "debug-button",
onClick: this.debug,
disabled: debugDisabled,
}, Strings.GetStringFromName("debug")) :
dom.button({
className: "start-button",
onClick: this.start
}, Strings.GetStringFromName("start"))
+ ),
+ (isReloadable ?
+ dom.button({
+ onClick: this.reloadExtension
+ }, Strings.GetStringFromName("reload")) :
+ null
)
);
},
debug() {
let { target } = this.props;
switch (target.type) {
case "extension":
@@ -87,16 +96,22 @@ module.exports = createClass({
if (target.workerActor) {
client.request({
to: target.workerActor,
type: "push"
});
}
},
+ reloadExtension() {
+ AddonManager.getAddonByID(this.props.target.addonID, addon => {
+ addon.reload();
+ });
+ },
+
start() {
let { client, target } = this.props;
if (target.type === "serviceworker" && !target.workerActor) {
client.request({
to: target.registrationActor,
type: "start"
});
}
diff --git a/devtools/client/locales/en-US/aboutdebugging.properties b/devtools/client/locales/en-US/aboutdebugging.properties
--- a/devtools/client/locales/en-US/aboutdebugging.properties
+++ b/devtools/client/locales/en-US/aboutdebugging.properties
@@ -8,16 +8,17 @@ start = Start
addons = Add-ons
addonDebugging.label = Enable add-on debugging
addonDebugging.tooltip = Turning this on will allow you to debug add-ons and various other parts of the browser chrome
addonDebugging.moreInfo = more info
loadTemporaryAddon = Load Temporary Add-on
extensions = Extensions
selectAddonFromFile2 = Select Manifest File or Package (.xpi)
+reload = Reload
workers = Workers
serviceWorkers = Service Workers
sharedWorkers = Shared Workers
otherWorkers = Other Workers
nothing = Nothing yet.
diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -6983,16 +6983,21 @@ AddonWrapper.prototype = {
if(this.isActive && addon.icon64URL){
icons[64] = addon.icon64URL;
}
Object.freeze(icons);
return icons;
},
+ get isRestartless() {
+ let addon = addonFor(this);
+ return addon.bootstrap;
+ },
+
get screenshots() {
let addon = addonFor(this);
let repositoryAddon = addon._repositoryAddon;
if (repositoryAddon && ("screenshots" in repositoryAddon)) {
let repositoryScreenshots = repositoryAddon.screenshots;
if (repositoryScreenshots && repositoryScreenshots.length > 0)
return repositoryScreenshots;
}
@@ -7269,16 +7274,22 @@ AddonWrapper.prototype = {
addon._hasResourceCache.set(aPath, false);
return false;
}
finally {
zipReader.close();
}
},
+ reload: function() {
+ this.userDisabled = true;
+ flushStartupCache();
+ this.userDisabled = false;
+ },
+
/**
* Returns a URI to the selected resource or to the add-on bundle if aPath
* is null. URIs to the bundle will always be file: URIs. URIs to resources
* will be file: URIs if the add-on is unpacked or jar: URIs if the add-on is
* still an XPI file.
*
* @param aPath
* The path in the add-on to get the URI for or null to get a URI to
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment