tor-browser

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

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 };