Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
const { QuarantinedDomains } = ChromeUtils.importESModule(
"resource://gre/modules/ExtensionPermissions.sys.mjs"
);
AddonTestUtils.init(this);
AddonTestUtils.overrideCertDB();
AddonTestUtils.usePrivilegedSignatures = id => id.startsWith("privileged");
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "42", "42");
add_setup(async () => {
await AddonTestUtils.promiseStartupManager();
});
function assertQuarantineIgnoredByUserPrefsRemoved() {
const { PREF_ADDONS_BRANCH_NAME } = QuarantinedDomains;
const prefBranch = Services.prefs.getBranch(PREF_ADDONS_BRANCH_NAME);
for (const prefSuffix of prefBranch.getChildList("")) {
Assert.equal(
prefBranch.getPrefType(prefSuffix),
prefBranch.PREF_INVALID,
`${PREF_ADDONS_BRANCH_NAME}${prefSuffix} pref should have been removed`
);
}
}
async function testQuarantineDomainsAddonWrapperProperties() {
// Make sure no extension is initially user exempted.
const prefBranch = Services.prefs.getBranch(
QuarantinedDomains.PREF_ADDONS_BRANCH_NAME
);
for (const leafName of prefBranch.getChildList("")) {
Services.prefs.clearUserPref(
QuarantinedDomains.PREF_ADDONS_BRANCH_NAME + leafName
);
}
const REGULAR_EXT_ID = "regular@ext.id";
const PRIVILEGE_EXT_ID = "privileged@ext.id";
const RECOMMENDED_EXT_ID = "recommended@ext.id";
const regularExt = ExtensionTestUtils.loadExtension({
useAddonManager: "permanent",
manifest: {
browser_specific_settings: { gecko: { id: REGULAR_EXT_ID } },
},
});
const privilegedExt = ExtensionTestUtils.loadExtension({
useAddonManager: "permanent",
manifest: {
browser_specific_settings: { gecko: { id: PRIVILEGE_EXT_ID } },
},
});
const testStartTime = Date.now();
// Keep the recommendations validity range used here in sync with
// the one used in test_recommendations.js.
const not_before = new Date(testStartTime - 3600000).toISOString();
const not_after = new Date(testStartTime + 3600000).toISOString();
const RECOMMENDATION_FILE_NAME = "mozilla-recommendation.json";
const recommendedExt = ExtensionTestUtils.loadExtension({
useAddonManager: "permanent",
manifest: {
browser_specific_settings: { gecko: { id: RECOMMENDED_EXT_ID } },
},
files: {
[RECOMMENDATION_FILE_NAME]: {
addon_id: RECOMMENDED_EXT_ID,
states: ["fake", "states"],
validity: { not_before, not_after },
},
},
});
await regularExt.startup();
await privilegedExt.startup();
await recommendedExt.startup();
function assertAddonWrapperProps(addon, expectedProps) {
const expectedPropNames = Object.keys(expectedProps);
if (!expectedPropNames.length) {
throw new Error("expectedProps shouldn't be empty");
}
for (const propName of expectedPropNames) {
Assert.deepEqual(
addon[propName],
expectedProps[propName],
`Got the expected value on ${propName} property from ${addon.id}`
);
}
}
const EXPECTED_PROPS_REGULAR_EXT = {
id: regularExt.id,
isPrivileged: false,
recommendationStates: [],
quarantineIgnoredByApp: false,
quarantineIgnoredByUser: false,
canChangeQuarantineIgnored: true,
};
const EXPECTED_PROPS_PRIVILEGED_EXT = {
id: privilegedExt.id,
isPrivileged: true,
recommendationStates: [],
// Expected to be true due to privileged signature.
quarantineIgnoredByApp: true,
quarantineIgnoredByUser: false,
// Expected to be false for app allowed.
canChangeQuarantineIgnored: false,
};
const EXPECTED_PROPS_RECOMMENDED_EXT = {
id: recommendedExt.id,
isPrivileged: false,
recommendationStates: ["fake", "states"],
// Expected to be true due to recommendationStates.
quarantineIgnoredByApp: true,
quarantineIgnoredByUser: false,
// Expected to be false for app allowed.
canChangeQuarantineIgnored: false,
};
assertAddonWrapperProps(regularExt.addon, EXPECTED_PROPS_REGULAR_EXT);
assertAddonWrapperProps(privilegedExt.addon, EXPECTED_PROPS_PRIVILEGED_EXT);
assertAddonWrapperProps(recommendedExt.addon, EXPECTED_PROPS_RECOMMENDED_EXT);
info("Verify quarantineIgnoredByUser property changed");
let promisePropChanged =
AddonTestUtils.promiseAddonEvent("onPropertyChanged");
regularExt.addon.quarantineIgnoredByUser = true;
assertAddonWrapperProps(regularExt.addon, {
...EXPECTED_PROPS_REGULAR_EXT,
quarantineIgnoredByUser: true,
});
info("Wait for onPropertyChanged listener to be called");
let [addon, props] = await promisePropChanged;
Assert.deepEqual(
{
addonId: addon.id,
props,
},
{
addonId: regularExt.id,
props: ["quarantineIgnoredByUser"],
},
"Got the expected params from onPropertyChanged listener call"
);
Services.prefs.clearUserPref(
QuarantinedDomains.getUserAllowedAddonIdPrefName(regularExt.id)
);
info("Verify canChangeQuarantineIgnored on quarantineDomainsEnabled false");
Services.prefs.setBoolPref("extensions.quarantinedDomains.enabled", false);
assertAddonWrapperProps(regularExt.addon, {
...EXPECTED_PROPS_REGULAR_EXT,
canChangeQuarantineIgnored: false,
});
Services.prefs.clearUserPref("extensions.quarantinedDomains.enabled");
assertAddonWrapperProps(regularExt.addon, EXPECTED_PROPS_REGULAR_EXT);
info("Verify canChangeQuarantineIgnored on uiDisabled true");
Services.prefs.setBoolPref("extensions.quarantinedDomains.uiDisabled", true);
assertAddonWrapperProps(regularExt.addon, {
...EXPECTED_PROPS_REGULAR_EXT,
canChangeQuarantineIgnored: false,
});
Services.prefs.clearUserPref("extensions.quarantinedDomains.uiDisabled");
assertAddonWrapperProps(regularExt.addon, EXPECTED_PROPS_REGULAR_EXT);
info(
"Verify that the per-addon quarantineIgnoredByUser pref is removed on addon uninstall"
);
promisePropChanged = AddonTestUtils.promiseAddonEvent("onPropertyChanged");
regularExt.addon.quarantineIgnoredByUser = true;
await promisePropChanged;
Assert.equal(
Services.prefs.getBoolPref(
QuarantinedDomains.getUserAllowedAddonIdPrefName(regularExt.id)
),
true,
"Expect the per-addon quarantineIgnoredByUser to be set"
);
await recommendedExt.unload();
await privilegedExt.unload();
await regularExt.unload();
assertQuarantineIgnoredByUserPrefsRemoved();
}
add_task(
{
pref_set: [
["extensions.quarantinedDomains.enabled", true],
["extensions.quarantinedDomains.uiDisabled", false],
],
},
testQuarantineDomainsAddonWrapperProperties
);