Spotlight.sys.mjs (2560B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 const lazy = {}; 6 7 ChromeUtils.defineESModuleGetters(lazy, { 8 AboutWelcomeTelemetry: 9 "resource:///modules/aboutwelcome/AboutWelcomeTelemetry.sys.mjs", 10 }); 11 12 ChromeUtils.defineLazyGetter( 13 lazy, 14 "AWTelemetry", 15 () => new lazy.AboutWelcomeTelemetry() 16 ); 17 18 export const Spotlight = { 19 sendUserEventTelemetry(event, message, dispatch) { 20 const ping = { 21 message_id: message.content.id, 22 event, 23 }; 24 dispatch({ 25 type: "SPOTLIGHT_TELEMETRY", 26 data: { action: "spotlight_user_event", ...ping }, 27 }); 28 }, 29 30 defaultDispatch(message) { 31 if (message.type === "SPOTLIGHT_TELEMETRY") { 32 const { message_id, event } = message.data; 33 lazy.AWTelemetry.sendTelemetry({ message_id, event }); 34 } 35 }, 36 37 /** 38 * Shows spotlight tab or window modal specific to the given browser 39 * 40 * @param browser The browser for spotlight display 41 * @param message Message containing content to show 42 * @param dispatchCFRAction A function to dispatch resulting actions 43 * @return boolean value capturing if spotlight was displayed 44 */ 45 async showSpotlightDialog(browser, message, dispatch = this.defaultDispatch) { 46 const win = browser?.ownerGlobal; 47 if (!win || win.gDialogBox.isOpen) { 48 return false; 49 } 50 const spotlight_url = "chrome://browser/content/spotlight.html"; 51 52 const dispatchCFRAction = 53 // This also blocks CFR impressions, which is fine for current use cases. 54 message.content?.metrics === "block" ? () => {} : dispatch; 55 56 // This handles `IMPRESSION` events used by ASRouter for frequency caps. 57 // AboutWelcome handles `IMPRESSION` events for telemetry. 58 this.sendUserEventTelemetry("IMPRESSION", message, dispatchCFRAction); 59 dispatchCFRAction({ type: "IMPRESSION", data: message }); 60 61 if (message.content?.modal === "tab") { 62 let { closedPromise } = win.gBrowser.getTabDialogBox(browser).open( 63 spotlight_url, 64 { 65 features: "resizable=no", 66 allowDuplicateDialogs: false, 67 }, 68 message.content 69 ); 70 await closedPromise; 71 } else { 72 await win.gDialogBox.open(spotlight_url, message.content); 73 } 74 75 // If dismissed report telemetry and exit 76 this.sendUserEventTelemetry("DISMISS", message, dispatchCFRAction); 77 return true; 78 }, 79 };