commit d94b0b02b72143fab4c92892d1a67f27f3b24c59
parent 304dffc6e7c0d15086051272fd01d757d60e14d5
Author: Harsheet <hsohaney@mozilla.com>
Date: Wed, 17 Dec 2025 02:02:22 +0000
Bug 1994875 - Trigger a backup regeneration when sanitizeOnShutdown status is changed. r=mconley
Differential Revision: https://phabricator.services.mozilla.com/D273656
Diffstat:
4 files changed, 30 insertions(+), 68 deletions(-)
diff --git a/browser/components/backup/BackupService.sys.mjs b/browser/components/backup/BackupService.sys.mjs
@@ -46,6 +46,7 @@ const MAXIMUM_NUMBER_OF_UNREMOVABLE_STAGING_ITEMS_PREF_NAME =
const CREATED_MANAGED_PROFILES_PREF_NAME = "browser.profiles.created";
const RESTORED_BACKUP_METADATA_PREF_NAME =
"browser.backup.restored-backup-metadata";
+const SANITIZE_ON_SHUTDOWN_PREF_NAME = "privacy.sanitize.sanitizeOnShutdown";
const SCHEMAS = Object.freeze({
BACKUP_MANIFEST: 1,
@@ -686,14 +687,6 @@ export class BackupService extends EventTarget {
};
}
- if (Services.prefs.getBoolPref("privacy.sanitize.sanitizeOnShutdown")) {
- return {
- enabled: false,
- reason: "Backup is disabled for users with sanitizeOnShutdown enabled.",
- internalReason: "sanitizeOnShutdown",
- };
- }
-
if (lazy.SelectableProfileService.hasCreatedSelectableProfiles()) {
return {
enabled: false,
@@ -759,14 +752,6 @@ export class BackupService extends EventTarget {
};
}
- if (Services.prefs.getBoolPref("privacy.sanitize.sanitizeOnShutdown")) {
- return {
- enabled: false,
- reason: "Backup is disabled for users with sanitizeOnShutdown enabled.",
- internalReason: "sanitizeOnShutdown",
- };
- }
-
if (lazy.SelectableProfileService.hasCreatedSelectableProfiles()) {
return {
enabled: false,
@@ -1129,7 +1114,7 @@ export class BackupService extends EventTarget {
return [
BACKUP_ARCHIVE_ENABLED_PREF_NAME,
BACKUP_RESTORE_ENABLED_PREF_NAME,
- "privacy.sanitize.sanitizeOnShutdown",
+ SANITIZE_ON_SHUTDOWN_PREF_NAME,
CREATED_MANAGED_PROFILES_PREF_NAME,
];
}
@@ -4105,6 +4090,7 @@ export class BackupService extends EventTarget {
Services.obs.addObserver(this.#observer, "session-cookie-changed");
Services.obs.addObserver(this.#observer, "newtab-linkBlocked");
Services.obs.addObserver(this.#observer, "quit-application-granted");
+ Services.prefs.addObserver(SANITIZE_ON_SHUTDOWN_PREF_NAME, this.#observer);
}
/**
@@ -4141,6 +4127,10 @@ export class BackupService extends EventTarget {
Services.obs.removeObserver(this.#observer, "session-cookie-changed");
Services.obs.removeObserver(this.#observer, "newtab-linkBlocked");
Services.obs.removeObserver(this.#observer, "quit-application-granted");
+ Services.prefs.removeObserver(
+ SANITIZE_ON_SHUTDOWN_PREF_NAME,
+ this.#observer
+ );
this.#observer = null;
this.#regenerationDebouncer.disarm();
@@ -4216,6 +4206,11 @@ export class BackupService extends EventTarget {
}
break;
}
+ case "nsPref:changed": {
+ if (data == SANITIZE_ON_SHUTDOWN_PREF_NAME) {
+ this.#debounceRegeneration();
+ }
+ }
}
}
diff --git a/browser/components/backup/tests/browser/browser_settings.js b/browser/components/backup/tests/browser/browser_settings.js
@@ -37,31 +37,6 @@ add_task(async function test_preferences_visibility() {
});
await SpecialPowers.pushPrefEnv({
- set: [["privacy.sanitize.sanitizeOnShutdown", true]],
- });
-
- await BrowserTestUtils.withNewTab("about:preferences#sync", async browser => {
- let settings = browser.contentDocument.querySelector("backup-settings");
-
- Assert.ok(
- !settings.restoreSectionEl && !settings.archiveSectionEl,
- "Backup section is not available when sanitizeOnShutdown is enabled"
- );
- });
-
- await SpecialPowers.popPrefEnv();
-
- await BrowserTestUtils.withNewTab("about:preferences#sync", async browser => {
- let settings = browser.contentDocument.querySelector("backup-settings");
-
- Assert.ok(
- BrowserTestUtils.isVisible(settings.restoreSectionEl) &&
- BrowserTestUtils.isVisible(settings.archiveSectionEl),
- "Backup section is visible now"
- );
- });
-
- await SpecialPowers.pushPrefEnv({
set: [[BACKUP_ARCHIVE_ENABLED_PREF, false]],
});
@@ -71,7 +46,7 @@ add_task(async function test_preferences_visibility() {
Assert.ok(
BrowserTestUtils.isVisible(settings.restoreSectionEl) &&
!settings.archiveSectionEl,
- "Backup section is still visible since restore is enabled"
+ "Backup section is visible since restore is enabled"
);
});
diff --git a/browser/components/backup/tests/xpcshell/test_BackupService_enabled.js b/browser/components/backup/tests/xpcshell/test_BackupService_enabled.js
@@ -17,7 +17,6 @@ const BACKUP_ARCHIVE_ENABLED_OVERRIDE_PREF_NAME =
const BACKUP_RESTORE_ENABLED_PREF_NAME = "browser.backup.restore.enabled";
const BACKUP_RESTORE_ENABLED_OVERRIDE_PREF_NAME =
"browser.backup.restore.overridePlatformCheck";
-const SANITIZE_ON_SHUTDOWN_PREF_NAME = "privacy.sanitize.sanitizeOnShutdown";
const SELECTABLE_PROFILES_CREATED_PREF_NAME = "browser.profiles.created";
add_setup(async () => {
@@ -117,18 +116,6 @@ add_task(async function test_archive_policy() {
});
});
-add_task(async function test_archive_sanitize_on_shutdown() {
- await archiveTemplate({
- internalReason: "sanitizeOnShutdown",
- async disable() {
- Services.prefs.setBoolPref(SANITIZE_ON_SHUTDOWN_PREF_NAME, true);
- },
- async enable() {
- Services.prefs.setBoolPref(SANITIZE_ON_SHUTDOWN_PREF_NAME, false);
- },
- });
-});
-
add_task(async function test_archive_selectable_profiles() {
await archiveTemplate({
internalReason: "selectable profiles",
@@ -260,18 +247,6 @@ add_task(async function test_restore_policy() {
});
});
-add_task(async function test_restore_sanitize_on_shutdown() {
- await restoreTemplate({
- internalReason: "sanitizeOnShutdown",
- async disable() {
- Services.prefs.setBoolPref(SANITIZE_ON_SHUTDOWN_PREF_NAME, true);
- },
- async enable() {
- Services.prefs.setBoolPref(SANITIZE_ON_SHUTDOWN_PREF_NAME, false);
- },
- });
-});
-
add_task(async function test_restore_selectable_profiles() {
await restoreTemplate({
internalReason: "selectable profiles",
diff --git a/browser/components/backup/tests/xpcshell/test_BackupService_regeneration.js b/browser/components/backup/tests/xpcshell/test_BackupService_regeneration.js
@@ -146,6 +146,7 @@ async function expectRegeneration(taskFn, msg) {
// Creating a new backup will only occur if scheduled backups are enabled,
// so let's set the pref...
Services.prefs.setBoolPref("browser.backup.scheduled.enabled", true);
+ Services.prefs.setBoolPref("browser.backup.archive.enabled", true);
// But also stub out `onIdle` so that we don't get any interference during
// our test by the idle service.
sandbox.stub(bs, "onIdle").returns();
@@ -626,6 +627,22 @@ add_task(async function test_newtab_link_blocked() {
});
/**
+ * Tests that backup regeneration occurs when sanitizeOnShutdown is enabled
+ * or disabled
+ */
+add_task(async function test_sanitizeOnShutdown_regeneration() {
+ await expectRegeneration(() => {
+ Services.prefs.setBoolPref("privacy.sanitize.sanitizeOnShutdown", true);
+ }, "Saw a regeneration when sanitizeOnShutdown was enabled");
+
+ await expectRegeneration(() => {
+ Services.prefs.setBoolPref("privacy.sanitize.sanitizeOnShutdown", false);
+ }, "Saw a regeneration when sanitizeOnShutdown was disabled");
+
+ Services.prefs.clearUserPref("privacy.sanitize.sanitizeOnShutdown");
+});
+
+/**
* Tests that setting up a regeneration without archiveEnabledStatus being true
* leads to NO regeneration upon data mutation
*/