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:
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();
});
});