diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 61fa14dd7c30..776e4ab379bb 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -1788,11 +1788,6 @@ pref("browser.partnerlink.campaign.topsites", "amzn_2020_a1"); // Activates preloading of the new tab url. pref("browser.newtab.preload", true); -// If an on-train limited rollout of the preonboarding modal is enabled, the -// percentage of the Mac, Linux, and MSIX population to enroll. Default to 25% of -// population (2500 / 10000). -pref("browser.preonboarding.onTrainRolloutPopulation", 2500); - // Show "Download Firefox for mobile" QR code modal on newtab pref("browser.newtabpage.activity-stream.mobileDownloadModal.enabled", false); pref("browser.newtabpage.activity-stream.mobileDownloadModal.variant-a", false); diff --git a/browser/base/content/test/general/browser_datachoices_notification.js b/browser/base/content/test/general/browser_datachoices_notification.js index 1fdc81d80562..b104df8335a3 100644 --- a/browser/base/content/test/general/browser_datachoices_notification.js +++ b/browser/base/content/test/general/browser_datachoices_notification.js @@ -22,8 +22,7 @@ const PREF_ACCEPTED_POLICY_DATE = PREF_BRANCH + "dataSubmissionPolicyNotifiedTime"; const PREF_TOS_ROLLOUT_POPULATION = "browser.preonboarding.onTrainRolloutPopulation"; -const PREF_TOS_ROLLOUT_ENROLLED = - "browser.preonboarding.enrolledInOnTrainRollout"; +const PREF_TOS_ENABLED = "browser.preonboarding.enabled"; const PREF_TELEMETRY_LOG_LEVEL = "toolkit.telemetry.log.level"; @@ -124,6 +123,7 @@ add_setup(async function () { const isFirstRun = Preferences.get(PREF_FIRST_RUN, true); const bypassNotification = Preferences.get(PREF_BYPASS_NOTIFICATION, true); const currentPolicyVersion = Preferences.get(PREF_CURRENT_POLICY_VERSION, 1); + const TOSEnabled = Preferences.get(PREF_TOS_ENABLED, false); // Register a cleanup function to reset our preferences. registerCleanupFunction(() => { @@ -131,9 +131,7 @@ add_setup(async function () { Preferences.set(PREF_BYPASS_NOTIFICATION, bypassNotification); Preferences.set(PREF_CURRENT_POLICY_VERSION, currentPolicyVersion); Preferences.reset(PREF_TELEMETRY_LOG_LEVEL); - Preferences.reset(PREF_TOS_ROLLOUT_ENROLLED); - Preferences.reset(PREF_TOS_ROLLOUT_POPULATION); - + Preferences.set(PREF_TOS_ENABLED, TOSEnabled); return closeAllNotifications(); }); @@ -144,9 +142,8 @@ add_setup(async function () { // Ensure this isn't the first run, because then we open the first run page. Preferences.set(PREF_FIRST_RUN, false); TelemetryReportingPolicy.testUpdateFirstRun(); - // Do not trigger ToS modal for Linux, Mac, and MSIX builds - Preferences.set(PREF_TOS_ROLLOUT_ENROLLED, false); - Preferences.set(PREF_TOS_ROLLOUT_POPULATION, 0); + // Do not enable the TOS modal + Preferences.set(PREF_TOS_ENABLED, false); }); function clearAcceptedPolicy() { diff --git a/browser/components/asrouter/modules/OnboardingMessageProvider.sys.mjs b/browser/components/asrouter/modules/OnboardingMessageProvider.sys.mjs index 11ddabcb1eeb..8864c2aecb74 100644 --- a/browser/components/asrouter/modules/OnboardingMessageProvider.sys.mjs +++ b/browser/components/asrouter/modules/OnboardingMessageProvider.sys.mjs @@ -1408,7 +1408,7 @@ const BASE_MESSAGES = () => [ const PREONBOARDING_MESSAGES = () => [ { - id: "ON_TRAIN_ROLLOUT", + id: "NEW_USER_TOU_ONBOARDING", enabled: true, requireAction: true, currentPolicyVersion: 3, diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index 2cce3eab2b51..1807707adc9c 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -3751,11 +3751,15 @@ pref("toolkit.legacyUserProfileCustomizations.stylesheets", false); pref("datareporting.policy.dataSubmissionEnabled", true); pref("datareporting.policy.dataSubmissionPolicyNotifiedTime", "0"); pref("datareporting.policy.dataSubmissionPolicyAcceptedVersion", 0); - pref("datareporting.policy.dataSubmissionPolicyBypassNotification", false); pref("datareporting.policy.currentPolicyVersion", 2); pref("datareporting.policy.minimumPolicyVersion", 1); pref("datareporting.policy.minimumPolicyVersion.channel-beta", 2); pref("datareporting.policy.firstRunURL", "https://www.mozilla.org/privacy/firefox/"); + #ifdef MOZILLA_OFFICIAL + pref("datareporting.policy.dataSubmissionPolicyBypassNotification", false); + #else + pref("datareporting.policy.dataSubmissionPolicyBypassNotification", true); + #endif #endif #ifdef MOZ_SERVICES_HEALTHREPORT diff --git a/toolkit/components/nimbus/FeatureManifest.yaml b/toolkit/components/nimbus/FeatureManifest.yaml index 8fd08a79bfbb..17d3d83f57fe 100644 --- a/toolkit/components/nimbus/FeatureManifest.yaml +++ b/toolkit/components/nimbus/FeatureManifest.yaml @@ -769,12 +769,6 @@ preonboarding: fallbackPref: datareporting.policy.firstRunURL description: >- URL of browser tab to be opened on first run instead of infobar. - onTrainRolloutPopulation: - type: int - fallbackPref: browser.preonboarding.onTrainRolloutPopulation - description: >- - If an on-train limited rollout is enabled, the percentage of the population to enroll - moreFromMozilla: description: "New page on about:preferences to suggest more Mozilla products" diff --git a/toolkit/components/telemetry/app/TelemetryReportingPolicy.sys.mjs b/toolkit/components/telemetry/app/TelemetryReportingPolicy.sys.mjs index 247461836446..432e1a7460a5 100644 --- a/toolkit/components/telemetry/app/TelemetryReportingPolicy.sys.mjs +++ b/toolkit/components/telemetry/app/TelemetryReportingPolicy.sys.mjs @@ -13,7 +13,6 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs", - ExperimentManager: "resource://nimbus/lib/ExperimentManager.sys.mjs", TelemetrySend: "resource://gre/modules/TelemetrySend.sys.mjs", NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs", OnboardingMessageProvider: @@ -721,64 +720,6 @@ var TelemetryReportingPolicyImpl = { }); }, - async _configureFromOnTrainRollout() { - const ENROLLMENT_PREF = "browser.preonboarding.enrolledInOnTrainRollout"; - - const platformSupported = - AppConstants.platform == "linux" || - AppConstants.platform == "macosx" || - (AppConstants.platform === "win" && - Services.sysinfo.getProperty("hasWinPackageId", false)); - if (!platformSupported) { - return; - } - - let enrolled; - // Only enroll new users - if (this.isFirstRun()) { - const count = this._nimbusVariables.onTrainRolloutPopulation; - if (!count) { - this._log.trace( - `_configureFromOnTrainRollout: User not enrolled in on-train rollout - population is 0, not setting preferences` - ); - return; - } - const bucketConfig = { - count, - namespace: "firefox-desktop-preonboarding-on-train-rollout-1", - randomizationUnit: "normandy_id", - start: 0, - total: 10000, - }; - - enrolled = - await lazy.ExperimentManager.isInBucketAllocation(bucketConfig); - - if (enrolled) { - Services.prefs.setBoolPref(ENROLLMENT_PREF, enrolled); - } - } else { - enrolled = Services.prefs.getBoolPref(ENROLLMENT_PREF, false); - } - - if (enrolled) { - const preonboardingMessage = - lazy.OnboardingMessageProvider.getPreonboardingMessages().find( - m => m.id === "ON_TRAIN_ROLLOUT" - ); - - this._nimbusVariables = preonboardingMessage; - - this._log.trace( - `_configureFromOnTrainRollout: User enrolled in on-train rollout, will set preferences` - ); - } else { - this._log.trace( - `_configureFromOnTrainRollout: User not enrolled in on-train rollout, not setting preferences` - ); - } - }, - /** * Capture Nimbus configuration: record feature variables for future use and * set Gecko preferences based on values. @@ -787,7 +728,23 @@ var TelemetryReportingPolicyImpl = { this._nimbusVariables = lazy.NimbusFeatures.preonboarding.getAllVariables(); if (this._nimbusVariables.enabled === null) { - await this._configureFromOnTrainRollout(); + const preonboardingMessage = + lazy.OnboardingMessageProvider.getPreonboardingMessages().find( + m => m.id === "NEW_USER_TOU_ONBOARDING" + ); + // Use default message variables, overriding with values from any set + // fallback prefs. + this._nimbusVariables = { + ...preonboardingMessage, + ...Object.fromEntries( + Object.entries(this._nimbusVariables).filter( + ([_, value]) => value !== null + ) + ), + }; + this._log.trace( + `_configureFromNimbus: using default preonboarding message` + ); } if (this._nimbusVariables.enabled) { diff --git a/toolkit/components/telemetry/tests/unit/test_TelemetryReportingPolicy.js b/toolkit/components/telemetry/tests/unit/test_TelemetryReportingPolicy.js index f8afd0a29e95..572e8da2a1cb 100644 --- a/toolkit/components/telemetry/tests/unit/test_TelemetryReportingPolicy.js +++ b/toolkit/components/telemetry/tests/unit/test_TelemetryReportingPolicy.js @@ -8,7 +8,6 @@ ChromeUtils.defineESModuleGetters(this, { AppConstants: "resource://gre/modules/AppConstants.sys.mjs", - ClientEnvironment: "resource://normandy/lib/ClientEnvironment.sys.mjs", ExperimentAPI: "resource://nimbus/ExperimentAPI.sys.mjs", ExperimentFakes: "resource://testing-common/NimbusTestUtils.sys.mjs", ExperimentManager: "resource://nimbus/lib/ExperimentManager.sys.mjs", @@ -33,30 +32,6 @@ const TEST_CHANNEL = "TestChannelABC"; const PREF_MINIMUM_CHANNEL_POLICY_VERSION = TelemetryUtils.Preferences.MinimumPolicyVersion + ".channel-" + TEST_CHANNEL; -const ON_TRAIN_ROLLOUT_SUPPORTED_PLATFORM = - AppConstants.platform == "linux" || - AppConstants.platform == "macosx" || - (AppConstants.platform === "win" && - Services.sysinfo.getProperty("hasWinPackageId", false)); - -const ON_TRAIN_ROLLOUT_POPULATION_PREF = - "browser.preonboarding.onTrainRolloutPopulation"; - -const ON_TRAIN_ROLLOUT_ENROLLMENT_PREF = - "browser.preonboarding.enrolledInOnTrainRollout"; - -const ON_TRAIN_TEST_RECIPE = { - slug: "new-onboarding-experience-on-train-rollout-phase-1", - bucketConfig: { - count: 100, - namespace: "firefox-desktop-preonboarding-on-train-rollout-1", - randomizationUnit: "normandy_id", - start: 0, - total: 10000, - }, - branches: [{ slug: "treatment", ratio: 100 }], -}; - function fakeShowPolicyTimeout(set, clear) { Policy.setShowInfobarTimeout = set; Policy.clearShowInfobarTimeout = clear; @@ -169,6 +144,10 @@ add_task(skipIfNotBrowser(), async function test_firstRun() { const OTHER_RUNS_TIMEOUT_MSEC = 10 * 1000; // 10s Services.prefs.clearUserPref(TelemetryUtils.Preferences.FirstRun); + // The new user TOS modal is now enabled by default, so the infobar will only + // show if preonboarding is explicitly turned off via nimbus variable or its + // fallback pref. + Services.prefs.setBoolPref("browser.preonboarding.enabled", false); let promiseTimeout = () => new Promise(resolve => { @@ -199,6 +178,8 @@ add_task(skipIfNotBrowser(), async function test_firstRun() { OTHER_RUNS_TIMEOUT_MSEC, "The infobar display timeout should be 10s on other runs." ); + + Services.prefs.clearUserPref("browser.preonboarding.enabled"); }); add_task(async function test_prefs() { @@ -709,89 +690,26 @@ add_task( } ); -const getOnTrainRolloutModalStub = async ({ - shouldEnroll, - isFirstRun, - isEnrolled, -}) => { - Services.prefs.setIntPref( - ON_TRAIN_ROLLOUT_POPULATION_PREF, - ON_TRAIN_TEST_RECIPE.bucketConfig.count - ); - Services.prefs.setBoolPref(ON_TRAIN_ROLLOUT_ENROLLMENT_PREF, isEnrolled); - Services.prefs.setBoolPref(TelemetryUtils.Preferences.FirstRun, isFirstRun); - - const testIDs = await ExperimentManager.generateTestIds(ON_TRAIN_TEST_RECIPE); - let experimentId = shouldEnroll ? testIDs.treatment : testIDs.notInExperiment; - sinon.stub(ClientEnvironment, "userId").get(() => experimentId); - let modalStub = sinon.stub(Policy, "showModal").returns(true); - - fakeResetAcceptedPolicy(); - TelemetryReportingPolicy.reset(); - let p = Policy.delayedSetup(); - Policy.fakeSessionRestoreNotification(); - fakeInteractWithModal(); - await p; - - const doCleanup = () => { - sinon.restore(); - fakeResetAcceptedPolicy(); - Services.prefs.clearUserPref(ON_TRAIN_ROLLOUT_POPULATION_PREF); - Services.prefs.clearUserPref(ON_TRAIN_ROLLOUT_ENROLLMENT_PREF); - }; - - return { modalStub, doCleanup }; -}; - add_task( skipIfNotBrowser(), - async function test_onTrainRollout_configuration_supportedOS_should_enroll() { - if (!ON_TRAIN_ROLLOUT_SUPPORTED_PLATFORM) { - info( - "Skipping supported OS test because current platform is not Linux, Mac, or Win MSIX" - ); - return; - } + async function test_default_modal_shows_when_not_enrolled_in_experiment() { + let modalStub = sinon.stub(Policy, "showModal").returns(true); - const { modalStub, doCleanup } = await getOnTrainRolloutModalStub({ - shouldEnroll: true, - isFirstRun: true, - isEnrolled: false, - }); + fakeResetAcceptedPolicy(); + TelemetryReportingPolicy.reset(); + let p = Policy.delayedSetup(); + Policy.fakeSessionRestoreNotification(); + fakeInteractWithModal(); + await p; Assert.equal( modalStub.callCount, 1, - "showModal is invoked once if enrolled in rollout" + "showModal is invoked once when not enrolled in an experiemnt" ); - doCleanup(); - } -); - -add_task( - skipIfNotBrowser(), - async function test_onTrainRollout_configuration_supportedOS_should_not_enroll() { - if (!ON_TRAIN_ROLLOUT_SUPPORTED_PLATFORM) { - info( - "Skipping supported OS test because current platform is not Linux, Mac, or Win MSIX" - ); - return; - } - - const { modalStub, doCleanup } = await getOnTrainRolloutModalStub({ - shouldEnroll: false, - isFirstRun: true, - isEnrolled: false, - }); - - Assert.equal( - modalStub.callCount, - 0, - "showModal is not invoked if not enrolled in rollout" - ); - - doCleanup(); + sinon.restore(); + fakeResetAcceptedPolicy(); } ); @@ -827,7 +745,7 @@ add_task( await p; Assert.ok( - unblockSpy.calledOnce, + unblockSpy.callCount >= blockSpy.callCount, "Jump list should be unblocked after user interacts with modal" ); @@ -836,81 +754,3 @@ add_task( sinon.restore(); } ); - -add_task( - skipIfNotBrowser(), - async function test_onTrainRollout_configuration_unsupportedOS() { - if (ON_TRAIN_ROLLOUT_SUPPORTED_PLATFORM) { - info( - "Skipping unsupported OS test because current platform is supported" - ); - return; - } - - const { modalStub, doCleanup } = await getOnTrainRolloutModalStub({ - shouldEnroll: true, - isFirstRun: true, - isEnrolled: false, - }); - - Assert.equal( - modalStub.callCount, - 0, - "showModal is not invoked on unsupported OS even if on-train rollouts are enabled and user would otherwise be enrolled" - ); - - doCleanup(); - } -); - -add_task( - skipIfNotBrowser(), - async function test_onTrainRollout_subsequent_startup_after_enrolled() { - if (!ON_TRAIN_ROLLOUT_SUPPORTED_PLATFORM) { - info( - "Skipping supported OS test because current platform is not Linux, Mac, or Win MSIX" - ); - return; - } - - const { modalStub, doCleanup } = await getOnTrainRolloutModalStub({ - shouldEnroll: true, - isFirstRun: false, - isEnrolled: true, - }); - - Assert.equal( - modalStub.callCount, - 1, - "showModal is invoked on subsequent startup if user was enrolled on first startup but did not interact with modal" - ); - - doCleanup(); - } -); - -add_task( - skipIfNotBrowser(), - async function test_onTrainRollout_subsequent_startup_not_enrolled() { - if (!ON_TRAIN_ROLLOUT_SUPPORTED_PLATFORM) { - info( - "Skipping supported OS test because current platform is not Linux, Mac, or Win MSIX" - ); - return; - } - - const { modalStub, doCleanup } = await getOnTrainRolloutModalStub({ - shouldEnroll: true, - isFirstRun: false, - isEnrolled: false, - }); - - Assert.equal( - modalStub.callCount, - 0, - "showModal is not invoked on subsequent startup if user was not enrolled on first startup" - ); - - doCleanup(); - } -);