tor-browser

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

commit 8a727550756a43f4a8bb3745e616f25705d660b8
parent 483b8505236bb03e3da03dc180a54c08ca85e3cd
Author: Harsheet <hsohaney@mozilla.com>
Date:   Fri, 24 Oct 2025 21:22:53 +0000

Bug 1995651 - Disable backup for users who have sanitizeOnShutdown turned on. r=fchasen

Differential Revision: https://phabricator.services.mozilla.com/D269500

Diffstat:
Mbrowser/components/backup/BackupService.sys.mjs | 22++++++++++++++++++++++
Mbrowser/components/backup/tests/browser/browser_settings.js | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
2 files changed, 80 insertions(+), 25 deletions(-)

diff --git a/browser/components/backup/BackupService.sys.mjs b/browser/components/backup/BackupService.sys.mjs @@ -629,6 +629,13 @@ export class BackupService extends EventTarget { }; } + if (Services.prefs.getBoolPref("privacy.sanitize.sanitizeOnShutdown")) { + return { + enabled: false, + reason: "Backup is disabled for users with sanitizeOnShutdown enabled.", + }; + } + return { enabled: true }; } @@ -655,6 +662,13 @@ export class BackupService extends EventTarget { }; } + if (Services.prefs.getBoolPref("privacy.sanitize.sanitizeOnShutdown")) { + return { + enabled: false, + reason: "Backup is disabled for users with sanitizeOnShutdown enabled.", + }; + } + return { enabled: true }; } @@ -3882,6 +3896,10 @@ export class BackupService extends EventTarget { BACKUP_RESTORE_ENABLED_PREF_NAME, this.#notifyStatusObservers ); + Services.prefs.addObserver( + "privacy.sanitize.sanitizeOnShutdown", + this.#notifyStatusObservers + ); lazy.NimbusFeatures.backupService.onUpdate(this.#notifyStatusObservers); } @@ -3894,6 +3912,10 @@ export class BackupService extends EventTarget { BACKUP_RESTORE_ENABLED_PREF_NAME, this.#notifyStatusObservers ); + Services.prefs.removeObserver( + "privacy.sanitize.sanitizeOnShutdown", + this.#notifyStatusObservers + ); } /** diff --git a/browser/components/backup/tests/browser/browser_settings.js b/browser/components/backup/tests/browser/browser_settings.js @@ -24,33 +24,62 @@ add_setup(async () => { */ add_task(async function test_preferences_visibility() { await BrowserTestUtils.withNewTab("about:preferences#sync", async browser => { + const sandbox = sinon.createSandbox(); let backupSection = - browser.contentDocument.querySelector("#dataBackupGroup"); + browser.contentDocument.querySelector("#dataBackupSection"); + let syncPane = gBrowser.contentWindow.gSyncPane; + let settings = browser.contentDocument.querySelector("backup-settings"); + + const spy = sandbox.spy(syncPane, "updateBackupUIVisibility"); + Services.obs.addObserver( + syncPane.updateBackupUIVisibility, + "backup-service-status-updated" + ); + Assert.ok(backupSection, "Found backup preferences section"); + const waitForCall = () => + BrowserTestUtils.waitForCondition( + () => spy.callCount >= 1, + `Waiting for updateBackupUIVisibility() to be called 1 time` + ); + // Our mochitest-browser tests are configured to have the section visible // by default. Assert.ok( BrowserTestUtils.isVisible(backupSection), "Backup section is visible" ); - }); - await SpecialPowers.pushPrefEnv({ - set: [[BACKUP_ARCHIVE_ENABLED_PREF, false]], - }); + await SpecialPowers.pushPrefEnv({ + set: [["privacy.sanitize.sanitizeOnShutdown", true]], + }); - await BrowserTestUtils.withNewTab("about:preferences#sync", async browser => { - let backupSection = - browser.contentDocument.querySelector("#dataBackupGroup"); - Assert.ok(backupSection, "Found backup preferences section"); + await waitForCall(); + + Assert.ok( + BrowserTestUtils.isHidden(backupSection), + "Backup section is not available" + ); + + await SpecialPowers.popPrefEnv(); + + await waitForCall(); Assert.ok( BrowserTestUtils.isVisible(backupSection), - "Backup section is still visible" + "Backup section is visible" + ); + + await SpecialPowers.pushPrefEnv({ + set: [[BACKUP_ARCHIVE_ENABLED_PREF, false]], + }); + + Assert.ok( + BrowserTestUtils.isVisible(backupSection), + "Backup section is now visible" ); - let settings = browser.contentDocument.querySelector("backup-settings"); let backupArchiveSection = settings.querySelector("#scheduled-backups"); Assert.ok(!backupArchiveSection, "Backup archive section is not available"); @@ -59,27 +88,31 @@ add_task(async function test_preferences_visibility() { settings.restoreFromBackupEl, "Backup restore section is available" ); - }); - await SpecialPowers.pushPrefEnv({ - set: [[BACKUP_RESTORE_ENABLED_PREF, false]], - }); - await BrowserTestUtils.withNewTab("about:preferences#sync", async browser => { - let settings = browser.contentDocument.querySelector("backup-settings"); + + await SpecialPowers.pushPrefEnv({ + set: [[BACKUP_RESTORE_ENABLED_PREF, false]], + }); + + await settings.updateComplete; + + Assert.ok( + BrowserTestUtils.isHidden(backupSection), + "Backup section is not available" + ); + Assert.ok( !settings.restoreFromBackupEl, "Backup Restore section is not available" ); - let backupSection = - browser.contentDocument.querySelector("#dataBackupGroup"); - Assert.ok( - BrowserTestUtils.isHidden(backupSection), - "Backup section is now hidden" + await SpecialPowers.popPrefEnv(); + await SpecialPowers.popPrefEnv(); + + Services.obs.removeObserver( + gBrowser.contentWindow.gSyncPane.updateBackupUIVisibility, + "backup-service-status-updated" ); }); - - await SpecialPowers.popPrefEnv(); - await SpecialPowers.popPrefEnv(); }); /**