tor-browser

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

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:
Mbrowser/components/BrowserGlue.sys.mjs | 6++++--
Mbrowser/components/asrouter/tests/browser/browser_asrouter_targeting.js | 42++++++++++++++++++++++++++++++++++++++++--
Mbrowser/components/asrouter/tests/browser/browser_feature_callout_in_chrome.js | 2+-
Mbrowser/components/tests/browser/browser_default_browser_prompt.js | 4++--
Mbrowser/extensions/newtab/lib/NewTabMessaging.sys.mjs | 2+-
Mbrowser/extensions/newtab/lib/Store.sys.mjs | 4+---
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) {