summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/extensions/test/xpcshell/test_QuarantinedDomains_AddonWrapper.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_QuarantinedDomains_AddonWrapper.js')
-rw-r--r--toolkit/mozapps/extensions/test/xpcshell/test_QuarantinedDomains_AddonWrapper.js207
1 files changed, 207 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_QuarantinedDomains_AddonWrapper.js b/toolkit/mozapps/extensions/test/xpcshell/test_QuarantinedDomains_AddonWrapper.js
new file mode 100644
index 0000000000..46312b192b
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_QuarantinedDomains_AddonWrapper.js
@@ -0,0 +1,207 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+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
+);