/* 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/. */ // Eventually, make this a messaging system // provider instead of adding these message // into OnboardingMessageProvider.sys.mjs const FIREFOX_VIEW_PREF = "browser.firefox-view.feature-tour"; const PDFJS_PREF = "browser.pdfjs.feature-tour"; // Empty screens are included as placeholders to ensure step // indicator shows the correct number of total steps in the tour const ONE_DAY_IN_MS = 24 * 60 * 60 * 1000; // Generate a JEXL targeting string based on the `complete` property being true // in a given Feature Callout tour progress preference value (which is JSON). const matchIncompleteTargeting = (prefName, defaultValue = false) => { // regExpMatch() is a JEXL filter expression. Here we check if 'complete' // exists in the pref's value, and returns true if the tour is incomplete. const prefVal = `'${prefName}' | preferenceValue`; // prefVal might be null if the preference doesn't exist. in this case, don't // try to pipe into regExpMatch. const completeMatch = `${prefVal} | regExpMatch('(?<=complete":)(.*)(?=})')`; return `((${prefVal}) ? ((${completeMatch}) ? (${completeMatch}[1] != "true") : ${String( defaultValue )}) : ${String(defaultValue)})`; }; // Generate a JEXL targeting string based on the current screen id found in a // given Feature Callout tour progress preference. const matchCurrentScreenTargeting = (prefName, screenIdRegEx = ".*") => { // regExpMatch() is a JEXL filter expression. Here we check if 'screen' exists // in the pref's value, and if it matches the screenIdRegEx. Returns // null otherwise. const prefVal = `'${prefName}' | preferenceValue`; const screenMatch = `${prefVal} | regExpMatch('(?<=screen"\s*:)\s*"(${screenIdRegEx})(?="\s*,)')`; const screenValMatches = `(${screenMatch}) ? !!(${screenMatch}[1]) : false`; return `(${screenValMatches})`; }; /** * add24HourImpressionJEXLTargeting - * Creates a "hasn't been viewed in > 24 hours" * JEXL string and adds it to each message specified * * @param {array} messageIds - IDs of messages that the targeting string will be added to * @param {string} prefix - The prefix of messageIDs that will used to create the JEXL string * @param {array} messages - The array of messages that will be edited * @returns {array} - The array of messages with the appropriate targeting strings edited */ function add24HourImpressionJEXLTargeting( messageIds, prefix, uneditedMessages ) { let noImpressionsIn24HoursString = uneditedMessages .filter(message => message.id.startsWith(prefix)) .map( message => // If the last impression is null or if epoch time // of the impression is < current time - 24hours worth of MS `(messageImpressions.${message.id}[messageImpressions.${ message.id } | length - 1] == null || messageImpressions.${ message.id }[messageImpressions.${message.id} | length - 1] < ${ Date.now() - ONE_DAY_IN_MS })` ) .join(" && "); // We're appending the string here instead of using // template strings to avoid a recursion error from // using the 'messages' variable within itself return uneditedMessages.map(message => { if (messageIds.includes(message.id)) { message.targeting += `&& ${noImpressionsIn24HoursString}`; } return message; }); } // Exporting the about:firefoxview messages as a method here // acts as a safety guard against mutations of the original objects const MESSAGES = () => { let messages = [ { id: "FIREFOX_VIEW_SPOTLIGHT", template: "spotlight", content: { id: "FIREFOX_VIEW_PROMO", template: "multistage", modal: "tab", tour_pref_name: FIREFOX_VIEW_PREF, screens: [ { id: "DEFAULT_MODAL_UI", content: { title: { fontSize: "32px", fontWeight: 400, string_id: "firefoxview-spotlight-promo-title", }, subtitle: { fontSize: "15px", fontWeight: 400, marginBlock: "10px", marginInline: "40px", string_id: "firefoxview-spotlight-promo-subtitle", }, logo: { height: "48px" }, primary_button: { label: { string_id: "firefoxview-spotlight-promo-primarybutton", }, action: { type: "SET_PREF", data: { pref: { name: FIREFOX_VIEW_PREF, value: JSON.stringify({ screen: "FEATURE_CALLOUT_1", complete: false, }), }, }, navigate: true, }, }, secondary_button: { label: { string_id: "firefoxview-spotlight-promo-secondarybutton", }, action: { type: "SET_PREF", data: { pref: { name: FIREFOX_VIEW_PREF, value: JSON.stringify({ screen: "", complete: true, }), }, }, navigate: true, }, }, }, }, ], }, priority: 3, trigger: { id: "featureCalloutCheck", }, frequency: { // Add the highest possible cap to ensure impressions are recorded while allowing the Spotlight to sync across windows/tabs with Firefox View open lifetime: 100, }, targeting: `!inMr2022Holdback && source == "about:firefoxview" && !'browser.newtabpage.activity-stream.asrouter.providers.cfr'|preferenceIsUserSet && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features'|preferenceValue && ${matchCurrentScreenTargeting( FIREFOX_VIEW_PREF, "FIREFOX_VIEW_SPOTLIGHT" )} && ${matchIncompleteTargeting(FIREFOX_VIEW_PREF)}`, }, { id: "FIREFOX_VIEW_FEATURE_TOUR", template: "feature_callout", content: { id: "FIREFOX_VIEW_FEATURE_TOUR", template: "multistage", backdrop: "transparent", transitions: false, disableHistoryUpdates: true, tour_pref_name: FIREFOX_VIEW_PREF, screens: [ { id: "FEATURE_CALLOUT_1", anchors: [ { selector: "#tab-pickup-container", arrow_position: "top", }, ], content: { position: "callout", title: { string_id: "callout-firefox-view-tab-pickup-title", }, subtitle: { string_id: "callout-firefox-view-tab-pickup-subtitle", }, logo: { imageURL: "chrome://browser/content/callout-tab-pickup.svg", darkModeImageURL: "chrome://browser/content/callout-tab-pickup-dark.svg", height: "128px", }, primary_button: { label: { string_id: "callout-primary-advance-button-label", }, style: "secondary", action: { type: "SET_PREF", data: { pref: { name: FIREFOX_VIEW_PREF, value: JSON.stringify({ screen: "FEATURE_CALLOUT_2", complete: false, }), }, }, }, }, dismiss_button: { action: { type: "SET_PREF", data: { pref: { name: FIREFOX_VIEW_PREF, value: JSON.stringify({ screen: "", complete: true, }), }, }, }, }, page_event_listeners: [ { params: { type: "toggle", selectors: "#tab-pickup-container", }, action: { reposition: true }, }, ], }, }, { id: "FEATURE_CALLOUT_2", anchors: [ { selector: "#recently-closed-tabs-container", arrow_position: "bottom", }, ], content: { position: "callout", title: { string_id: "callout-firefox-view-recently-closed-title", }, subtitle: { string_id: "callout-firefox-view-recently-closed-subtitle", }, primary_button: { label: { string_id: "callout-primary-complete-button-label", }, style: "secondary", action: { type: "SET_PREF", data: { pref: { name: FIREFOX_VIEW_PREF, value: JSON.stringify({ screen: "", complete: true, }), }, }, }, }, dismiss_button: { action: { type: "SET_PREF", data: { pref: { name: FIREFOX_VIEW_PREF, value: JSON.stringify({ screen: "", complete: true, }), }, }, }, }, page_event_listeners: [ { params: { type: "toggle", selectors: "#recently-closed-tabs-container", }, action: { reposition: true }, }, ], }, }, ], }, priority: 3, targeting: `!inMr2022Holdback && source == "about:firefoxview" && ${matchCurrentScreenTargeting( FIREFOX_VIEW_PREF, "FEATURE_CALLOUT_[0-9]" )} && ${matchIncompleteTargeting(FIREFOX_VIEW_PREF)}`, trigger: { id: "featureCalloutCheck" }, }, { id: "FIREFOX_VIEW_TAB_PICKUP_REMINDER", template: "feature_callout", content: { id: "FIREFOX_VIEW_TAB_PICKUP_REMINDER", template: "multistage", backdrop: "transparent", transitions: false, disableHistoryUpdates: true, screens: [ { id: "FIREFOX_VIEW_TAB_PICKUP_REMINDER", anchors: [ { selector: "#tab-pickup-container", arrow_position: "top", }, ], content: { position: "callout", title: { string_id: "continuous-onboarding-firefox-view-tab-pickup-title", }, subtitle: { string_id: "continuous-onboarding-firefox-view-tab-pickup-subtitle", }, logo: { imageURL: "chrome://browser/content/callout-tab-pickup.svg", darkModeImageURL: "chrome://browser/content/callout-tab-pickup-dark.svg", height: "128px", }, primary_button: { label: { string_id: "mr1-onboarding-get-started-primary-button-label", }, style: "secondary", action: { type: "CLICK_ELEMENT", navigate: true, data: { selector: "#tab-pickup-container button.primary:not(#error-state-button)", }, }, }, dismiss_button: { action: { navigate: true, }, }, page_event_listeners: [ { params: { type: "toggle", selectors: "#tab-pickup-container", }, action: { reposition: true }, }, ], }, }, ], }, priority: 2, targeting: `!inMr2022Holdback && source == "about:firefoxview" && "browser.firefox-view.view-count" | preferenceValue > 2 && (("identity.fxaccounts.enabled" | preferenceValue == false) || !(("services.sync.engine.tabs" | preferenceValue == true) && ("services.sync.username" | preferenceValue))) && (!messageImpressions.FIREFOX_VIEW_SPOTLIGHT[messageImpressions.FIREFOX_VIEW_SPOTLIGHT | length - 1] || messageImpressions.FIREFOX_VIEW_SPOTLIGHT[messageImpressions.FIREFOX_VIEW_SPOTLIGHT | length - 1] < currentDate|date - ${ONE_DAY_IN_MS})`, frequency: { lifetime: 1, }, trigger: { id: "featureCalloutCheck" }, }, { id: "PDFJS_FEATURE_TOUR_A", template: "feature_callout", content: { id: "PDFJS_FEATURE_TOUR", template: "multistage", backdrop: "transparent", transitions: false, disableHistoryUpdates: true, tour_pref_name: PDFJS_PREF, screens: [ { id: "FEATURE_CALLOUT_1_A", anchors: [ { selector: "hbox#browser", arrow_position: "top-end", absolute_position: { top: "43px", right: "51px" }, }, ], content: { position: "callout", title: { string_id: "callout-pdfjs-edit-title", }, subtitle: { string_id: "callout-pdfjs-edit-body-a", }, primary_button: { label: { string_id: "callout-pdfjs-edit-button", }, style: "secondary", action: { type: "SET_PREF", data: { pref: { name: PDFJS_PREF, value: JSON.stringify({ screen: "FEATURE_CALLOUT_2_A", complete: false, }), }, }, }, }, dismiss_button: { action: { type: "SET_PREF", data: { pref: { name: PDFJS_PREF, value: JSON.stringify({ screen: "", complete: true, }), }, }, }, }, }, }, { id: "FEATURE_CALLOUT_2_A", anchors: [ { selector: "hbox#browser", arrow_position: "top-end", absolute_position: { top: "43px", right: "23px" }, }, ], content: { position: "callout", title: { string_id: "callout-pdfjs-draw-title", }, subtitle: { string_id: "callout-pdfjs-draw-body-a", }, primary_button: { label: { string_id: "callout-pdfjs-draw-button", }, style: "secondary", action: { type: "SET_PREF", data: { pref: { name: PDFJS_PREF, value: JSON.stringify({ screen: "", complete: true, }), }, }, }, }, dismiss_button: { action: { type: "SET_PREF", data: { pref: { name: PDFJS_PREF, value: JSON.stringify({ screen: "", complete: true, }), }, }, }, }, }, }, ], }, priority: 1, targeting: `source == "open" && ${matchCurrentScreenTargeting( PDFJS_PREF, "FEATURE_CALLOUT_[0-9]_A" )} && ${matchIncompleteTargeting(PDFJS_PREF)}`, trigger: { id: "pdfJsFeatureCalloutCheck" }, }, { id: "PDFJS_FEATURE_TOUR_B", template: "feature_callout", content: { id: "PDFJS_FEATURE_TOUR", template: "multistage", backdrop: "transparent", transitions: false, disableHistoryUpdates: true, tour_pref_name: PDFJS_PREF, screens: [ { id: "FEATURE_CALLOUT_1_B", anchors: [ { selector: "hbox#browser", arrow_position: "top-end", absolute_position: { top: "43px", right: "51px" }, }, ], content: { position: "callout", title: { string_id: "callout-pdfjs-edit-title", }, subtitle: { string_id: "callout-pdfjs-edit-body-b", }, primary_button: { label: { string_id: "callout-pdfjs-edit-button", }, style: "secondary", action: { type: "SET_PREF", data: { pref: { name: PDFJS_PREF, value: JSON.stringify({ screen: "FEATURE_CALLOUT_2_B", complete: false, }), }, }, }, }, dismiss_button: { action: { type: "SET_PREF", data: { pref: { name: PDFJS_PREF, value: JSON.stringify({ screen: "", complete: true, }), }, }, }, }, }, }, { id: "FEATURE_CALLOUT_2_B", anchors: [ { selector: "hbox#browser", arrow_position: "top-end", absolute_position: { top: "43px", right: "23px" }, }, ], content: { position: "callout", title: { string_id: "callout-pdfjs-draw-title", }, subtitle: { string_id: "callout-pdfjs-draw-body-b", }, primary_button: { label: { string_id: "callout-pdfjs-draw-button", }, style: "secondary", action: { type: "SET_PREF", data: { pref: { name: PDFJS_PREF, value: JSON.stringify({ screen: "", complete: true, }), }, }, }, }, dismiss_button: { action: { type: "SET_PREF", data: { pref: { name: PDFJS_PREF, value: JSON.stringify({ screen: "", complete: true, }), }, }, }, }, }, }, ], }, priority: 1, targeting: `source == "open" && ${matchCurrentScreenTargeting( PDFJS_PREF, "FEATURE_CALLOUT_[0-9]_B" )} && ${matchIncompleteTargeting(PDFJS_PREF)}`, trigger: { id: "pdfJsFeatureCalloutCheck" }, }, { // "Callout 1" in the Fakespot Figma spec id: "FAKESPOT_CALLOUT_CLOSED_OPTED_IN_DEFAULT", template: "feature_callout", content: { id: "FAKESPOT_CALLOUT_CLOSED_OPTED_IN_DEFAULT", template: "multistage", backdrop: "transparent", transitions: false, disableHistoryUpdates: true, screens: [ { id: "FAKESPOT_CALLOUT_CLOSED_OPTED_IN_DEFAULT", anchors: [ { selector: "#shopping-sidebar-button", panel_position: { anchor_attachment: "bottomcenter", callout_attachment: "topright", }, no_open_on_anchor: true, }, ], content: { position: "callout", title_logo: { imageURL: "chrome://browser/content/shopping/assets/shopping.svg", alignment: "top", }, title: { string_id: "shopping-callout-closed-opted-in-subtitle", marginInline: "3px 40px", fontWeight: "inherit", }, dismiss_button: { action: { dismiss: true }, size: "small", marginBlock: "24px 0", marginInline: "0 24px", }, page_event_listeners: [ { params: { type: "click", selectors: "#shopping-sidebar-button", }, action: { dismiss: true }, }, ], }, }, ], }, priority: 1, // Auto-open feature flag is not enabled; User is opted in; First time closing sidebar; Has not seen either on-closed callout before; Has not opted out of CFRs. targeting: `isSidebarClosing && 'browser.shopping.experience2023.autoOpen.enabled' | preferenceValue != true && 'browser.shopping.experience2023.optedIn' | preferenceValue == 1 && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false && !messageImpressions.FAKESPOT_CALLOUT_CLOSED_OPTED_IN_DEFAULT|length && !messageImpressions.FAKESPOT_CALLOUT_CLOSED_NOT_OPTED_IN_DEFAULT|length`, trigger: { id: "shoppingProductPageWithSidebarClosed" }, frequency: { lifetime: 1 }, }, { // "Callout 3" in the Fakespot Figma spec id: "FAKESPOT_CALLOUT_CLOSED_NOT_OPTED_IN_DEFAULT", template: "feature_callout", content: { id: "FAKESPOT_CALLOUT_CLOSED_NOT_OPTED_IN_DEFAULT", template: "multistage", backdrop: "transparent", transitions: false, disableHistoryUpdates: true, screens: [ { id: "FAKESPOT_CALLOUT_CLOSED_NOT_OPTED_IN_DEFAULT", anchors: [ { selector: "#shopping-sidebar-button", panel_position: { anchor_attachment: "bottomcenter", callout_attachment: "topright", }, no_open_on_anchor: true, }, ], content: { position: "callout", title_logo: { imageURL: "chrome://browser/content/shopping/assets/shopping.svg", }, title: { string_id: "shopping-callout-closed-not-opted-in-title", marginInline: "3px 40px", }, subtitle: { string_id: "shopping-callout-closed-not-opted-in-subtitle", }, dismiss_button: { action: { dismiss: true }, size: "small", marginBlock: "24px 0", marginInline: "0 24px", }, page_event_listeners: [ { params: { type: "click", selectors: "#shopping-sidebar-button", }, action: { dismiss: true }, }, ], }, }, ], }, priority: 1, // Auto-open feature flag is not enabled; User is not opted in; First time closing sidebar; Has not seen either on-closed callout before; Has not opted out of CFRs. targeting: `isSidebarClosing && 'browser.shopping.experience2023.autoOpen.enabled' | preferenceValue != true && 'browser.shopping.experience2023.optedIn' | preferenceValue != 1 && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false && !messageImpressions.FAKESPOT_CALLOUT_CLOSED_OPTED_IN_DEFAULT|length && !messageImpressions.FAKESPOT_CALLOUT_CLOSED_NOT_OPTED_IN_DEFAULT|length`, trigger: { id: "shoppingProductPageWithSidebarClosed" }, frequency: { lifetime: 1 }, }, { // "callout 2" in the Fakespot Figma spec id: "FAKESPOT_CALLOUT_PDP_OPTED_IN_DEFAULT", template: "feature_callout", content: { id: "FAKESPOT_CALLOUT_PDP_OPTED_IN_DEFAULT", template: "multistage", backdrop: "transparent", transitions: false, disableHistoryUpdates: true, screens: [ { id: "FAKESPOT_CALLOUT_PDP_OPTED_IN_DEFAULT", anchors: [ { selector: "#shopping-sidebar-button", panel_position: { anchor_attachment: "bottomcenter", callout_attachment: "topright", }, no_open_on_anchor: true, }, ], content: { position: "callout", title: { string_id: "shopping-callout-pdp-opted-in-title" }, subtitle: { string_id: "shopping-callout-pdp-opted-in-subtitle" }, logo: { imageURL: "chrome://browser/content/shopping/assets/ratingLight.avif", darkModeImageURL: "chrome://browser/content/shopping/assets/ratingDark.avif", height: "216px", }, dismiss_button: { action: { dismiss: true }, size: "small", marginBlock: "24px 0", marginInline: "0 24px", }, page_event_listeners: [ { params: { type: "click", selectors: "#shopping-sidebar-button", }, action: { dismiss: true }, }, ], }, }, ], }, priority: 1, // Auto-open feature flag is not enabled; User is opted in; Has not opted out of CFRs; Has seen either on-closed callout before, but not within the last 24hrs or in this session. targeting: `!isSidebarClosing && 'browser.shopping.experience2023.autoOpen.enabled' | preferenceValue != true && 'browser.shopping.experience2023.optedIn' | preferenceValue == 1 && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false && ((currentDate | date - messageImpressions.FAKESPOT_CALLOUT_CLOSED_OPTED_IN_DEFAULT[messageImpressions.FAKESPOT_CALLOUT_CLOSED_OPTED_IN_DEFAULT | length - 1] | date) / 3600000 > 24 || (currentDate | date - messageImpressions.FAKESPOT_CALLOUT_CLOSED_NOT_OPTED_IN_DEFAULT[messageImpressions.FAKESPOT_CALLOUT_CLOSED_NOT_OPTED_IN_DEFAULT | length - 1] | date) / 3600000 > 24)`, trigger: { id: "shoppingProductPageWithSidebarClosed" }, frequency: { lifetime: 1 }, }, { // "Callout 1" in the Fakespot Figma spec, but // targeting not opted-in users only for rediscoverability experiment 2. id: "FAKESPOT_CALLOUT_CLOSED_NOT_OPTED_IN_AUTO_OPEN", template: "feature_callout", content: { id: "FAKESPOT_CALLOUT_CLOSED_NOT_OPTED_IN_AUTO_OPEN", template: "multistage", backdrop: "transparent", transitions: false, disableHistoryUpdates: true, screens: [ { id: "FAKESPOT_CALLOUT_CLOSED_NOT_OPTED_IN_AUTO_OPEN", anchors: [ { selector: "#shopping-sidebar-button", panel_position: { anchor_attachment: "bottomcenter", callout_attachment: "topright", }, no_open_on_anchor: true, }, ], content: { position: "callout", width: "401px", title: { string_id: "shopping-callout-closed-not-opted-in-revised-title", }, subtitle: { string_id: "shopping-callout-closed-not-opted-in-revised-subtitle", letterSpacing: "0", }, logo: { imageURL: "chrome://browser/content/shopping/assets/priceTagButtonCallout.svg", height: "214px", }, dismiss_button: { action: { dismiss: true }, size: "small", marginBlock: "28px 0", marginInline: "0 28px", }, primary_button: { label: { string_id: "shopping-callout-closed-not-opted-in-revised-button", marginBlock: "0 -8px", }, style: "secondary", action: { dismiss: true, }, }, page_event_listeners: [ { params: { type: "click", selectors: "#shopping-sidebar-button", }, action: { dismiss: true }, }, ], }, }, ], }, priority: 1, // Auto-open feature flag is enabled; User is not opted in; First time closing sidebar; Has not opted out of CFRs. targeting: `isSidebarClosing && 'browser.shopping.experience2023.autoOpen.enabled' | preferenceValue == true && 'browser.shopping.experience2023.optedIn' | preferenceValue != 1 && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false`, trigger: { id: "shoppingProductPageWithSidebarClosed" }, frequency: { lifetime: 1 }, skip_in_tests: "not tested in automation and might pop up unexpectedly during review checker tests", }, { // "Callout 3" in the Fakespot Figma spec, but // displayed if auto-open version of "callout 1" was seen already and 24 hours have passed. id: "FAKESPOT_CALLOUT_PDP_NOT_OPTED_IN_REMINDER", template: "feature_callout", content: { id: "FAKESPOT_CALLOUT_PDP_NOT_OPTED_IN_REMINDER", template: "multistage", backdrop: "transparent", transitions: false, disableHistoryUpdates: true, screens: [ { id: "FAKESPOT_CALLOUT_PDP_NOT_OPTED_IN_REMINDER", anchors: [ { selector: "#shopping-sidebar-button", panel_position: { anchor_attachment: "bottomcenter", callout_attachment: "topright", }, no_open_on_anchor: true, }, ], content: { position: "callout", width: "401px", title: { string_id: "shopping-callout-not-opted-in-reminder-title", fontSize: "20px", letterSpacing: "0", }, subtitle: { string_id: "shopping-callout-not-opted-in-reminder-subtitle", letterSpacing: "0", }, logo: { imageURL: "chrome://browser/content/shopping/assets/reviewsVisualCallout.svg", alt: { string_id: "shopping-callout-not-opted-in-reminder-img-alt", }, height: "214px", }, dismiss_button: { action: { type: "MULTI_ACTION", collectSelect: true, data: { actions: [], }, dismiss: true, }, size: "small", marginBlock: "28px 0", marginInline: "0 28px", }, primary_button: { label: { string_id: "shopping-callout-not-opted-in-reminder-close-button", marginBlock: "0 -8px", }, style: "secondary", action: { type: "MULTI_ACTION", collectSelect: true, data: { actions: [], }, dismiss: true, }, }, secondary_button: { label: { string_id: "shopping-callout-not-opted-in-reminder-open-button", marginBlock: "0 -8px", }, style: "primary", action: { type: "MULTI_ACTION", collectSelect: true, data: { actions: [ { type: "SET_PREF", data: { pref: { name: "browser.shopping.experience2023.active", value: true, }, }, }, ], }, dismiss: true, }, }, page_event_listeners: [ { params: { type: "click", selectors: "#shopping-sidebar-button", }, action: { dismiss: true }, }, ], tiles: { type: "multiselect", style: { flexDirection: "column", alignItems: "flex-start", }, data: [ { id: "checkbox-dont-show-again", type: "checkbox", defaultValue: false, style: { alignItems: "center", }, label: { string_id: "shopping-callout-not-opted-in-reminder-ignore-checkbox", }, icon: { style: { width: "16px", height: "16px", marginInline: "0 8px", }, }, action: { type: "SET_PREF", data: { pref: { name: "messaging-system-action.shopping-callouts-1-block", value: true, }, }, }, }, ], }, }, }, ], }, priority: 2, // Auto-open feature flag is enabled; User is not opted in; Has not opted out of CFRs; Has seen callout 1 before, but not within the last 5 days. targeting: "!isSidebarClosing && 'browser.shopping.experience2023.autoOpen.enabled' | preferenceValue == true && 'browser.shopping.experience2023.optedIn' | preferenceValue == 0 && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false && !'messaging-system-action.shopping-callouts-1-block' | preferenceValue && (currentDate | date - messageImpressions.FAKESPOT_CALLOUT_CLOSED_NOT_OPTED_IN_AUTO_OPEN[messageImpressions.FAKESPOT_CALLOUT_CLOSED_NOT_OPTED_IN_AUTO_OPEN | length - 1] | date) / 3600000 > 24", trigger: { id: "shoppingProductPageWithSidebarClosed", }, frequency: { custom: [ { cap: 1, period: 432000000, }, ], lifetime: 3, }, skip_in_tests: "not tested in automation and might pop up unexpectedly during review checker tests", }, { // "Callout 4" in the Fakespot Figma spec, for rediscoverability experiment 2. id: "FAKESPOT_CALLOUT_DISABLED_AUTO_OPEN", template: "feature_callout", content: { id: "FAKESPOT_CALLOUT_DISABLED_AUTO_OPEN", template: "multistage", backdrop: "transparent", transitions: false, disableHistoryUpdates: true, screens: [ { id: "FAKESPOT_CALLOUT_DISABLED_AUTO_OPEN", anchors: [ { selector: "#shopping-sidebar-button", panel_position: { anchor_attachment: "bottomcenter", callout_attachment: "topright", }, no_open_on_anchor: true, }, ], content: { position: "callout", width: "401px", title: { string_id: "shopping-callout-disabled-auto-open-title", }, subtitle: { string_id: "shopping-callout-disabled-auto-open-subtitle", letterSpacing: "0", }, logo: { imageURL: "chrome://browser/content/shopping/assets/priceTagButtonCallout.svg", height: "214px", }, dismiss_button: { action: { dismiss: true }, size: "small", marginBlock: "28px 0", marginInline: "0 28px", }, primary_button: { label: { string_id: "shopping-callout-disabled-auto-open-button", marginBlock: "0 -8px", }, style: "secondary", action: { dismiss: true, }, }, page_event_listeners: [ { params: { type: "click", selectors: "#shopping-sidebar-button", }, action: { dismiss: true }, }, ], }, }, ], }, priority: 1, // Auto-open feature flag is enabled; User disabled auto-open behavior; User is opted in; Has not opted out of CFRs. targeting: `'browser.shopping.experience2023.autoOpen.enabled' | preferenceValue == true && 'browser.shopping.experience2023.autoOpen.userEnabled' | preferenceValue == false && 'browser.shopping.experience2023.optedIn' | preferenceValue == 1 && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false`, trigger: { id: "preferenceObserver", params: ["browser.shopping.experience2023.autoOpen.userEnabled"], }, frequency: { lifetime: 1 }, skip_in_tests: "not tested in automation and might pop up unexpectedly during review checker tests", }, { // "Callout 5" in the Fakespot Figma spec, for rediscoverability experiment 2. id: "FAKESPOT_CALLOUT_OPTED_OUT_AUTO_OPEN", template: "feature_callout", content: { id: "FAKESPOT_CALLOUT_OPTED_OUT_AUTO_OPEN", template: "multistage", backdrop: "transparent", transitions: false, disableHistoryUpdates: true, screens: [ { id: "FAKESPOT_CALLOUT_OPTED_OUT_AUTO_OPEN", anchors: [ { selector: "#shopping-sidebar-button", panel_position: { anchor_attachment: "bottomcenter", callout_attachment: "topright", }, no_open_on_anchor: true, }, ], content: { position: "callout", width: "401px", title: { string_id: "shopping-callout-opted-out-title", }, subtitle: { string_id: "shopping-callout-opted-out-subtitle", letterSpacing: "0", }, logo: { imageURL: "chrome://browser/content/shopping/assets/priceTagButtonCallout.svg", height: "214px", }, dismiss_button: { action: { dismiss: true }, size: "small", marginBlock: "28px 0", marginInline: "0 28px", }, primary_button: { label: { string_id: "shopping-callout-opted-out-button", marginBlock: "0 -8px", }, style: "secondary", action: { dismiss: true, }, }, page_event_listeners: [ { params: { type: "click", selectors: "#shopping-sidebar-button", }, action: { dismiss: true }, }, ], }, }, ], }, priority: 1, // Auto-open feature flag is enabled; User has opted out; Has not opted out of CFRs. targeting: `'browser.shopping.experience2023.autoOpen.enabled' | preferenceValue == true && 'browser.shopping.experience2023.optedIn' | preferenceValue == 2 && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false`, trigger: { id: "preferenceObserver", params: ["browser.shopping.experience2023.optedIn"], }, frequency: { lifetime: 1 }, skip_in_tests: "not tested in automation and might pop up unexpectedly during review checker tests", }, // cookie banner reduction onboarding { id: "CFR_COOKIEBANNER", groups: ["cfr"], template: "feature_callout", content: { id: "CFR_COOKIEBANNER", template: "multistage", backdrop: "transparent", transitions: false, disableHistoryUpdates: true, screens: [ { id: "COOKIEBANNER_CALLOUT", anchors: [ { selector: "#tracking-protection-icon-container", panel_position: { callout_attachment: "topleft", anchor_attachment: "bottomcenter", }, }, ], content: { position: "callout", autohide: true, title: { string_id: "cookie-banner-blocker-onboarding-header", paddingInline: "12px 0", }, subtitle: { string_id: "cookie-banner-blocker-onboarding-body", paddingInline: "34px 0", }, title_logo: { alignment: "top", height: "20px", width: "20px", imageURL: "chrome://browser/skin/controlcenter/3rdpartycookies-blocked.svg", }, dismiss_button: { size: "small", action: { dismiss: true }, }, additional_button: { label: { string_id: "cookie-banner-blocker-onboarding-learn-more", marginInline: "34px 0", }, style: "link", alignment: "start", action: { type: "OPEN_URL", data: { args: "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/cookie-banner-reduction", where: "tabshifted", }, }, }, }, }, ], }, frequency: { lifetime: 1, }, skip_in_tests: "it's not tested in automation", trigger: { id: "cookieBannerHandled", }, targeting: `'cookiebanners.ui.desktop.enabled'|preferenceValue == true && 'cookiebanners.ui.desktop.showCallout'|preferenceValue == true && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false`, }, ]; messages = add24HourImpressionJEXLTargeting( ["FIREFOX_VIEW_TAB_PICKUP_REMINDER"], "FIREFOX_VIEW", messages ); return messages; }; export const FeatureCalloutMessages = { getMessages() { return MESSAGES(); }, };