tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mbrowser/components/backup/BackupService.sys.mjs | 29++++++++++++-----------------
Mbrowser/components/backup/tests/browser/browser_settings.js | 27+--------------------------
Mbrowser/components/backup/tests/xpcshell/test_BackupService_enabled.js | 25-------------------------
Mbrowser/components/backup/tests/xpcshell/test_BackupService_regeneration.js | 17+++++++++++++++++
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 */