Bug 1356027 Add pref to disable non-MPC extensions r=mossop

MozReview-Commit-ID: 9TdZf3hnLZl

--HG--
extra : rebase_source : bebe88b10ff9afe7b4fda93025cd85435ad16913
This commit is contained in:
Andrew Swan 2017-04-12 22:13:49 -07:00
parent 72a0aed474
commit ab7396c05a
3 changed files with 81 additions and 0 deletions

View File

@ -4789,6 +4789,7 @@ pref("xpinstall.signatures.required", false);
pref("extensions.alwaysUnpack", false);
pref("extensions.minCompatiblePlatformVersion", "2.0");
pref("extensions.webExtensionsMinPlatformVersion", "42.0a1");
pref("extensions.allow-non-mpc-extensions", true);
// Other webextensions prefs
pref("extensions.webextensions.keepStorageOnUninstall", false);

View File

@ -132,6 +132,7 @@ const PREF_E10S_BLOCK_ENABLE = "extensions.e10sBlocksEnabling";
const PREF_E10S_ADDON_BLOCKLIST = "extensions.e10s.rollout.blocklist";
const PREF_E10S_ADDON_POLICY = "extensions.e10s.rollout.policy";
const PREF_E10S_HAS_NONEXEMPT_ADDON = "extensions.e10s.rollout.hasAddon";
const PREF_ALLOW_NON_MPC = "extensions.allow-non-mpc-extensions";
const PREF_EM_MIN_COMPAT_APP_VERSION = "extensions.minCompatibleAppVersion";
const PREF_EM_MIN_COMPAT_PLATFORM_VERSION = "extensions.minCompatiblePlatformVersion";
@ -185,6 +186,8 @@ const XPI_SIGNATURE_CHECK_PERIOD = 24 * 60 * 60;
XPCOMUtils.defineConstant(this, "DB_SCHEMA", 19);
XPCOMUtils.defineLazyPreferenceGetter(this, "ALLOW_NON_MPC", PREF_ALLOW_NON_MPC);
const NOTIFICATION_TOOLBOXPROCESS_LOADED = "ToolboxProcessLoaded";
// Properties that exist in the install manifest
@ -805,6 +808,11 @@ function isUsableAddon(aAddon) {
return false;
}
if (!ALLOW_NON_MPC && aAddon.multiprocessCompatible !== true) {
logger.warn(`disabling ${aAddon.id} since it is not multiprocess compatible`);
return false;
}
if (AddonManager.checkCompatibility) {
if (!aAddon.isCompatible) {
logger.warn(`Add-on ${aAddon.id} is not compatible with application version.`);
@ -2815,6 +2823,7 @@ this.XPIProvider = {
Services.prefs.addObserver(PREF_E10S_ADDON_POLICY, this);
if (!REQUIRE_SIGNING)
Services.prefs.addObserver(PREF_XPI_SIGNATURES_REQUIRED, this);
Services.prefs.addObserver(PREF_ALLOW_NON_MPC, this);
Services.obs.addObserver(this, NOTIFICATION_FLUSH_PERMISSIONS);
// Cu.isModuleLoaded can fail here for external XUL apps where there is
@ -4478,6 +4487,7 @@ this.XPIProvider = {
this.updateAddonAppDisabledStates();
break;
case PREF_XPI_SIGNATURES_REQUIRED:
case PREF_ALLOW_NON_MPC:
this.updateAddonAppDisabledStates();
break;

View File

@ -102,6 +102,76 @@ for (let bootstrap of [false, true]) {
}
}
add_task(async function test_disable() {
const PREF = "extensions.allow-non-mpc-extensions";
const ID_MPC = "mpc@tests.mozilla.org";
const ID_NON_MPC = "non-mpc@tests.mozilla.org";
let addonData = {
name: "Test Add-on",
version: "1.0",
bootstrap: true,
targetApplications: [{
id: "xpcshell@tests.mozilla.org",
minVersion: "1",
maxVersion: "1"
}]
}
let xpi1 = createTempXPIFile(Object.assign({
id: ID_MPC,
multiprocessCompatible: true,
}, addonData));
let xpi2 = createTempXPIFile(Object.assign({
id: ID_NON_MPC,
multiprocessCompatible: false,
}, addonData));
async function testOnce(initialAllow) {
if (initialAllow !== undefined) {
Services.prefs.setBoolPref(PREF, initialAllow);
}
let install1 = await AddonManager.getInstallForFile(xpi1);
let install2 = await AddonManager.getInstallForFile(xpi2);
await promiseCompleteAllInstalls([install1, install2]);
let [addon1, addon2] = await AddonManager.getAddonsByIDs([ID_MPC, ID_NON_MPC]);
do_check_neq(addon1, null);
do_check_eq(addon1.multiprocessCompatible, true);
do_check_eq(addon1.appDisabled, false);
do_check_neq(addon2, null);
do_check_eq(addon2.multiprocessCompatible, false);
do_check_eq(addon2.appDisabled, initialAllow === false);
// Flip the allow-non-mpc preference
let newValue = (initialAllow === true) ? false : true;
Services.prefs.setBoolPref(PREF, newValue);
// the mpc extension should never become appDisabled
do_check_eq(addon1.appDisabled, false);
// The non-mpc extension should become disabled if we don't allow non-mpc
do_check_eq(addon2.appDisabled, !newValue);
// Flip the pref back and check appDisabled
Services.prefs.setBoolPref(PREF, !newValue);
do_check_eq(addon1.appDisabled, false);
do_check_eq(addon2.appDisabled, newValue);
addon1.uninstall();
addon2.uninstall();
}
await testOnce(undefined);
await testOnce(true);
await testOnce(false);
Services.prefs.clearUserPref(PREF);
});
function run_test() {
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1");
startupManager();