commit ec1f4eddbcab61ba1c352aac135379a3168f385c
parent 58f0aa28513a9b514c819e83e826ce02402cc2a6
Author: Harsheet <hsohaney@mozilla.com>
Date: Mon, 20 Oct 2025 16:26:16 +0000
Bug 1991951 - (part 3) Connect backup prefs to enterprise policies. r=cdupuis,fluent-reviewers,fchasen,bolsson,mkaply
Differential Revision: https://phabricator.services.mozilla.com/D267856
Diffstat:
5 files changed, 171 insertions(+), 0 deletions(-)
diff --git a/browser/components/backup/tests/browser/browser.toml b/browser/components/backup/tests/browser/browser.toml
@@ -9,6 +9,8 @@ support-files = [
"head.js",
]
+["browser_backup_policies.js"]
+
["browser_password_validation_inputs.js"]
["browser_settings.js"]
diff --git a/browser/components/backup/tests/browser/browser_backup_policies.js b/browser/components/backup/tests/browser/browser_backup_policies.js
@@ -0,0 +1,107 @@
+/* Any copyright is dedicated to the Public Domain.
+https://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const { EnterprisePolicyTesting, PoliciesPrefTracker } =
+ ChromeUtils.importESModule(
+ "resource://testing-common/EnterprisePolicyTesting.sys.mjs"
+ );
+
+function checkPrefs(
+ expectedBackupServiceState,
+ expectedArchiveEnabledState,
+ expectedRestoreEnabledState
+) {
+ Assert.equal(
+ Services.prefs.getBoolPref("browser.backup.enabled"),
+ expectedBackupServiceState,
+ `Backup Service state should match the expected state`
+ );
+ Assert.equal(
+ Services.prefs.getBoolPref("browser.backup.archive.enabled"),
+ expectedArchiveEnabledState,
+ `Archive state should match the expected state`
+ );
+ Assert.equal(
+ Services.prefs.getBoolPref("browser.backup.restore.enabled"),
+ expectedRestoreEnabledState,
+ `Restore state should match the expected state`
+ );
+}
+
+add_setup(async () => {
+ // let's set the prefs to a default so that we can see if the policies
+ // adhere to the defaults when they aren't present
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.backup.enabled", false],
+ ["browser.backup.archive.enabled", false],
+ ["browser.backup.restore.enabled", true],
+ ],
+ });
+
+ registerCleanupFunction(async () => {
+ await SpecialPowers.popPrefEnv();
+ });
+});
+
+add_task(async function test_backup_disabled_enterprise_policies() {
+ PoliciesPrefTracker.start();
+ await EnterprisePolicyTesting.setupPolicyEngineWithJson({
+ policies: {
+ BrowserDataBackup: false,
+ },
+ });
+
+ checkPrefs(false, false, false);
+ PoliciesPrefTracker.stop();
+});
+
+add_task(async function test_backup_archive_enabled_enterprise_policies() {
+ PoliciesPrefTracker.start();
+ await EnterprisePolicyTesting.setupPolicyEngineWithJson({
+ policies: {
+ BrowserDataBackup: {
+ AllowBackup: true,
+ },
+ },
+ });
+
+ checkPrefs(true, true, true);
+ PoliciesPrefTracker.stop();
+});
+
+add_task(async function test_backup_restore_enabled_enterprise_policies() {
+ PoliciesPrefTracker.start();
+ await EnterprisePolicyTesting.setupPolicyEngineWithJson({
+ policies: {
+ BrowserDataBackup: {
+ AllowRestore: true,
+ },
+ },
+ });
+
+ checkPrefs(true, false, true);
+ PoliciesPrefTracker.stop();
+});
+
+add_task(async function test_backup_service_disabled_enterprise_policies() {
+ PoliciesPrefTracker.start();
+
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.backup.enabled", true]],
+ });
+
+ await EnterprisePolicyTesting.setupPolicyEngineWithJson({
+ policies: {
+ BrowserDataBackup: {
+ AllowBackup: false,
+ AllowRestore: false,
+ },
+ },
+ });
+
+ checkPrefs(false, false, false);
+ PoliciesPrefTracker.stop();
+});
diff --git a/browser/components/enterprisepolicies/Policies.sys.mjs b/browser/components/enterprisepolicies/Policies.sys.mjs
@@ -395,6 +395,55 @@ export var Policies = {
},
},
+ BrowserDataBackup: {
+ onBeforeUIStartup(manager, param) {
+ if (typeof param === "boolean") {
+ setAndLockPref("browser.backup.enabled", param);
+ setAndLockPref("browser.backup.archive.enabled", param);
+ setAndLockPref("browser.backup.restore.enabled", param);
+ } else {
+ const hasBackup = "AllowBackup" in param;
+ const hasRestore = "AllowRestore" in param;
+ let serviceValue;
+
+ if (hasBackup && hasRestore) {
+ // both present but could be set to false
+ serviceValue = param.AllowBackup || param.AllowRestore;
+ } else if (hasBackup && param.AllowBackup) {
+ // only AllowBackup is true
+ serviceValue = true;
+ } else if (hasRestore && param.AllowRestore) {
+ // only AllowRestore is true
+ serviceValue = true;
+ }
+
+ if (serviceValue !== undefined) {
+ PoliciesUtils.setDefaultPref(
+ "browser.backup.enabled",
+ serviceValue,
+ true
+ );
+ }
+
+ if (hasBackup) {
+ PoliciesUtils.setDefaultPref(
+ "browser.backup.archive.enabled",
+ param.AllowBackup,
+ true
+ );
+ }
+
+ if (hasRestore) {
+ PoliciesUtils.setDefaultPref(
+ "browser.backup.restore.enabled",
+ param.AllowRestore,
+ true
+ );
+ }
+ }
+ },
+ },
+
CaptivePortal: {
onBeforeAddons(manager, param) {
setAndLockPref("network.captive-portal-service.enabled", param);
diff --git a/browser/components/enterprisepolicies/content/aboutPolicies.js b/browser/components/enterprisepolicies/content/aboutPolicies.js
@@ -296,6 +296,7 @@ function generateDocumentation() {
SecurityDevices: "SecurityDevices2",
SkipTermsOfUse: "SkipTermsOfUse2",
WindowsSSO: "Windows10SSO",
+ Backup: "BrowserDataBackup",
};
let deprecated_policies = ["DisablePocket"];
diff --git a/browser/components/enterprisepolicies/schemas/policies-schema.json b/browser/components/enterprisepolicies/schemas/policies-schema.json
@@ -167,6 +167,18 @@
}
},
+ "BrowserDataBackup": {
+ "type": ["boolean", "object"],
+ "properties": {
+ "AllowBackup": {
+ "type": "boolean"
+ },
+ "AllowRestore": {
+ "type": "boolean"
+ }
+ }
+ },
+
"CaptivePortal": {
"type": "boolean"
},