/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // We use importESModule here instead of static import so that // the Karma test environment won't choke on this module. This // is because the Karma test environment already stubs out // XPCOMUtils and AppConstants, and overrides importESModule // to be a no-op (which can't be done for a static import statement). // eslint-disable-next-line mozilla/use-static-import const { XPCOMUtils } = ChromeUtils.importESModule( "resource://gre/modules/XPCOMUtils.sys.mjs" ); // eslint-disable-next-line mozilla/use-static-import const { AppConstants } = ChromeUtils.importESModule( "resource://gre/modules/AppConstants.sys.mjs" ); import { FeatureCalloutMessages } from "resource:///modules/asrouter/FeatureCalloutMessages.sys.mjs"; const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs", ShellService: "resource:///modules/ShellService.sys.mjs", }); XPCOMUtils.defineLazyPreferenceGetter( lazy, "usesFirefoxSync", "services.sync.username" ); XPCOMUtils.defineLazyPreferenceGetter( lazy, "mobileDevices", "services.sync.clients.devices.mobile", 0 ); XPCOMUtils.defineLazyPreferenceGetter( lazy, "hidePrivatePin", "browser.startup.upgradeDialog.pinPBM.disabled", false ); const L10N = new Localization([ "branding/brand.ftl", "browser/newtab/onboarding.ftl", "toolkit/branding/brandings.ftl", ]); const HOMEPAGE_PREF = "browser.startup.homepage"; const NEWTAB_PREF = "browser.newtabpage.enabled"; const FOURTEEN_DAYS_IN_MS = 14 * 24 * 60 * 60 * 1000; const BASE_MESSAGES = () => [ { id: "FXA_ACCOUNTS_BADGE", template: "toolbar_badge", content: { delay: 10000, // delay for 10 seconds target: "fxa-toolbar-menu-button", }, targeting: "false", trigger: { id: "toolbarBadgeUpdate" }, }, { id: "MILESTONE_MESSAGE_87", groups: ["cfr"], content: { text: "", layout: "short_message", buttons: { primary: { event: "PROTECTION", label: { string_id: "cfr-doorhanger-milestone-ok-button", }, action: { type: "OPEN_PROTECTION_REPORT", }, }, secondary: [ { event: "DISMISS", label: { string_id: "cfr-doorhanger-milestone-close-button", }, action: { type: "CANCEL", }, }, ], }, category: "cfrFeatures", anchor_id: "tracking-protection-icon-container", bucket_id: "CFR_MILESTONE_MESSAGE", heading_text: { string_id: "cfr-doorhanger-milestone-heading2", }, notification_text: "", skip_address_bar_notifier: true, }, trigger: { id: "contentBlocking", params: ["ContentBlockingMilestone"], }, template: "milestone_message", frequency: { lifetime: 7, }, targeting: "pageLoad >= 4 && userPrefs.cfrFeatures", }, { id: "FX_MR_106_UPGRADE", template: "spotlight", targeting: "true", content: { template: "multistage", id: "FX_MR_106_UPGRADE", transitions: true, modal: "tab", screens: [ { id: "UPGRADE_PIN_FIREFOX", content: { position: "split", split_narrow_bkg_position: "-155px", image_alt_text: { string_id: "mr2022-onboarding-pin-image-alt", }, progress_bar: "true", background: "url('chrome://activity-stream/content/data/content/assets/mr-pintaskbar.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)", logo: {}, title: { string_id: "mr2022-onboarding-existing-pin-header", }, subtitle: { string_id: "mr2022-onboarding-existing-pin-subtitle", }, primary_button: { label: { string_id: "mr2022-onboarding-pin-primary-button-label", }, action: { navigate: true, type: "PIN_FIREFOX_TO_TASKBAR", }, }, checkbox: { label: { string_id: "mr2022-onboarding-existing-pin-checkbox-label", }, defaultValue: true, action: { type: "MULTI_ACTION", navigate: true, data: { actions: [ { type: "PIN_FIREFOX_TO_TASKBAR", data: { privatePin: true, }, }, { type: "PIN_FIREFOX_TO_TASKBAR", }, ], }, }, }, secondary_button: { label: { string_id: "mr2022-onboarding-secondary-skip-button-label", }, action: { navigate: true, }, has_arrow_icon: true, }, }, }, { id: "UPGRADE_SET_DEFAULT", content: { position: "split", split_narrow_bkg_position: "-60px", image_alt_text: { string_id: "mr2022-onboarding-default-image-alt", }, progress_bar: "true", background: "url('chrome://activity-stream/content/data/content/assets/mr-settodefault.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)", logo: {}, title: { string_id: "mr2022-onboarding-set-default-title", }, subtitle: { string_id: "mr2022-onboarding-set-default-subtitle", }, primary_button: { label: { string_id: "mr2022-onboarding-set-default-primary-button-label", }, action: { navigate: true, type: "SET_DEFAULT_BROWSER", }, }, secondary_button: { label: { string_id: "mr2022-onboarding-secondary-skip-button-label", }, action: { navigate: true, }, has_arrow_icon: true, }, }, }, { id: "UPGRADE_IMPORT_SETTINGS_EMBEDDED", content: { tiles: { type: "migration-wizard" }, position: "split", split_narrow_bkg_position: "-42px", image_alt_text: { string_id: "mr2022-onboarding-import-image-alt", }, background: "url('chrome://activity-stream/content/data/content/assets/mr-import.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)", progress_bar: true, hide_secondary_section: "responsive", migrate_start: { action: {}, }, migrate_close: { action: { navigate: true, }, }, secondary_button: { label: { string_id: "mr2022-onboarding-secondary-skip-button-label", }, action: { navigate: true, }, has_arrow_icon: true, }, }, }, { id: "UPGRADE_MOBILE_DOWNLOAD", content: { position: "split", split_narrow_bkg_position: "-160px", image_alt_text: { string_id: "mr2022-onboarding-mobile-download-image-alt", }, background: "url('chrome://activity-stream/content/data/content/assets/mr-mobilecrosspromo.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)", progress_bar: true, logo: {}, title: { string_id: "onboarding-mobile-download-security-and-privacy-title", }, subtitle: { string_id: "onboarding-mobile-download-security-and-privacy-subtitle", }, hero_image: { url: "chrome://activity-stream/content/data/content/assets/mobile-download-qr-existing-user.svg", }, cta_paragraph: { text: { string_id: "mr2022-onboarding-mobile-download-cta-text", string_name: "download-label", }, action: { type: "OPEN_URL", data: { args: "https://www.mozilla.org/firefox/mobile/get-app/?utm_medium=firefox-desktop&utm_source=onboarding-modal&utm_campaign=mr2022&utm_content=existing-global", where: "tab", }, }, }, secondary_button: { label: { string_id: "mr2022-onboarding-secondary-skip-button-label", }, action: { navigate: true, }, has_arrow_icon: true, }, }, }, { id: "UPGRADE_PIN_PRIVATE_WINDOW", content: { position: "split", split_narrow_bkg_position: "-100px", image_alt_text: { string_id: "mr2022-onboarding-pin-private-image-alt", }, progress_bar: "true", background: "url('chrome://activity-stream/content/data/content/assets/mr-pinprivate.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)", logo: {}, title: { string_id: "mr2022-upgrade-onboarding-pin-private-window-header", }, subtitle: { string_id: "mr2022-upgrade-onboarding-pin-private-window-subtitle", }, primary_button: { label: { string_id: "mr2022-upgrade-onboarding-pin-private-window-primary-button-label", }, action: { type: "PIN_FIREFOX_TO_TASKBAR", data: { privatePin: true, }, navigate: true, }, }, secondary_button: { label: { string_id: "mr2022-onboarding-secondary-skip-button-label", }, action: { navigate: true, }, has_arrow_icon: true, }, }, }, { id: "UPGRADE_DATA_RECOMMENDATION", content: { position: "split", split_narrow_bkg_position: "-80px", image_alt_text: { string_id: "mr2022-onboarding-privacy-segmentation-image-alt", }, progress_bar: "true", background: "url('chrome://activity-stream/content/data/content/assets/mr-privacysegmentation.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)", logo: {}, title: { string_id: "mr2022-onboarding-privacy-segmentation-title", }, subtitle: { string_id: "mr2022-onboarding-privacy-segmentation-subtitle", }, cta_paragraph: { text: { string_id: "mr2022-onboarding-privacy-segmentation-text-cta", }, }, primary_button: { label: { string_id: "mr2022-onboarding-privacy-segmentation-button-primary-label", }, action: { type: "SET_PREF", data: { pref: { name: "browser.dataFeatureRecommendations.enabled", value: true, }, }, navigate: true, }, }, additional_button: { label: { string_id: "mr2022-onboarding-privacy-segmentation-button-secondary-label", }, style: "secondary", action: { type: "SET_PREF", data: { pref: { name: "browser.dataFeatureRecommendations.enabled", value: false, }, }, navigate: true, }, }, }, }, { id: "UPGRADE_GRATITUDE", content: { position: "split", progress_bar: "true", split_narrow_bkg_position: "-228px", image_alt_text: { string_id: "mr2022-onboarding-gratitude-image-alt", }, background: "url('chrome://activity-stream/content/data/content/assets/mr-gratitude.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)", logo: {}, title: { string_id: "mr2022-onboarding-gratitude-title", }, subtitle: { string_id: "mr2022-onboarding-gratitude-subtitle", }, primary_button: { label: { string_id: "mr2022-onboarding-gratitude-primary-button-label", }, action: { type: "OPEN_FIREFOX_VIEW", navigate: true, }, }, secondary_button: { label: { string_id: "mr2022-onboarding-gratitude-secondary-button-label", }, action: { navigate: true, }, }, }, }, ], }, }, { id: "FX_100_UPGRADE", template: "spotlight", targeting: "false", content: { template: "multistage", id: "FX_100_UPGRADE", transitions: true, screens: [ { id: "UPGRADE_PIN_FIREFOX", content: { logo: { imageURL: "chrome://activity-stream/content/data/content/assets/heart.webp", height: "73px", }, has_noodles: true, title: { fontSize: "36px", string_id: "fx100-upgrade-thanks-header", }, title_style: "fancy shine", background: "url('chrome://activity-stream/content/data/content/assets/confetti.svg') top / 100% no-repeat var(--in-content-page-background)", subtitle: { string_id: "fx100-upgrade-thanks-keep-body", }, primary_button: { label: { string_id: "fx100-thank-you-pin-primary-button-label", }, action: { navigate: true, type: "PIN_FIREFOX_TO_TASKBAR", }, }, secondary_button: { label: { string_id: "onboarding-not-now-button-label", }, action: { navigate: true, }, }, }, }, ], }, }, { id: "PB_NEWTAB_FOCUS_PROMO", type: "default", template: "pb_newtab", groups: ["pbNewtab"], content: { infoBody: "fluent:about-private-browsing-info-description-simplified", infoEnabled: true, infoIcon: "chrome://global/skin/icons/indicator-private-browsing.svg", infoLinkText: "fluent:about-private-browsing-learn-more-link", infoTitle: "", infoTitleEnabled: false, promoEnabled: true, promoType: "FOCUS", promoHeader: "fluent:about-private-browsing-focus-promo-header-c", promoImageLarge: "chrome://browser/content/assets/focus-promo.png", promoLinkText: "fluent:about-private-browsing-focus-promo-cta", promoLinkType: "button", promoSectionStyle: "below-search", promoTitle: "fluent:about-private-browsing-focus-promo-text-c", promoTitleEnabled: true, promoButton: { action: { type: "SHOW_SPOTLIGHT", data: { content: { id: "FOCUS_PROMO", template: "multistage", modal: "tab", backdrop: "transparent", screens: [ { id: "DEFAULT_MODAL_UI", content: { logo: { imageURL: "chrome://browser/content/assets/focus-logo.svg", height: "48px", }, title: { string_id: "spotlight-focus-promo-title", }, subtitle: { string_id: "spotlight-focus-promo-subtitle", }, dismiss_button: { action: { navigate: true, }, }, ios: { action: { data: { args: "https://app.adjust.com/167k4ih?campaign=firefox-desktop&adgroup=pb&creative=focus-omc172&redirect=https%3A%2F%2Fapps.apple.com%2Fus%2Fapp%2Ffirefox-focus-privacy-browser%2Fid1055677337", where: "tabshifted", }, type: "OPEN_URL", navigate: true, }, }, android: { action: { data: { args: "https://app.adjust.com/167k4ih?campaign=firefox-desktop&adgroup=pb&creative=focus-omc172&redirect=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dorg.mozilla.focus", where: "tabshifted", }, type: "OPEN_URL", navigate: true, }, }, tiles: { type: "mobile_downloads", data: { QR_code: { image_url: "chrome://browser/content/assets/focus-qr-code.svg", alt_text: { string_id: "spotlight-focus-promo-qr-code", }, }, marketplace_buttons: ["ios", "android"], }, }, }, }, ], }, }, }, }, }, priority: 2, frequency: { custom: [ { cap: 3, period: 604800000, // Max 3 per week }, ], lifetime: 12, }, // Exclude the next 2 messages: 1) Klar for en 2) Klar for de targeting: "!(region in [ 'DE', 'AT', 'CH'] && localeLanguageCode == 'en') && localeLanguageCode != 'de'", }, { id: "PB_NEWTAB_KLAR_PROMO", type: "default", template: "pb_newtab", groups: ["pbNewtab"], content: { infoBody: "fluent:about-private-browsing-info-description-simplified", infoEnabled: true, infoIcon: "chrome://global/skin/icons/indicator-private-browsing.svg", infoLinkText: "fluent:about-private-browsing-learn-more-link", infoTitle: "", infoTitleEnabled: false, promoEnabled: true, promoType: "FOCUS", promoHeader: "fluent:about-private-browsing-focus-promo-header-c", promoImageLarge: "chrome://browser/content/assets/focus-promo.png", promoLinkText: "Download Firefox Klar", promoLinkType: "button", promoSectionStyle: "below-search", promoTitle: "Firefox Klar clears your history every time while blocking ads and trackers.", promoTitleEnabled: true, promoButton: { action: { type: "SHOW_SPOTLIGHT", data: { content: { id: "KLAR_PROMO", template: "multistage", modal: "tab", backdrop: "transparent", screens: [ { id: "DEFAULT_MODAL_UI", order: 0, content: { logo: { imageURL: "chrome://browser/content/assets/focus-logo.svg", height: "48px", }, title: "Get Firefox Klar", subtitle: { string_id: "spotlight-focus-promo-subtitle", }, dismiss_button: { action: { navigate: true, }, }, ios: { action: { data: { args: "https://app.adjust.com/a8bxj8j?campaign=firefox-desktop&adgroup=pb&creative=focus-omc172&redirect=https%3A%2F%2Fapps.apple.com%2Fde%2Fapp%2Fklar-by-firefox%2Fid1073435754", where: "tabshifted", }, type: "OPEN_URL", navigate: true, }, }, android: { action: { data: { args: "https://app.adjust.com/a8bxj8j?campaign=firefox-desktop&adgroup=pb&creative=focus-omc172&redirect=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dorg.mozilla.klar", where: "tabshifted", }, type: "OPEN_URL", navigate: true, }, }, tiles: { type: "mobile_downloads", data: { QR_code: { image_url: "chrome://browser/content/assets/klar-qr-code.svg", alt_text: "Scan the QR code to get Firefox Klar", }, marketplace_buttons: ["ios", "android"], }, }, }, }, ], }, }, }, }, }, priority: 2, frequency: { custom: [ { cap: 3, period: 604800000, // Max 3 per week }, ], lifetime: 12, }, targeting: "region in [ 'DE', 'AT', 'CH'] && localeLanguageCode == 'en'", }, { id: "PB_NEWTAB_KLAR_PROMO_DE", type: "default", template: "pb_newtab", groups: ["pbNewtab"], content: { infoBody: "fluent:about-private-browsing-info-description-simplified", infoEnabled: true, infoIcon: "chrome://global/skin/icons/indicator-private-browsing.svg", infoLinkText: "fluent:about-private-browsing-learn-more-link", infoTitle: "", infoTitleEnabled: false, promoEnabled: true, promoType: "FOCUS", promoHeader: "fluent:about-private-browsing-focus-promo-header-c", promoImageLarge: "chrome://browser/content/assets/focus-promo.png", promoLinkText: "fluent:about-private-browsing-focus-promo-cta", promoLinkType: "button", promoSectionStyle: "below-search", promoTitle: "fluent:about-private-browsing-focus-promo-text-c", promoTitleEnabled: true, promoButton: { action: { type: "SHOW_SPOTLIGHT", data: { content: { id: "FOCUS_PROMO", template: "multistage", modal: "tab", backdrop: "transparent", screens: [ { id: "DEFAULT_MODAL_UI", content: { logo: { imageURL: "chrome://browser/content/assets/focus-logo.svg", height: "48px", }, title: { string_id: "spotlight-focus-promo-title", }, subtitle: { string_id: "spotlight-focus-promo-subtitle", }, dismiss_button: { action: { navigate: true, }, }, ios: { action: { data: { args: "https://app.adjust.com/a8bxj8j?campaign=firefox-desktop&adgroup=pb&creative=focus-omc172&redirect=https%3A%2F%2Fapps.apple.com%2Fde%2Fapp%2Fklar-by-firefox%2Fid1073435754", where: "tabshifted", }, type: "OPEN_URL", navigate: true, }, }, android: { action: { data: { args: "https://app.adjust.com/a8bxj8j?campaign=firefox-desktop&adgroup=pb&creative=focus-omc172&redirect=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dorg.mozilla.klar", where: "tabshifted", }, type: "OPEN_URL", navigate: true, }, }, tiles: { type: "mobile_downloads", data: { QR_code: { image_url: "chrome://browser/content/assets/klar-qr-code.svg", alt_text: { string_id: "spotlight-focus-promo-qr-code", }, }, marketplace_buttons: ["ios", "android"], }, }, }, }, ], }, }, }, }, }, priority: 2, frequency: { custom: [ { cap: 3, period: 604800000, // Max 3 per week }, ], lifetime: 12, }, targeting: "localeLanguageCode == 'de'", }, { id: "PB_NEWTAB_PIN_PROMO", template: "pb_newtab", type: "default", groups: ["pbNewtab"], content: { infoBody: "fluent:about-private-browsing-info-description-simplified", infoEnabled: true, infoIcon: "chrome://global/skin/icons/indicator-private-browsing.svg", infoLinkText: "fluent:about-private-browsing-learn-more-link", infoTitle: "", infoTitleEnabled: false, promoEnabled: true, promoType: "PIN", promoHeader: "fluent:about-private-browsing-pin-promo-header", promoImageLarge: "chrome://browser/content/assets/private-promo-asset.svg", promoLinkText: "fluent:about-private-browsing-pin-promo-link-text", promoLinkType: "button", promoSectionStyle: "below-search", promoTitle: "fluent:about-private-browsing-pin-promo-title", promoTitleEnabled: true, promoButton: { action: { type: "MULTI_ACTION", data: { actions: [ { type: "SET_PREF", data: { pref: { name: "browser.privateWindowSeparation.enabled", value: true, }, }, }, { type: "PIN_FIREFOX_TO_TASKBAR", data: { privatePin: true, }, }, { type: "BLOCK_MESSAGE", data: { id: "PB_NEWTAB_PIN_PROMO", }, }, { type: "OPEN_ABOUT_PAGE", data: { args: "privatebrowsing", where: "current" }, }, ], }, }, }, }, priority: 3, frequency: { custom: [ { cap: 3, period: 604800000, // Max 3 per week }, ], lifetime: 12, }, targeting: "doesAppNeedPrivatePin", }, { id: "PB_NEWTAB_COOKIE_BANNERS_PROMO", template: "pb_newtab", type: "default", groups: ["pbNewtab"], content: { infoBody: "fluent:about-private-browsing-info-description-simplified", infoEnabled: true, infoIcon: "chrome://global/skin/icons/indicator-private-browsing.svg", infoLinkText: "fluent:about-private-browsing-learn-more-link", infoTitle: "", infoTitleEnabled: false, promoEnabled: true, promoType: "COOKIE_BANNERS", promoHeader: "fluent:about-private-browsing-cookie-banners-promo-heading", promoImageLarge: "chrome://browser/content/assets/cookie-banners-begone.svg", promoLinkText: "fluent:about-private-browsing-learn-more-link", promoLinkType: "link", promoSectionStyle: "below-search", promoTitle: "fluent:about-private-browsing-cookie-banners-promo-body", promoTitleEnabled: true, promoButton: { action: { type: "MULTI_ACTION", data: { actions: [ { type: "OPEN_URL", data: { args: "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/cookie-banner-reduction", where: "tabshifted", }, }, { type: "BLOCK_MESSAGE", data: { id: "PB_NEWTAB_COOKIE_BANNERS_PROMO", }, }, ], }, }, }, }, priority: 4, frequency: { custom: [ { cap: 3, period: 604800000, // Max 3 per week }, ], lifetime: 12, }, targeting: `'cookiebanners.service.mode.privateBrowsing'|preferenceValue != 0 || 'cookiebanners.service.mode'|preferenceValue != 0`, }, { id: "INFOBAR_LAUNCH_ON_LOGIN", groups: ["cfr"], template: "infobar", content: { type: "global", text: { string_id: "launch-on-login-infobar-message", }, buttons: [ { label: { string_id: "launch-on-login-learnmore", }, supportPage: "make-firefox-automatically-open-when-you-start", action: { type: "CANCEL", }, }, { label: { string_id: "launch-on-login-infobar-reject-button" }, action: { type: "CANCEL", }, }, { label: { string_id: "launch-on-login-infobar-confirm-button" }, primary: true, action: { type: "MULTI_ACTION", data: { actions: [ { type: "SET_PREF", data: { pref: { name: "browser.startup.windowsLaunchOnLogin.disableLaunchOnLoginPrompt", value: true, }, }, }, { type: "CONFIRM_LAUNCH_ON_LOGIN", }, ], }, }, }, ], }, frequency: { lifetime: 1, }, trigger: { id: "defaultBrowserCheck" }, targeting: `source == 'newtab' && 'browser.startup.windowsLaunchOnLogin.disableLaunchOnLoginPrompt'|preferenceValue == false && 'browser.startup.windowsLaunchOnLogin.enabled'|preferenceValue == true && isDefaultBrowser && !activeNotifications && !launchOnLoginEnabled && !isMSIX`, }, { id: "INFOBAR_LAUNCH_ON_LOGIN_FINAL", groups: ["cfr"], template: "infobar", content: { type: "global", text: { string_id: "launch-on-login-infobar-final-message", }, buttons: [ { label: { string_id: "launch-on-login-learnmore", }, supportPage: "make-firefox-automatically-open-when-you-start", action: { type: "CANCEL", }, }, { label: { string_id: "launch-on-login-infobar-final-reject-button" }, action: { type: "SET_PREF", data: { pref: { name: "browser.startup.windowsLaunchOnLogin.disableLaunchOnLoginPrompt", value: true, }, }, }, }, { label: { string_id: "launch-on-login-infobar-confirm-button" }, primary: true, action: { type: "MULTI_ACTION", data: { actions: [ { type: "SET_PREF", data: { pref: { name: "browser.startup.windowsLaunchOnLogin.disableLaunchOnLoginPrompt", value: true, }, }, }, { type: "CONFIRM_LAUNCH_ON_LOGIN", }, ], }, }, }, ], }, frequency: { lifetime: 1, }, trigger: { id: "defaultBrowserCheck" }, targeting: `source == 'newtab' && 'browser.startup.windowsLaunchOnLogin.disableLaunchOnLoginPrompt'|preferenceValue == false && 'browser.startup.windowsLaunchOnLogin.enabled'|preferenceValue == true && isDefaultBrowser && !activeNotifications && messageImpressions.INFOBAR_LAUNCH_ON_LOGIN[messageImpressions.INFOBAR_LAUNCH_ON_LOGIN | length - 1] && messageImpressions.INFOBAR_LAUNCH_ON_LOGIN[messageImpressions.INFOBAR_LAUNCH_ON_LOGIN | length - 1] < currentDate|date - ${FOURTEEN_DAYS_IN_MS} && !launchOnLoginEnabled && !isMSIX`, }, { id: "FOX_DOODLE_SET_DEFAULT", template: "spotlight", groups: ["eco"], skip_in_tests: "it fails unrelated tests", content: { backdrop: "transparent", id: "FOX_DOODLE_SET_DEFAULT", screens: [ { id: "FOX_DOODLE_SET_DEFAULT_SCREEN", content: { logo: { height: "125px", imageURL: "chrome://activity-stream/content/data/content/assets/fox-doodle-waving.gif", reducedMotionImageURL: "chrome://activity-stream/content/data/content/assets/fox-doodle-waving-static.png", }, title: { fontSize: "22px", fontWeight: 590, letterSpacing: 0, paddingInline: "24px", paddingBlock: "4px 0", string_id: "fox-doodle-pin-headline", }, subtitle: { fontSize: "15px", letterSpacing: 0, lineHeight: "1.4", marginBlock: "8px 16px", paddingInline: "24px", string_id: "fox-doodle-pin-body", }, primary_button: { action: { navigate: true, type: "SET_DEFAULT_BROWSER", }, label: { paddingBlock: "0", paddingInline: "16px", marginBlock: "4px 0", string_id: "fox-doodle-pin-primary", }, }, secondary_button: { action: { navigate: true, }, label: { marginBlock: "0 -20px", string_id: "fox-doodle-pin-secondary", }, }, dismiss_button: { action: { navigate: true, }, }, }, }, ], template: "multistage", transitions: true, }, frequency: { lifetime: 2, }, targeting: "source == 'startup' && !isMajorUpgrade && !activeNotifications && !isDefaultBrowser && !willShowDefaultPrompt && 'browser.shell.checkDefaultBrowser'|preferenceValue && (currentDate|date - profileAgeCreated|date) / 86400000 >= 28 && userPrefs.cfrFeatures == true", trigger: { id: "defaultBrowserCheck", }, }, { id: "TAIL_FOX_SET_DEFAULT", template: "spotlight", groups: ["eco"], skip_in_tests: "it fails unrelated tests", content: { backdrop: "transparent", id: "TAIL_FOX_SET_DEFAULT_CONTENT", screens: [ { id: "TAIL_FOX_SET_DEFAULT_SCREEN", content: { logo: { height: "140px", imageURL: "chrome://activity-stream/content/data/content/assets/fox-doodle-tail.png", reducedMotionImageURL: "chrome://activity-stream/content/data/content/assets/fox-doodle-tail.png", }, title: { fontSize: "22px", fontWeight: 590, letterSpacing: 0, paddingInline: "24px", paddingBlock: "4px 0", string_id: "tail-fox-spotlight-title", }, subtitle: { fontSize: "15px", letterSpacing: 0, lineHeight: "1.4", marginBlock: "8px 16px", paddingInline: "24px", string_id: "tail-fox-spotlight-subtitle", }, primary_button: { action: { navigate: true, type: "SET_DEFAULT_BROWSER", }, label: { paddingBlock: "0", paddingInline: "16px", marginBlock: "4px 0", string_id: "tail-fox-spotlight-primary-button", }, }, secondary_button: { action: { navigate: true, }, label: { marginBlock: "0 -20px", string_id: "tail-fox-spotlight-secondary-button", }, }, dismiss_button: { action: { navigate: true, }, }, }, }, ], template: "multistage", transitions: true, }, frequency: { lifetime: 1, }, targeting: "source == 'startup' && !isMajorUpgrade && !activeNotifications && !isDefaultBrowser && !willShowDefaultPrompt && 'browser.shell.checkDefaultBrowser'|preferenceValue && (currentDate|date - profileAgeCreated|date) / 86400000 <= 28 && (currentDate|date - profileAgeCreated|date) / 86400000 >= 7 && userPrefs.cfrFeatures == true", trigger: { id: "defaultBrowserCheck", }, }, { id: "SET_DEFAULT_BROWSER_GUIDANCE_NOTIFICATION_WIN10", template: "toast_notification", content: { title: { string_id: "default-browser-guidance-notification-title", }, body: { string_id: "default-browser-guidance-notification-body-instruction-win10", }, launch_action: { type: "OPEN_URL", data: { args: "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/win-set-firefox-default-browser", where: "tabshifted", }, }, requireInteraction: true, actions: [ { action: "info-page", title: { string_id: "default-browser-guidance-notification-info-page", }, launch_action: { type: "OPEN_URL", data: { args: "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/win-set-firefox-default-browser", where: "tabshifted", }, }, }, { action: "dismiss", title: { string_id: "default-browser-guidance-notification-dismiss", }, windowsSystemActivationType: true, }, ], tag: "set-default-guidance-notification", }, // Both Windows 10 and 11 return `os.windowsVersion == 10.0`. We limit to // only Windows 10 with `os.windowsBuildNumber < 22000`. We need this due to // Windows 10 and 11 having substantively different UX for Windows Settings. targeting: "os.isWindows && os.windowsVersion >= 10.0 && os.windowsBuildNumber < 22000", trigger: { id: "deeplinkedToWindowsSettingsUI" }, }, { id: "SET_DEFAULT_BROWSER_GUIDANCE_NOTIFICATION_WIN11", template: "toast_notification", content: { title: { string_id: "default-browser-guidance-notification-title", }, body: { string_id: "default-browser-guidance-notification-body-instruction-win11", }, launch_action: { type: "OPEN_URL", data: { args: "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/win-set-firefox-default-browser", where: "tabshifted", }, }, requireInteraction: true, actions: [ { action: "info-page", title: { string_id: "default-browser-guidance-notification-info-page", }, launch_action: { type: "OPEN_URL", data: { args: "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/win-set-firefox-default-browser", where: "tabshifted", }, }, }, { action: "dismiss", title: { string_id: "default-browser-guidance-notification-dismiss", }, windowsSystemActivationType: true, }, ], tag: "set-default-guidance-notification", }, // Both Windows 10 and 11 return `os.windowsVersion == 10.0`. We limit to // only Windows 11 with `os.windowsBuildNumber >= 22000`. We need this due to // Windows 10 and 11 having substantively different UX for Windows Settings. targeting: "os.isWindows && os.windowsVersion >= 10.0 && os.windowsBuildNumber >= 22000", trigger: { id: "deeplinkedToWindowsSettingsUI" }, }, ]; // Eventually, move Feature Callout messages to their own provider const ONBOARDING_MESSAGES = () => BASE_MESSAGES().concat(FeatureCalloutMessages.getMessages()); export const OnboardingMessageProvider = { async getExtraAttributes() { const [header, button_label] = await L10N.formatMessages([ { id: "onboarding-welcome-header" }, { id: "onboarding-start-browsing-button-label" }, ]); return { header: header.value, button_label: button_label.value }; }, async getMessages() { const messages = await this.translateMessages(await ONBOARDING_MESSAGES()); return messages; }, async getUntranslatedMessages() { // This is helpful for jsonSchema testing - since we are localizing in the provider const messages = await ONBOARDING_MESSAGES(); return messages; }, async translateMessages(messages) { let translatedMessages = []; for (const msg of messages) { let translatedMessage = { ...msg }; // If the message has no content, do not attempt to translate it if (!translatedMessage.content) { translatedMessages.push(translatedMessage); continue; } // Translate any secondary buttons separately if (msg.content.secondary_button) { const [secondary_button_string] = await L10N.formatMessages([ { id: msg.content.secondary_button.label.string_id }, ]); translatedMessage.content.secondary_button.label = secondary_button_string.value; } if (msg.content.header) { const [header_string] = await L10N.formatMessages([ { id: msg.content.header.string_id }, ]); translatedMessage.content.header = header_string.value; } translatedMessages.push(translatedMessage); } return translatedMessages; }, async _doesAppNeedPin(privateBrowsing = false) { const needPin = await lazy.ShellService.doesAppNeedPin(privateBrowsing); return needPin; }, async _doesAppNeedDefault() { let checkDefault = Services.prefs.getBoolPref( "browser.shell.checkDefaultBrowser", false ); let isDefault = await lazy.ShellService.isDefaultBrowser(); return checkDefault && !isDefault; }, _shouldShowPrivacySegmentationScreen() { return Services.prefs.getBoolPref( "browser.privacySegmentation.preferences.show" ); }, _doesHomepageNeedReset() { return ( Services.prefs.prefHasUserValue(HOMEPAGE_PREF) || Services.prefs.prefHasUserValue(NEWTAB_PREF) ); }, async getUpgradeMessage() { let message = (await OnboardingMessageProvider.getMessages()).find( ({ id }) => id === "FX_MR_106_UPGRADE" ); let { content } = message; // Helper to find screens and remove them where applicable. function removeScreens(check) { const { screens } = content; for (let i = 0; i < screens?.length; i++) { if (check(screens[i])) { screens.splice(i--, 1); } } } // Helper to prepare mobile download screen content function prepareMobileDownload() { let mobileContent = content.screens.find( screen => screen.id === "UPGRADE_MOBILE_DOWNLOAD" )?.content; if (!mobileContent) { return; } if (!lazy.BrowserUtils.sendToDeviceEmailsSupported()) { // If send to device emails are not supported for a user's locale, // remove the send to device link and update the screen text delete mobileContent.cta_paragraph.action; mobileContent.cta_paragraph.text = { string_id: "mr2022-onboarding-no-mobile-download-cta-text", }; } // Update CN specific QRCode url if (AppConstants.isChinaRepack()) { mobileContent.hero_image.url = `${mobileContent.hero_image.url.slice( 0, mobileContent.hero_image.url.indexOf(".svg") )}-cn.svg`; } } let pinScreen = content.screens?.find( screen => screen.id === "UPGRADE_PIN_FIREFOX" ); const needPin = await this._doesAppNeedPin(); const needDefault = await this._doesAppNeedDefault(); const needPrivatePin = !lazy.hidePrivatePin && (await this._doesAppNeedPin(true)); const showSegmentation = this._shouldShowPrivacySegmentationScreen(); //If a user has Firefox as default remove import screen if (!needDefault) { removeScreens(screen => screen.id?.startsWith("UPGRADE_IMPORT_SETTINGS_EMBEDDED") ); } // If already pinned, convert "pin" screen to "welcome" with desired action. let removeDefault = !needDefault; // If user doesn't need pin, update screen to set "default" or "get started" configuration if (!needPin && pinScreen) { // don't need to show the checkbox delete pinScreen.content.checkbox; removeDefault = true; let primary = pinScreen.content.primary_button; if (needDefault) { pinScreen.id = "UPGRADE_ONLY_DEFAULT"; pinScreen.content.subtitle = { string_id: "mr2022-onboarding-existing-set-default-only-subtitle", }; primary.label.string_id = "mr2022-onboarding-set-default-primary-button-label"; // The "pin" screen will now handle "default" so remove other "default." primary.action.type = "SET_DEFAULT_BROWSER"; } else { pinScreen.id = "UPGRADE_GET_STARTED"; pinScreen.content.subtitle = { string_id: "mr2022-onboarding-get-started-primary-subtitle", }; primary.label = { string_id: "mr2022-onboarding-get-started-primary-button-label", }; delete primary.action.type; } } // If a user has Firefox private pinned remove pin private window screen // We also remove standalone pin private window screen if a user doesn't have // Firefox pinned in which case the option is shown as checkbox with UPGRADE_PIN_FIREFOX screen if (!needPrivatePin || needPin) { removeScreens(screen => screen.id?.startsWith("UPGRADE_PIN_PRIVATE_WINDOW") ); } if (!showSegmentation) { removeScreens(screen => screen.id?.startsWith("UPGRADE_DATA_RECOMMENDATION") ); } //If privatePin, remove checkbox from pinscreen if (!needPrivatePin) { delete content.screens?.find( screen => screen.id === "UPGRADE_PIN_FIREFOX" )?.content?.checkbox; } if (removeDefault) { removeScreens(screen => screen.id?.startsWith("UPGRADE_SET_DEFAULT")); } // Remove mobile download screen if user has sync enabled if (lazy.usesFirefoxSync && lazy.mobileDevices > 0) { removeScreens(screen => screen.id === "UPGRADE_MOBILE_DOWNLOAD"); } else { prepareMobileDownload(); } return message; }, };