зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1225715: Part 6 - Remove redundant manifest type checking from XPIProvider. r=Mossop
--HG-- extra : commitid : Co3LqKFdyq6 extra : rebase_source : fe07d829cd3dd9bf0bee582e0367a9b1d49036de
This commit is contained in:
Родитель
278a332b02
Коммит
18ffdfa335
|
@ -1070,7 +1070,7 @@ Extension.prototype = extend(Object.create(ExtensionData.prototype), {
|
|||
|
||||
return this.runManifest(this.manifest);
|
||||
}).catch(e => {
|
||||
dump(`Extension error: ${e} ${e.filename || e.fileName}:${e.lineNumber}\n`);
|
||||
dump(`Extension error: ${e.message} ${e.filename || e.fileName}:${e.lineNumber} :: ${e.stack || new Error().stack}\n`);
|
||||
Cu.reportError(e);
|
||||
|
||||
ExtensionManagement.shutdownExtension(this.uuid);
|
||||
|
|
|
@ -248,8 +248,6 @@ function mustSign(aType) {
|
|||
return REQUIRE_SIGNING || Preferences.get(PREF_XPI_SIGNATURES_REQUIRED, false);
|
||||
}
|
||||
|
||||
const INTEGER = /^[1-9]\d*$/;
|
||||
|
||||
// Keep track of where we are in startup for telemetry
|
||||
// event happened during XPIDatabase.startup()
|
||||
const XPI_STARTING = "XPIStarting";
|
||||
|
@ -862,48 +860,17 @@ var loadManifestFromWebManifest = Task.async(function*(aUri) {
|
|||
|
||||
let manifest = yield extension.readManifest();
|
||||
|
||||
function findProp(obj, current, properties) {
|
||||
if (properties.length == 0)
|
||||
return obj;
|
||||
// Read the list of available locales, and pre-load messages for
|
||||
// all locales.
|
||||
let locales = yield extension.initAllLocales();
|
||||
|
||||
let field = properties[0];
|
||||
current += "." + field;
|
||||
if (!obj || !(field in obj)) {
|
||||
throw new Error("Manifest file was missing required property " + current.substring(1));
|
||||
}
|
||||
|
||||
return findProp(obj[field], current, properties.slice(1));
|
||||
}
|
||||
|
||||
function getProp(path, type = "String") {
|
||||
let val = findProp(manifest, "", path.split("."));
|
||||
|
||||
if ({}.toString.call(val) != `[object ${type}]`)
|
||||
throw new SyntaxError(`Expected property ${path} to be of type ${type}`);
|
||||
return val;
|
||||
}
|
||||
|
||||
function getOptionalProp(path, defValue = null, type = "String") {
|
||||
try {
|
||||
return getProp(path, type);
|
||||
}
|
||||
catch (e) {
|
||||
if (e instanceof SyntaxError)
|
||||
throw e;
|
||||
return defValue;
|
||||
}
|
||||
}
|
||||
|
||||
let mVersion = getProp("manifest_version", "Number");
|
||||
if (mVersion != 2) {
|
||||
throw new Error("Expected manifest_version to be 2 but was " + mVersion);
|
||||
}
|
||||
// If there were any errors loading the extension, bail out now.
|
||||
if (extension.errors.length)
|
||||
throw new Error("Extension is invalid");
|
||||
|
||||
let addon = new AddonInternal();
|
||||
addon.id = getProp("applications.gecko.id");
|
||||
if (!gIDTest.test(addon.id))
|
||||
throw new Error("Illegal add-on ID " + addon.id);
|
||||
addon.version = getProp("version");
|
||||
addon.id = manifest.applications.gecko.id;
|
||||
addon.version = manifest.version;
|
||||
addon.type = "webextension";
|
||||
addon.unpack = false;
|
||||
addon.strictCompatibility = true;
|
||||
|
@ -911,41 +878,23 @@ var loadManifestFromWebManifest = Task.async(function*(aUri) {
|
|||
addon.hasBinaryComponents = false;
|
||||
addon.multiprocessCompatible = true;
|
||||
addon.internalName = null;
|
||||
addon.updateURL = getOptionalProp("applications.gecko.update_url");
|
||||
addon.updateURL = manifest.applications.gecko.update_url;
|
||||
addon.updateKey = null;
|
||||
addon.optionsURL = null;
|
||||
addon.optionsType = null;
|
||||
addon.aboutURL = null;
|
||||
|
||||
if (addon.updateURL != null) {
|
||||
// Make sure that the URL is a valid absolute URL, and that anyone is
|
||||
// allowed to load it.
|
||||
let ssm = Services.scriptSecurityManager;
|
||||
ssm.checkLoadURIStrWithPrincipal(ssm.createNullPrincipal({}),
|
||||
addon.updateURL,
|
||||
ssm.DISALLOW_INHERIT_PRINCIPAL);
|
||||
}
|
||||
|
||||
// WebExtensions don't use iconURLs
|
||||
addon.iconURL = null;
|
||||
addon.icon64URL = null;
|
||||
addon.icons = {};
|
||||
|
||||
let icons = getOptionalProp("icons", null, "Object");
|
||||
if (icons) {
|
||||
// filter out invalid (non-integer) size keys
|
||||
Object.keys(icons)
|
||||
.filter((size) => INTEGER.test(size))
|
||||
.map((size) => parseInt(size, 10))
|
||||
.forEach((size) => addon.icons[size] = icons[size]);
|
||||
}
|
||||
addon.icons = manifest.icons || {};
|
||||
|
||||
addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DEFAULT;
|
||||
|
||||
function getLocale(aLocale) {
|
||||
let result = {
|
||||
name: extension.localize(getProp("name"), aLocale),
|
||||
description: extension.localize(getOptionalProp("description"), aLocale),
|
||||
name: extension.localize(manifest.name, aLocale),
|
||||
description: extension.localize(manifest.description, aLocale),
|
||||
creator: null,
|
||||
homepageURL: null,
|
||||
|
||||
|
@ -957,14 +906,6 @@ var loadManifestFromWebManifest = Task.async(function*(aUri) {
|
|||
return result;
|
||||
}
|
||||
|
||||
// Read the list of available locales, and pre-load messages for
|
||||
// all locales.
|
||||
let locales = yield extension.initAllLocales();
|
||||
|
||||
// If there were any errors loading the extension, bail out now.
|
||||
if (extension.errors.length)
|
||||
throw new Error("Extension is invalid");
|
||||
|
||||
addon.defaultLocale = getLocale(extension.defaultLocale);
|
||||
addon.locales = Array.from(locales.keys(), getLocale);
|
||||
|
||||
|
@ -972,9 +913,9 @@ var loadManifestFromWebManifest = Task.async(function*(aUri) {
|
|||
|
||||
addon.targetApplications = [{
|
||||
id: TOOLKIT_ID,
|
||||
minVersion: getOptionalProp("application.gecko.strict_min_version",
|
||||
AddonManagerPrivate.webExtensionsMinPlatformVersion),
|
||||
maxVersion: getOptionalProp("application.gecko.strict_max_version", "*"),
|
||||
minVersion: (manifest.applications.gecko.strict_min_version ||
|
||||
AddonManagerPrivate.webExtensionsMinPlatformVersion),
|
||||
maxVersion: manifest.applications.gecko.strict_max_version || "*",
|
||||
}];
|
||||
|
||||
addon.targetPlatforms = [];
|
||||
|
|
|
@ -125,6 +125,7 @@ add_task(function*() {
|
|||
}, profileDir);
|
||||
|
||||
startupManager();
|
||||
yield promiseAddonStartup();
|
||||
|
||||
let addon = yield promiseAddonByID(ID);
|
||||
do_check_neq(addon, null);
|
||||
|
|
|
@ -11,6 +11,19 @@ profileDir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
|
|||
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42");
|
||||
startupManager();
|
||||
|
||||
const { Management } = Components.utils.import("resource://gre/modules/Extension.jsm", {});
|
||||
|
||||
function promiseAddonStartup() {
|
||||
return new Promise(resolve => {
|
||||
let listener = (extension) => {
|
||||
Management.off("startup", listener);
|
||||
resolve(extension);
|
||||
};
|
||||
|
||||
Management.on("startup", listener);
|
||||
});
|
||||
}
|
||||
|
||||
// Test simple icon set parsing
|
||||
add_task(function*() {
|
||||
writeWebManifestForExtension({
|
||||
|
@ -31,6 +44,7 @@ add_task(function*() {
|
|||
}, profileDir);
|
||||
|
||||
yield promiseRestartManager();
|
||||
yield promiseAddonStartup();
|
||||
|
||||
let uri = do_get_addon_root_uri(profileDir, ID);
|
||||
|
||||
|
@ -62,6 +76,7 @@ add_task(function*() {
|
|||
|
||||
// check if icons are persisted through a restart
|
||||
yield promiseRestartManager();
|
||||
yield promiseAddonStartup();
|
||||
|
||||
addon = yield promiseAddonByID(ID);
|
||||
do_check_neq(addon, null);
|
||||
|
@ -94,6 +109,7 @@ add_task(function*() {
|
|||
}, profileDir);
|
||||
|
||||
yield promiseRestartManager();
|
||||
yield promiseAddonStartup();
|
||||
|
||||
let addon = yield promiseAddonByID(ID);
|
||||
do_check_neq(addon, null);
|
||||
|
@ -132,6 +148,7 @@ add_task(function*() {
|
|||
}, profileDir);
|
||||
|
||||
yield promiseRestartManager();
|
||||
yield promiseAddonStartup();
|
||||
|
||||
let addon = yield promiseAddonByID(ID);
|
||||
do_check_neq(addon, null);
|
||||
|
|
Загрузка…
Ссылка в новой задаче