commit d9c897ca5c0a9585c60106e98dda1a828487277f
parent bdb7d7086eb7dbabbb632410a92e1273fde1407a
Author: David P. <daparks@mozilla.com>
Date: Wed, 29 Oct 2025 23:42:13 +0000
Bug 1990634: Part 5 - Another grab bag of small FxBackup bug fixes r=firefox-desktop-core-reviewers ,omc-reviewers,emcminn,cdupuis,home-newtab-reviewers,mossop,mconley
Like part 1, this is a sprawling set of small bug fixes that are needed to
get tests (that weren't running properly before) to pass with the other
patches in this bug. Fixes are:
* A number of async/await fixes in services and in tests.
* A bunch of missing popPrefEnv calls in browser_asrouter_targeting.js.
* The test activeNotifications_default_prompt_shown needs to wait for
a "visibilitychange" event so that the activity-stream React object has time
to update it's status (see `MESSAGE_NOTIFY_VISIBILITY` in
activity-stream.bundle.js).
Differential Revision: https://phabricator.services.mozilla.com/D270236
Diffstat:
6 files changed, 49 insertions(+), 11 deletions(-)
diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs
@@ -1658,7 +1658,7 @@ BrowserGlue.prototype = {
gBrowser.selectedTab = tab;
},
- async _showSetToDefaultSpotlight(message, browser) {
+ _showSetToDefaultSpotlight(message, browser) {
const config = {
type: "SHOW_SPOTLIGHT",
data: message,
@@ -1741,11 +1741,13 @@ BrowserGlue.prototype = {
this._showSetToDefaultSpotlight(message, win.gBrowser.selectedBrowser);
return;
}
+
+ // Intentionally don't await the returned user's response promise.
lazy.DefaultBrowserCheck.prompt(win);
}
await lazy.ASRouter.waitForInitialized;
- lazy.ASRouter.sendTriggerMessage({
+ await lazy.ASRouter.sendTriggerMessage({
browser: lazy.BrowserWindowTracker.getTopWindow({
allowFromInactiveWorkspace: true,
})?.gBrowser.selectedBrowser,
diff --git a/browser/components/asrouter/tests/browser/browser_asrouter_targeting.js b/browser/components/asrouter/tests/browser/browser_asrouter_targeting.js
@@ -321,6 +321,8 @@ add_task(async function check_canCreateSelectableProfiles() {
);
await ProfilesDatastoreService.resetProfileService(null);
+ await SpecialPowers.popPrefEnv();
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_hasSelectableProfiles() {
@@ -343,6 +345,7 @@ add_task(async function check_hasSelectableProfiles() {
message,
"should select correct item by hasSelectableProfiles"
);
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_usesFirefoxSync() {
@@ -359,6 +362,7 @@ add_task(async function check_usesFirefoxSync() {
message,
"should select correct item by usesFirefoxSync"
);
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_isFxAEnabled() {
@@ -374,6 +378,7 @@ add_task(async function check_isFxAEnabled() {
!(await ASRouterTargeting.findMatchingMessage({ messages: [message] })),
"should not select a message if fxa is disabled"
);
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_isFxAEnabled() {
@@ -390,6 +395,7 @@ add_task(async function check_isFxAEnabled() {
message,
"should select the correct message"
);
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_isFxASignedIn_false() {
@@ -414,6 +420,7 @@ add_task(async function check_isFxASignedIn_false() {
);
sandbox.restore();
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_isFxASignedIn_true() {
@@ -438,6 +445,7 @@ add_task(async function check_isFxASignedIn_true() {
);
sandbox.restore();
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_totalBookmarksCount() {
@@ -574,6 +582,7 @@ add_task(async function checkdevToolsOpenedCount() {
message,
"should select correct item by devToolsOpenedCount"
);
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_platformName() {
@@ -956,6 +965,8 @@ add_task(async function check_provider_cohorts() {
"bar",
"should have cohort bar for cfr"
);
+ await SpecialPowers.popPrefEnv();
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_xpinstall_enabled() {
@@ -967,6 +978,8 @@ add_task(async function check_xpinstall_enabled() {
// flip to true, check targeting reflects that
await pushPrefs(["xpinstall.enabled", true]);
is(await ASRouterTargeting.Environment.xpinstallEnabled, true);
+ await SpecialPowers.popPrefEnv();
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_current_tab_installed_as_web_app() {
@@ -1052,6 +1065,7 @@ add_task(async function check_hasAccessedFxAPanel() {
true,
"Should detect panel access"
);
+ await SpecialPowers.popPrefEnv();
});
add_task(async function checkCFRFeaturesUserPref() {
@@ -1070,6 +1084,7 @@ add_task(async function checkCFRFeaturesUserPref() {
message,
"should select correct item by cfrFeature"
);
+ await SpecialPowers.popPrefEnv();
});
add_task(async function checkCFRAddonsUserPref() {
@@ -1088,6 +1103,7 @@ add_task(async function checkCFRAddonsUserPref() {
message,
"should select correct item by cfrAddons"
);
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_blockedCountByType() {
@@ -1642,6 +1658,8 @@ add_task(async function test_migrationInteractions() {
ok(!(await ASRouterTargeting.Environment[getterName]));
await pushPrefs([pref, true]);
ok(await ASRouterTargeting.Environment[getterName]);
+ await SpecialPowers.popPrefEnv();
+ await SpecialPowers.popPrefEnv();
}
});
@@ -1673,6 +1691,10 @@ add_task(async function check_useEmbeddedMigrationWizard() {
]);
ok(!(await ASRouterTargeting.Environment.useEmbeddedMigrationWizard));
+ await SpecialPowers.popPrefEnv();
+ await SpecialPowers.popPrefEnv();
+ await SpecialPowers.popPrefEnv();
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_isMSIX() {
@@ -2013,6 +2035,7 @@ add_task(async function check_totalSearches() {
20,
"should return a value of 20"
);
+ await SpecialPowers.popPrefEnv();
});
add_task(async function checkisDefaultBrowserUncached() {
@@ -2077,6 +2100,7 @@ add_task(
false,
"activeNotifications should be false if the topic selection modal on newtab was last shown more than a minute ago"
);
+ await SpecialPowers.popPrefEnv();
}
);
@@ -2119,6 +2143,7 @@ add_task(
true,
"activeNotifications should be true if the topic selection modal on newtab was last shown less than a minute ago"
);
+ await SpecialPowers.popPrefEnv();
}
);
@@ -2150,8 +2175,13 @@ add_task(async function check_activeNotifications_newtabMessages() {
add_task(async function activeNotifications_default_prompt_shown() {
let sb = sinon.createSandbox();
+
const win = await BrowserTestUtils.openNewBrowserWindow();
+ let visibilityChange = new Promise(res =>
+ win.document.addEventListener("visibilitychange", res, { once: true })
+ );
+
sb.stub(DefaultBrowserCheck, "willCheckDefaultBrowser").returns(true);
const promptSpy = sb.spy(DefaultBrowserCheck, "prompt");
@@ -2159,6 +2189,10 @@ add_task(async function activeNotifications_default_prompt_shown() {
Assert.equal(promptSpy.callCount, 1, "default prompt should be called");
+ // activeNotifications are updated by visibilitychanges, so make sure we get
+ // one before testing it.
+ await visibilityChange;
+
is(
await ASRouterTargeting.Environment.activeNotifications,
true,
@@ -2285,8 +2319,8 @@ add_task(async function check_unhandledCampaignAction() {
before: async () => {
await pushPrefs([DID_HANDLE_CAMAPAIGN_ACTION_PREF, true]);
},
- after: () => {
- Services.prefs.clearUserPref(DID_HANDLE_CAMAPAIGN_ACTION_PREF);
+ after: async () => {
+ await SpecialPowers.popPrefEnv();
QueryCache.queries.UnhandledCampaignAction.expire();
},
},
@@ -2437,6 +2471,8 @@ add_task(async function check_isEncryptedBackup() {
true,
"should return true if the pref value is full"
);
+ await SpecialPowers.popPrefEnv();
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_backupArchiveEnabled() {
@@ -2464,6 +2500,7 @@ add_task(async function check_backupArchiveEnabled() {
// End the experiment.
await archiveExperiment();
+ await SpecialPowers.popPrefEnv();
});
add_task(async function check_backupRestoreEnabled() {
@@ -2491,4 +2528,5 @@ add_task(async function check_backupRestoreEnabled() {
// End the experiment.
await restoreExperiment();
+ await SpecialPowers.popPrefEnv();
});
diff --git a/browser/components/asrouter/tests/browser/browser_feature_callout_in_chrome.js b/browser/components/asrouter/tests/browser/browser_feature_callout_in_chrome.js
@@ -625,7 +625,7 @@ add_task(async function callout_not_shown_if_dialog_open() {
},
isSubDialog: true,
});
- DefaultBrowserCheck.prompt(win);
+ await DefaultBrowserCheck.prompt(win);
await dialogPromise;
await BrowserTestUtils.closeWindow(win);
diff --git a/browser/components/tests/browser/browser_default_browser_prompt.js b/browser/components/tests/browser/browser_default_browser_prompt.js
@@ -18,12 +18,12 @@ const { SpecialMessageActions } = ChromeUtils.importESModule(
);
const CHECK_PREF = "browser.shell.checkDefaultBrowser";
-function showAndWaitForModal(callback) {
+async function showAndWaitForModal(callback) {
const promise = BrowserTestUtils.promiseAlertDialog(null, undefined, {
callback,
isSubDialog: true,
});
- DefaultBrowserCheck.prompt(BrowserWindowTracker.getTopWindow());
+ await DefaultBrowserCheck.prompt(BrowserWindowTracker.getTopWindow());
return promise;
}
diff --git a/browser/extensions/newtab/lib/NewTabMessaging.sys.mjs b/browser/extensions/newtab/lib/NewTabMessaging.sys.mjs
@@ -145,7 +145,7 @@ export class NewTabMessaging {
}
}
- async onAction(action) {
+ onAction(action) {
switch (action.type) {
case at.INIT:
this.init();
diff --git a/browser/extensions/newtab/lib/Store.sys.mjs b/browser/extensions/newtab/lib/Store.sys.mjs
@@ -113,7 +113,7 @@ export class Store {
* to feeds when they're created.
* @param {Action} uninitAction An optional action for when feeds uninit.
*/
- async init(feedFactories, initAction, uninitAction) {
+ init(feedFactories, initAction, uninitAction) {
this._feedFactories = feedFactories;
this._initAction = initAction;
this._uninitAction = uninitAction;
@@ -143,8 +143,6 @@ export class Store {
/**
* uninit - Uninitalizes each feed, clears them, and destroys the message
* manager channel.
- *
- * @return {type} description
*/
uninit() {
if (this._uninitAction) {