bug 1282977 handle developer in manifest r=kmag
MozReview-Commit-ID: BsGflddsodd
--- a/toolkit/components/extensions/schemas/manifest.json
+++ b/toolkit/components/extensions/schemas/manifest.json
@@ -53,17 +53,17 @@
},
"description": {
"type": "string",
"optional": true,
"preprocess": "localize"
},
- "creator": {
+ "author": {
"type": "string",
"optional": true,
"preprocess": "localize"
},
"version": {
"type": "string",
"optional": false
@@ -175,17 +175,35 @@
},
"optional": true
},
"web_accessible_resources": {
"type": "array",
"items": { "type": "string" },
"optional": true
+ },
+
+ "developer": {
+ "type": "object",
+ "optional": true,
+ "properties": {
+ "name": {
+ "type": "string",
+ "optional": true,
+ "preprocess": "localize"
+ },
+ "url": {
+ "type": "string",
+ "optional": true,
+ "preprocess": "localize"
+ }
+ }
}
+
},
"additionalProperties": { "$ref": "UnrecognizedProperty" }
},
{
"id": "Permission",
"choices": [
{
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -971,21 +971,34 @@ var loadManifestFromWebManifest = Task.a
addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DEFAULT;
function getLocale(aLocale) {
// Use the raw manifest, here, since we need values with their
// localization placeholders still in place.
let rawManifest = extension.rawManifest;
+ let creator = rawManifest.author;
+ let homepageURL = rawManifest.homepage_url;
+
+ // Allow developer to override creator and homepage_url.
+ if (rawManifest.developer) {
+ if (rawManifest.developer.name) {
+ creator = rawManifest.developer.name;
+ }
+ if (rawManifest.developer.url) {
+ homepageURL = rawManifest.developer.url;
+ }
+ }
+
let result = {
name: extension.localize(rawManifest.name, aLocale),
description: extension.localize(rawManifest.description, aLocale),
- creator: extension.localize(rawManifest.creator, aLocale),
- homepageURL: extension.localize(rawManifest.homepage_url, aLocale),
+ creator: extension.localize(creator, aLocale),
+ homepageURL: extension.localize(homepageURL, aLocale),
developers: null,
translators: null,
contributors: null,
locales: [aLocale],
};
return result;
}
--- a/toolkit/mozapps/extensions/test/xpcshell/test_webextension.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_webextension.js
@@ -14,21 +14,21 @@ profileDir.append("extensions");
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42");
startupManager();
const { GlobalManager, Management } = Components.utils.import("resource://gre/modules/Extension.jsm", {});
function promiseAddonStartup() {
return new Promise(resolve => {
let listener = (evt, extension) => {
- Management.off("startup", listener);
+ Management.off("ready", listener);
resolve(extension);
};
- Management.on("startup", listener);
+ Management.on("ready", listener);
});
}
function promiseInstallWebExtension(aData) {
let addonFile = createTempWebExtensionFile(aData);
return promiseInstallAllFiles([addonFile]).then(() => {
Services.obs.notifyObservers(addonFile, "flush-cache-entry", null);
@@ -348,8 +348,57 @@ add_task(function* test_experiments_api(
let addon = addons.pop();
equal(addon.id, ID, "Add-on should be installed as an API extension");
addons = yield new Promise(resolve => AddonManager.getAddonsByTypes(["extension"], resolve));
equal(addons.pop().id, ID, "Add-on type should be aliased to extension");
addon.uninstall();
});
+
+add_task(function* developerShouldOverride() {
+ let addon = yield promiseInstallWebExtension({
+ manifest: {
+ default_locale: "en",
+ developer: {
+ name: "__MSG_name__",
+ url: "__MSG_url__"
+ },
+ author: "Will be overridden by developer",
+ homepage_url: "https://will.be.overridden",
+ },
+ files: {
+ "_locales/en/messages.json": `{
+ "name": {
+ "message": "en name"
+ },
+ "url": {
+ "message": "https://example.net/en"
+ }
+ }`
+ }
+ });
+
+ addon = yield promiseAddonByID(addon.id);
+ equal(addon.creator, "en name");
+ equal(addon.homepageURL, "https://example.net/en");
+ addon.uninstall();
+});
+
+add_task(function* developerEmpty() {
+ for (let developer of [{}, null, {name: null, url: null}]) {
+ let addon = yield promiseInstallWebExtension({
+ manifest: {
+ author: "Some author",
+ developer: developer,
+ homepage_url: "https://example.net",
+ manifest_version: 2,
+ name: "Web Extension Name",
+ version: "1.0",
+ }
+ });
+
+ addon = yield promiseAddonByID(addon.id);
+ equal(addon.creator, "Some author");
+ equal(addon.homepageURL, "https://example.net");
+ addon.uninstall();
+ }
+});
\ No newline at end of file