tor-browser

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

commit 12103fa10c380cf6a345dc57de8dc334bc7a9b6c
parent 968112b95873cc58490a0622c38acbda6730ffe1
Author: Harsheet <hsohaney@mozilla.com>
Date:   Wed, 15 Oct 2025 20:38:58 +0000

Bug 1993087 - Close the old profile when restoring from a backup. r=mconley

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

Diffstat:
Mbrowser/components/backup/actors/BackupUIChild.sys.mjs | 3+++
Mbrowser/components/backup/actors/BackupUIParent.sys.mjs | 20++++++++++++++++++++
Mbrowser/components/backup/tests/browser/browser_settings.js | 12++++++++++++
Mbrowser/components/backup/tests/browser/browser_settings_restore_from_backup.js | 22++++++++++++++++++++++
4 files changed, 57 insertions(+), 0 deletions(-)

diff --git a/browser/components/backup/actors/BackupUIChild.sys.mjs b/browser/components/backup/actors/BackupUIChild.sys.mjs @@ -101,6 +101,9 @@ export class BackupUIChild extends JSWindowActorChild { if (result.success) { event.target.restoreFromBackupDialogEl?.close(); + + // Since we always launch the new profile from this event, let's close the current instance now + this.sendAsyncMessage("QuitCurrentProfile"); } } else if (event.type == "BackupUI:RestoreFromBackupChooseFile") { this.sendAsyncMessage("RestoreFromBackupChooseFile"); diff --git a/browser/components/backup/actors/BackupUIParent.sys.mjs b/browser/components/backup/actors/BackupUIParent.sys.mjs @@ -240,6 +240,26 @@ export class BackupUIParent extends JSWindowActorParent { } else if (message.name == "EditBackupLocation") { const window = this.browsingContext.topChromeWindow; this.#bs.editBackupLocation(window); + } else if (message.name == "QuitCurrentProfile") { + // Notify windows that a quit has been requested. + let cancelQuit = Cc["@mozilla.org/supports-PRBool;1"].createInstance( + Ci.nsISupportsPRBool + ); + Services.obs.notifyObservers(cancelQuit, "quit-application-requested"); + if (cancelQuit.data) { + // Something blocked our attempt to quit. + return null; + } + + try { + Services.startup.quit(Services.startup.eAttemptQuit); + } catch (e) { + // let's silently resolve this error + lazy.logConsole.error( + `There was a problem while quitting the current profile: `, + e + ); + } } return null; diff --git a/browser/components/backup/tests/browser/browser_settings.js b/browser/components/backup/tests/browser/browser_settings.js @@ -242,6 +242,16 @@ add_task(async function test_restore_from_backup() { ); await restoreFromBackup.updateComplete; + + let quitObservedPromise = TestUtils.topicObserved( + "quit-application-requested", + subject => { + let cancelQuit = subject.QueryInterface(Ci.nsISupportsPRBool); + cancelQuit.data = true; + return true; + } + ); + restoreFromBackup.confirmButtonEl.click(); await restorePromise.then(e => { @@ -256,6 +266,8 @@ add_task(async function test_restore_from_backup() { ); }); + await quitObservedPromise; + Assert.ok( recoverFromBackupArchiveStub.calledOnce, "BackupService was called to start a recovery from a backup archive." diff --git a/browser/components/backup/tests/browser/browser_settings_restore_from_backup.js b/browser/components/backup/tests/browser/browser_settings_restore_from_backup.js @@ -56,6 +56,15 @@ add_task(async function test_restore_from_backup() { }); MockFilePicker.returnValue = MockFilePicker.returnOK; + let quitObservedPromise = TestUtils.topicObserved( + "quit-application-requested", + subject => { + let cancelQuit = subject.QueryInterface(Ci.nsISupportsPRBool); + cancelQuit.data = true; + return true; + } + ); + let settings = browser.contentDocument.querySelector("backup-settings"); await settings.updateComplete; @@ -145,6 +154,8 @@ add_task(async function test_restore_from_backup() { ); }); + await quitObservedPromise; + Assert.ok( recoverFromBackupArchiveStub.calledOnce, "BackupService was called to start a recovery from a backup archive." @@ -168,6 +179,15 @@ add_task(async function test_restore_in_progress() { .stub(bs, "recoverFromBackupArchive") .returns(recoverPromise); + let quitObservedPromise = TestUtils.topicObserved( + "quit-application-requested", + subject => { + let cancelQuit = subject.QueryInterface(Ci.nsISupportsPRBool); + cancelQuit.data = true; + return true; + } + ); + let settings = browser.contentDocument.querySelector("backup-settings"); await settings.updateComplete; @@ -279,6 +299,8 @@ add_task(async function test_restore_in_progress() { "Restore dialog should now be closed." ); + await quitObservedPromise; + sandbox.restore(); }); });