tor-browser

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

commit 4fd36a25bb8ca453b819ae0f3bf019ea7dece108
parent 7d6c3e772f2bf02724ae077ef0795c8565fa34b0
Author: Duncan McIntosh <dmcintosh@mozilla.com>
Date:   Mon,  3 Nov 2025 21:53:03 +0000

Bug 1997391 - Part 2: Add internalReason and specific tests for archive and restore disable statuses. r=cdupuis

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

Diffstat:
Mbrowser/components/backup/BackupService.sys.mjs | 7+++++++
Mbrowser/components/backup/metrics.yaml | 3++-
Mbrowser/components/backup/tests/xpcshell/test_BackupService_enabled.js | 84++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 92 insertions(+), 2 deletions(-)

diff --git a/browser/components/backup/BackupService.sys.mjs b/browser/components/backup/BackupService.sys.mjs @@ -628,6 +628,7 @@ export class BackupService extends EventTarget { return { enabled: false, reason: "Archiving a profile disabled by user pref.", + internalReason: "pref", }; } @@ -635,6 +636,7 @@ export class BackupService extends EventTarget { return { enabled: false, reason: "Backup is disabled for users with sanitizeOnShutdown enabled.", + internalReason: "sanitizeOnShutdown", }; } @@ -643,6 +645,7 @@ export class BackupService extends EventTarget { enabled: false, reason: "Archiving a profile is disabled because the user has created selectable profiles.", + internalReason: "selectable profiles", }; } @@ -662,6 +665,7 @@ export class BackupService extends EventTarget { return { enabled: false, reason: "Restore from backup disabled remotely.", + internalReason: "nimbus", }; } @@ -669,6 +673,7 @@ export class BackupService extends EventTarget { return { enabled: false, reason: "Restoring a profile disabled by user pref.", + internalReason: "pref", }; } @@ -676,6 +681,7 @@ export class BackupService extends EventTarget { return { enabled: false, reason: "Backup is disabled for users with sanitizeOnShutdown enabled.", + internalReason: "sanitizeOnShutdown", }; } @@ -684,6 +690,7 @@ export class BackupService extends EventTarget { enabled: false, reason: "Restoring a profile is disabled because the user has created selectable profiles.", + internalReason: "selectable profiles", }; } diff --git a/browser/components/backup/metrics.yaml b/browser/components/backup/metrics.yaml @@ -680,7 +680,8 @@ browser.backup: type: string description: > Only set if `browser.backup.enabled` is `false`. Possible reasons are - "nimbus", "pref" (non-Nimbus), "policy", "managedProfiles". + "nimbus", "pref" (non-Nimbus), "policy", "sanitizeOnShutdown", + "selectable profiles". bugs: - https://bugzilla.mozilla.org/show_bug.cgi?id=1992808 data_reviews: diff --git a/browser/components/backup/tests/xpcshell/test_BackupService_enabled.js b/browser/components/backup/tests/xpcshell/test_BackupService_enabled.js @@ -11,6 +11,10 @@ const { NimbusTestUtils } = ChromeUtils.importESModule( ); const BACKUP_DIR_PREF_NAME = "browser.backup.location"; +const BACKUP_ARCHIVE_ENABLED_PREF_NAME = "browser.backup.archive.enabled"; +const BACKUP_RESTORE_ENABLED_PREF_NAME = "browser.backup.restore.enabled"; +const SANITIZE_ON_SHUTDOWN_PREF_NAME = "privacy.sanitize.sanitizeOnShutdown"; +const SELECTABLE_PROFILES_CREATED_PREF_NAME = "browser.profiles.created"; add_setup(async () => { setupProfile(); @@ -59,9 +63,46 @@ add_task(async function test_archive_killswitch_enrollment() { }); }); +add_task(async function test_archive_enabled_pref() { + await archiveTemplate({ + internalReason: "pref", + async disable() { + Services.prefs.setBoolPref(BACKUP_ARCHIVE_ENABLED_PREF_NAME, false); + }, + async enable() { + Services.prefs.setBoolPref(BACKUP_ARCHIVE_ENABLED_PREF_NAME, true); + }, + }); +}); + +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", + async disable() { + Services.prefs.setBoolPref(SELECTABLE_PROFILES_CREATED_PREF_NAME, true); + }, + async enable() { + Services.prefs.setBoolPref(SELECTABLE_PROFILES_CREATED_PREF_NAME, false); + }, + }); +}); + add_task(async function test_restore_killswitch_enrollment() { let cleanupExperiment; await restoreTemplate({ + internalReason: "nimbus", async disable() { cleanupExperiment = await NimbusTestUtils.enrollWithFeatureConfig({ featureId: "backupService", @@ -74,6 +115,42 @@ add_task(async function test_restore_killswitch_enrollment() { }); }); +add_task(async function test_restore_enabled_pref() { + await restoreTemplate({ + internalReason: "pref", + async disable() { + Services.prefs.setBoolPref(BACKUP_RESTORE_ENABLED_PREF_NAME, false); + }, + async enable() { + Services.prefs.setBoolPref(BACKUP_RESTORE_ENABLED_PREF_NAME, true); + }, + }); +}); + +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", + async disable() { + Services.prefs.setBoolPref(SELECTABLE_PROFILES_CREATED_PREF_NAME, true); + }, + async enable() { + Services.prefs.setBoolPref(SELECTABLE_PROFILES_CREATED_PREF_NAME, false); + }, + }); +}); + async function archiveTemplate({ internalReason, disable, enable }) { const bs = BackupService.get(); @@ -130,7 +207,7 @@ async function archiveTemplate({ internalReason, disable, enable }) { await IOUtils.remove(backup.archivePath); } -async function restoreTemplate({ disable, enable }) { +async function restoreTemplate({ internalReason, disable, enable }) { const bs = BackupService.get(); const backup = await bs.createBackup(); @@ -150,6 +227,11 @@ async function restoreTemplate({ disable, enable }) { !bs.restoreEnabledStatus.enabled, "The backup service should report that restoring is now disabled." ); + Assert.equal( + bs.restoreEnabledStatus.internalReason, + internalReason, + "`archiveEnabledStatus` should report that it is disabled." + ); await Assert.rejects( bs.recoverFromBackupArchive(