tor-browser

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

DesktopActorRegistry.sys.mjs (22188B)


      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 import { ActorManagerParent } from "resource://gre/modules/ActorManagerParent.sys.mjs";
      6 
      7 const lazy = {};
      8 
      9 ChromeUtils.defineESModuleGetters(lazy, {
     10  BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
     11 });
     12 
     13 /**
     14 * Fission-compatible JSProcess implementations.
     15 * Each actor options object takes the form of a ProcessActorOptions dictionary.
     16 * Detailed documentation of these options is in dom/docs/ipc/jsactors.rst,
     17 * available at https://firefox-source-docs.mozilla.org/dom/ipc/jsactors.html
     18 */
     19 let JSPROCESSACTORS = {
     20  // Miscellaneous stuff that needs to be initialized per process.
     21  BrowserProcess: {
     22    child: {
     23      esModuleURI: "resource:///actors/BrowserProcessChild.sys.mjs",
     24      observers: [
     25        // WebRTC related notifications. They are here to avoid loading WebRTC
     26        // components when not needed.
     27        "getUserMedia:request",
     28        "recording-device-stopped",
     29        "PeerConnection:request",
     30        "recording-device-events",
     31        "recording-window-ended",
     32      ],
     33    },
     34  },
     35 
     36  MozCachedOHTTP: {
     37    parent: {
     38      esModuleURI:
     39        "moz-src:///browser/components/mozcachedohttp/actors/MozCachedOHTTPParent.sys.mjs",
     40    },
     41    includeParent: true,
     42  },
     43 
     44  RefreshBlockerObserver: {
     45    child: {
     46      esModuleURI: "resource:///actors/RefreshBlockerChild.sys.mjs",
     47      observers: [
     48        "webnavigation-create",
     49        "chrome-webnavigation-create",
     50        "webnavigation-destroy",
     51        "chrome-webnavigation-destroy",
     52      ],
     53    },
     54 
     55    enablePreference: "accessibility.blockautorefresh",
     56    onPreferenceChanged: isEnabled => {
     57      lazy.BrowserWindowTracker.orderedWindows.forEach(win => {
     58        for (let browser of win.gBrowser.browsers) {
     59          try {
     60            browser.sendMessageToActor(
     61              "PreferenceChanged",
     62              { isEnabled },
     63              "RefreshBlocker",
     64              "all"
     65            );
     66          } catch (ex) {}
     67        }
     68      });
     69    },
     70  },
     71 };
     72 
     73 /**
     74 * Fission-compatible JSWindowActor implementations.
     75 * Detailed documentation of these options is in dom/docs/ipc/jsactors.rst,
     76 * available at https://firefox-source-docs.mozilla.org/dom/ipc/jsactors.html
     77 */
     78 let JSWINDOWACTORS = {
     79  Megalist: {
     80    parent: {
     81      esModuleURI: "resource://gre/actors/MegalistParent.sys.mjs",
     82    },
     83    child: {
     84      esModuleURI: "resource://gre/actors/MegalistChild.sys.mjs",
     85      events: {
     86        DOMContentLoaded: {},
     87      },
     88    },
     89    includeChrome: true,
     90    matches: ["chrome://global/content/megalist/megalist.html"],
     91    allFrames: true,
     92    enablePreference: "browser.contextual-password-manager.enabled",
     93  },
     94 
     95  AboutLogins: {
     96    parent: {
     97      esModuleURI: "resource:///actors/AboutLoginsParent.sys.mjs",
     98    },
     99    child: {
    100      esModuleURI: "resource:///actors/AboutLoginsChild.sys.mjs",
    101      events: {
    102        AboutLoginsCopyLoginDetail: { wantUntrusted: true },
    103        AboutLoginsCreateLogin: { wantUntrusted: true },
    104        AboutLoginsDeleteLogin: { wantUntrusted: true },
    105        AboutLoginsDismissBreachAlert: { wantUntrusted: true },
    106        AboutLoginsImportFromBrowser: { wantUntrusted: true },
    107        AboutLoginsImportFromFile: { wantUntrusted: true },
    108        AboutLoginsImportReportInit: { wantUntrusted: true },
    109        AboutLoginsImportReportReady: { wantUntrusted: true },
    110        AboutLoginsInit: { wantUntrusted: true },
    111        AboutLoginsGetHelp: { wantUntrusted: true },
    112        AboutLoginsOpenPreferences: { wantUntrusted: true },
    113        AboutLoginsOpenSite: { wantUntrusted: true },
    114        AboutLoginsRecordTelemetryEvent: { wantUntrusted: true },
    115        AboutLoginsRemoveAllLogins: { wantUntrusted: true },
    116        AboutLoginsSortChanged: { wantUntrusted: true },
    117        AboutLoginsSyncEnable: { wantUntrusted: true },
    118        AboutLoginsUpdateLogin: { wantUntrusted: true },
    119        AboutLoginsExportPasswords: { wantUntrusted: true },
    120      },
    121    },
    122    matches: ["about:logins", "about:logins?*", "about:loginsimportreport"],
    123    allFrames: true,
    124    remoteTypes: ["privilegedabout"],
    125  },
    126 
    127  AboutMessagePreview: {
    128    parent: {
    129      esModuleURI: "resource:///actors/AboutMessagePreviewParent.sys.mjs",
    130    },
    131    child: {
    132      esModuleURI: "resource:///actors/AboutMessagePreviewChild.sys.mjs",
    133      events: {
    134        DOMDocElementInserted: { capture: true },
    135      },
    136    },
    137    matches: ["about:messagepreview", "about:messagepreview?*"],
    138  },
    139 
    140  AboutPrivateBrowsing: {
    141    parent: {
    142      esModuleURI: "resource:///actors/AboutPrivateBrowsingParent.sys.mjs",
    143    },
    144    child: {
    145      esModuleURI: "resource:///actors/AboutPrivateBrowsingChild.sys.mjs",
    146 
    147      events: {
    148        DOMDocElementInserted: { capture: true },
    149      },
    150    },
    151 
    152    matches: ["about:privatebrowsing*"],
    153  },
    154 
    155  AboutProtections: {
    156    parent: {
    157      esModuleURI: "resource:///actors/AboutProtectionsParent.sys.mjs",
    158    },
    159    child: {
    160      esModuleURI: "resource:///actors/AboutProtectionsChild.sys.mjs",
    161 
    162      events: {
    163        DOMDocElementInserted: { capture: true },
    164      },
    165    },
    166 
    167    matches: ["about:protections", "about:protections?*"],
    168  },
    169 
    170  AboutReader: {
    171    parent: {
    172      esModuleURI: "resource:///actors/AboutReaderParent.sys.mjs",
    173    },
    174    child: {
    175      esModuleURI: "resource:///actors/AboutReaderChild.sys.mjs",
    176      events: {
    177        DOMContentLoaded: {},
    178        pageshow: { mozSystemGroup: true },
    179        // Don't try to create the actor if only the pagehide event fires.
    180        // This can happen with the initial about:blank documents.
    181        pagehide: { mozSystemGroup: true, createActor: false },
    182      },
    183    },
    184    messageManagerGroups: ["browsers"],
    185  },
    186 
    187  AboutTabCrashed: {
    188    parent: {
    189      esModuleURI: "resource:///actors/AboutTabCrashedParent.sys.mjs",
    190    },
    191    child: {
    192      esModuleURI: "resource:///actors/AboutTabCrashedChild.sys.mjs",
    193      events: {
    194        DOMDocElementInserted: { capture: true },
    195      },
    196    },
    197 
    198    matches: ["about:tabcrashed*"],
    199  },
    200 
    201  AboutTor: {
    202    parent: {
    203      esModuleURI: "resource:///actors/AboutTorParent.sys.mjs",
    204    },
    205    child: {
    206      esModuleURI: "resource:///actors/AboutTorChild.sys.mjs",
    207 
    208      events: {
    209        DOMContentLoaded: {},
    210        L10nMutationsFinished: {},
    211        SubmitSearchOnionize: { wantUntrusted: true },
    212        SurveyDismissed: { wantUntrusted: true },
    213        UserDismissedYEC: { wantUntrusted: true },
    214      },
    215    },
    216 
    217    matches: ["about:tor"],
    218  },
    219 
    220  AboutWelcome: {
    221    parent: {
    222      esModuleURI: "resource:///actors/AboutWelcomeParent.sys.mjs",
    223    },
    224    child: {
    225      esModuleURI: "resource:///actors/AboutWelcomeChild.sys.mjs",
    226      events: {
    227        // This is added so the actor instantiates immediately and makes
    228        // methods available to the page js on load.
    229        DOMDocElementInserted: {},
    230      },
    231    },
    232    matches: ["about:welcome"],
    233    remoteTypes: ["privilegedabout"],
    234 
    235    // See Bug 1618306
    236    // Remove this preference check when we turn on separate about:welcome for all users.
    237    enablePreference: "browser.aboutwelcome.enabled",
    238  },
    239 
    240  AIChatContent: {
    241    parent: {
    242      esModuleURI:
    243        "moz-src:///browser/components/aiwindow/ui/actors/AIChatContentParent.sys.mjs",
    244    },
    245    child: {
    246      esModuleURI:
    247        "moz-src:///browser/components/aiwindow/ui/actors/AIChatContentChild.sys.mjs",
    248      events: {
    249        "AIChatContent:DispatchSearch": { wantUntrusted: true },
    250      },
    251    },
    252    allFrames: true,
    253    matches: ["about:aichatcontent"],
    254    enablePreference: "browser.aiwindow.enabled",
    255  },
    256 
    257  BackupUI: {
    258    parent: {
    259      esModuleURI: "resource:///actors/BackupUIParent.sys.mjs",
    260    },
    261    child: {
    262      esModuleURI: "resource:///actors/BackupUIChild.sys.mjs",
    263      events: {
    264        "BackupUI:InitWidget": { wantUntrusted: true },
    265        "BackupUI:TriggerCreateBackup": { wantUntrusted: true },
    266        "BackupUI:EnableScheduledBackups": { wantUntrusted: true },
    267        "BackupUI:DisableScheduledBackups": { wantUntrusted: true },
    268        "BackupUI:ShowFilepicker": { wantUntrusted: true },
    269        "BackupUI:GetBackupFileInfo": { wantUntrusted: true },
    270        "BackupUI:RestoreFromBackupFile": { wantUntrusted: true },
    271        "BackupUI:RestoreFromBackupChooseFile": { wantUntrusted: true },
    272        "BackupUI:EnableEncryption": { wantUntrusted: true },
    273        "BackupUI:DisableEncryption": { wantUntrusted: true },
    274        "BackupUI:ShowBackupLocation": { wantUntrusted: true },
    275        "BackupUI:EditBackupLocation": { wantUntrusted: true },
    276        "BackupUI:SetEmbeddedComponentPersistentData": { wantUntrusted: true },
    277        "BackupUI:FlushEmbeddedComponentPersistentData": {
    278          wantUntrusted: true,
    279        },
    280        "BackupUI:ErrorBarDismissed": { wantUntrusted: true },
    281      },
    282    },
    283    includeChrome: true,
    284    allFrames: true,
    285    matches: [
    286      "about:preferences*",
    287      "about:settings*",
    288      "about:welcome*",
    289      "chrome://browser/content/spotlight.html",
    290    ],
    291  },
    292 
    293  BlockedSite: {
    294    parent: {
    295      esModuleURI: "resource:///actors/BlockedSiteParent.sys.mjs",
    296    },
    297    child: {
    298      esModuleURI: "resource:///actors/BlockedSiteChild.sys.mjs",
    299      events: {
    300        AboutBlockedLoaded: { wantUntrusted: true },
    301        click: {},
    302      },
    303    },
    304    matches: ["about:blocked?*"],
    305    allFrames: true,
    306  },
    307 
    308  BrowserTab: {
    309    child: {
    310      esModuleURI: "resource:///actors/BrowserTabChild.sys.mjs",
    311    },
    312 
    313    messageManagerGroups: ["browsers"],
    314  },
    315 
    316  CanonicalURL: {
    317    parent: {
    318      esModuleURI: "resource:///actors/CanonicalURLParent.sys.mjs",
    319    },
    320    child: {
    321      esModuleURI: "resource:///actors/CanonicalURLChild.sys.mjs",
    322      events: {
    323        DOMContentLoaded: {},
    324        pageshow: {},
    325      },
    326    },
    327    enablePreference: "browser.tabs.notes.enabled",
    328    matches: ["http://*/*", "https://*/*"],
    329    messageManagerGroups: ["browsers"],
    330  },
    331 
    332  ClickHandler: {
    333    parent: {
    334      esModuleURI: "resource:///actors/ClickHandlerParent.sys.mjs",
    335    },
    336    child: {
    337      esModuleURI: "resource:///actors/ClickHandlerChild.sys.mjs",
    338      events: {
    339        chromelinkclick: { capture: true, mozSystemGroup: true },
    340      },
    341    },
    342 
    343    allFrames: true,
    344  },
    345 
    346  CryptoSafety: {
    347    parent: {
    348      esModuleURI: "resource:///actors/CryptoSafetyParent.sys.mjs",
    349    },
    350 
    351    child: {
    352      esModuleURI: "resource:///actors/CryptoSafetyChild.sys.mjs",
    353      group: "browsers",
    354      events: {
    355        copy: { mozSystemGroup: true },
    356        cut: { mozSystemGroup: true },
    357      },
    358    },
    359 
    360    allFrames: true,
    361  },
    362 
    363  /* Note: this uses the same JSMs as ClickHandler, but because it
    364   * relies on "normal" click events anywhere on the page (not just
    365   * links) and is expensive, and only does something for the
    366   * small group of people who have the feature enabled, it is its
    367   * own actor which is only registered if the pref is enabled.
    368   */
    369  MiddleMousePasteHandler: {
    370    parent: {
    371      esModuleURI: "resource:///actors/ClickHandlerParent.sys.mjs",
    372    },
    373    child: {
    374      esModuleURI: "resource:///actors/ClickHandlerChild.sys.mjs",
    375      events: {
    376        auxclick: { capture: true, mozSystemGroup: true },
    377      },
    378    },
    379    enablePreference: "middlemouse.contentLoadURL",
    380 
    381    allFrames: true,
    382  },
    383 
    384  ContentSearch: {
    385    parent: {
    386      esModuleURI: "resource:///actors/ContentSearchParent.sys.mjs",
    387    },
    388    child: {
    389      esModuleURI: "resource:///actors/ContentSearchChild.sys.mjs",
    390      events: {
    391        ContentSearchClient: { capture: true, wantUntrusted: true },
    392      },
    393    },
    394    matches: [
    395      "about:home",
    396      "about:welcome",
    397      "about:newtab",
    398      "about:privatebrowsing",
    399      "about:test-about-content-search-ui",
    400    ],
    401    remoteTypes: ["privilegedabout"],
    402  },
    403 
    404  ContextMenu: {
    405    parent: {
    406      esModuleURI: "resource:///actors/ContextMenuParent.sys.mjs",
    407    },
    408 
    409    child: {
    410      esModuleURI: "resource:///actors/ContextMenuChild.sys.mjs",
    411      events: {
    412        contextmenu: { mozSystemGroup: true },
    413      },
    414    },
    415 
    416    allFrames: true,
    417  },
    418 
    419  CustomKeys: {
    420    parent: {
    421      esModuleURI: "resource:///actors/CustomKeysParent.sys.mjs",
    422    },
    423    child: {
    424      esModuleURI: "resource:///actors/CustomKeysChild.sys.mjs",
    425      events: {
    426        DOMDocElementInserted: { wantUntrusted: true },
    427      },
    428    },
    429    matches: ["about:keyboard"],
    430    remoteTypes: ["privilegedabout"],
    431  },
    432 
    433  DecoderDoctor: {
    434    parent: {
    435      esModuleURI: "resource:///actors/DecoderDoctorParent.sys.mjs",
    436    },
    437 
    438    child: {
    439      esModuleURI: "resource:///actors/DecoderDoctorChild.sys.mjs",
    440      observers: ["decoder-doctor-notification"],
    441    },
    442 
    443    messageManagerGroups: ["browsers"],
    444    allFrames: true,
    445  },
    446 
    447  DOMFullscreen: {
    448    parent: {
    449      esModuleURI: "resource:///actors/DOMFullscreenParent.sys.mjs",
    450    },
    451 
    452    child: {
    453      esModuleURI: "resource:///actors/DOMFullscreenChild.sys.mjs",
    454      events: {
    455        "MozDOMFullscreen:Request": {},
    456        "MozDOMFullscreen:Entered": {},
    457        "MozDOMFullscreen:NewOrigin": {},
    458        "MozDOMFullscreen:Exit": {},
    459        "MozDOMFullscreen:Exited": {},
    460      },
    461    },
    462 
    463    messageManagerGroups: ["browsers"],
    464    allFrames: true,
    465  },
    466 
    467  EncryptedMedia: {
    468    parent: {
    469      esModuleURI: "resource:///actors/EncryptedMediaParent.sys.mjs",
    470    },
    471 
    472    child: {
    473      esModuleURI: "resource:///actors/EncryptedMediaChild.sys.mjs",
    474      observers: ["mediakeys-request"],
    475    },
    476 
    477    messageManagerGroups: ["browsers"],
    478    allFrames: true,
    479  },
    480 
    481  FormValidation: {
    482    parent: {
    483      esModuleURI: "resource:///actors/FormValidationParent.sys.mjs",
    484    },
    485 
    486    child: {
    487      esModuleURI: "resource:///actors/FormValidationChild.sys.mjs",
    488      events: {
    489        MozInvalidForm: {},
    490        // Listening to ‘pageshow’ event is only relevant if an invalid form
    491        // popup was open, so don't create the actor when fired.
    492        pageshow: { createActor: false },
    493      },
    494    },
    495 
    496    allFrames: true,
    497  },
    498 
    499  // GenAIParent.sys.mjs and GenAIChild.sys.mjs are missing. tor-browser#44045.
    500 
    501  LightweightTheme: {
    502    child: {
    503      esModuleURI: "resource:///actors/LightweightThemeChild.sys.mjs",
    504      events: {
    505        pageshow: { mozSystemGroup: true },
    506        DOMContentLoaded: {},
    507      },
    508    },
    509    includeChrome: true,
    510    allFrames: true,
    511    matches: [
    512      "about:asrouter",
    513      "about:home",
    514      "about:newtab",
    515      "about:welcome",
    516      "chrome://browser/content/syncedtabs/sidebar.xhtml",
    517      "chrome://browser/content/places/historySidebar.xhtml",
    518      "chrome://browser/content/places/bookmarksSidebar.xhtml",
    519      "chrome://browser/content/sidebar/sidebar-history.html",
    520      "chrome://browser/content/sidebar/sidebar-customize.html",
    521      "chrome://browser/content/sidebar/sidebar-syncedtabs.html",
    522      "chrome://browser/content/genai/chat.html",
    523      "about:firefoxview",
    524      "about:editprofile",
    525      "about:deleteprofile",
    526      "about:newprofile",
    527      "about:opentabs",
    528    ],
    529  },
    530 
    531  LinkHandler: {
    532    parent: {
    533      esModuleURI: "resource:///actors/LinkHandlerParent.sys.mjs",
    534    },
    535    child: {
    536      esModuleURI: "resource:///actors/LinkHandlerChild.sys.mjs",
    537      events: {
    538        DOMHeadElementParsed: {},
    539        DOMLinkAdded: {},
    540        DOMLinkChanged: {},
    541        pageshow: {},
    542        // The `pagehide` event is only used to clean up state which will not be
    543        // present if the actor hasn't been created.
    544        pagehide: { createActor: false },
    545      },
    546    },
    547 
    548    messageManagerGroups: ["browsers"],
    549  },
    550 
    551  // LinkPreviewParent.sys.mjs and LinkPreviewChild.sys.mjs are missing.
    552  // tor-browser#44045.
    553 
    554  OnionLocation: {
    555    parent: {
    556      esModuleURI: "resource:///modules/OnionLocationParent.sys.mjs",
    557    },
    558    child: {
    559      esModuleURI: "resource:///modules/OnionLocationChild.sys.mjs",
    560      events: {
    561        pageshow: { mozSystemGroup: true },
    562      },
    563    },
    564    messageManagerGroups: ["browsers"],
    565  },
    566 
    567  PageAssist: {
    568    parent: {
    569      esModuleURI: "resource:///actors/PageAssistParent.sys.mjs",
    570    },
    571    child: {
    572      esModuleURI: "resource:///actors/PageAssistChild.sys.mjs",
    573    },
    574    includeChrome: true,
    575    enablePreference: "browser.ml.pageAssist.enabled",
    576  },
    577 
    578  PageInfo: {
    579    child: {
    580      esModuleURI: "resource:///actors/PageInfoChild.sys.mjs",
    581    },
    582 
    583    allFrames: true,
    584  },
    585 
    586  PageInfoPreview: {
    587    child: {
    588      esModuleURI: "resource:///actors/PageInfoPreviewChild.sys.mjs",
    589    },
    590  },
    591 
    592  PageStyle: {
    593    parent: {
    594      esModuleURI: "resource:///actors/PageStyleParent.sys.mjs",
    595    },
    596    child: {
    597      esModuleURI: "resource:///actors/PageStyleChild.sys.mjs",
    598      events: {
    599        pageshow: { createActor: false },
    600      },
    601    },
    602 
    603    messageManagerGroups: ["browsers"],
    604    allFrames: true,
    605  },
    606 
    607  Pdfjs: {
    608    parent: {
    609      esModuleURI: "resource://pdf.js/PdfjsParent.sys.mjs",
    610    },
    611    child: {
    612      esModuleURI: "resource://pdf.js/PdfjsChild.sys.mjs",
    613    },
    614    allFrames: true,
    615  },
    616 
    617  // GMP crash reporting
    618  Plugin: {
    619    parent: {
    620      esModuleURI: "resource:///actors/PluginParent.sys.mjs",
    621    },
    622    child: {
    623      esModuleURI: "resource:///actors/PluginChild.sys.mjs",
    624      events: {
    625        PluginCrashed: { capture: true },
    626      },
    627    },
    628 
    629    allFrames: true,
    630  },
    631 
    632  PointerLock: {
    633    parent: {
    634      esModuleURI: "resource:///actors/PointerLockParent.sys.mjs",
    635    },
    636    child: {
    637      esModuleURI: "resource:///actors/PointerLockChild.sys.mjs",
    638      events: {
    639        "MozDOMPointerLock:Entered": {},
    640        "MozDOMPointerLock:Exited": {},
    641      },
    642    },
    643 
    644    messageManagerGroups: ["browsers"],
    645    allFrames: true,
    646  },
    647 
    648  Profiles: {
    649    parent: {
    650      esModuleURI: "resource:///actors/ProfilesParent.sys.mjs",
    651    },
    652    child: {
    653      esModuleURI: "resource:///actors/ProfilesChild.sys.mjs",
    654      events: {
    655        DOMDocElementInserted: { wantUntrusted: true },
    656      },
    657    },
    658    matches: ["about:editprofile", "about:deleteprofile", "about:newprofile"],
    659    remoteTypes: ["privilegedabout"],
    660  },
    661 
    662  Prompt: {
    663    parent: {
    664      esModuleURI: "resource:///actors/PromptParent.sys.mjs",
    665    },
    666    includeChrome: true,
    667    allFrames: true,
    668  },
    669 
    670  RefreshBlocker: {
    671    parent: {
    672      esModuleURI: "resource:///actors/RefreshBlockerParent.sys.mjs",
    673    },
    674    child: {
    675      esModuleURI: "resource:///actors/RefreshBlockerChild.sys.mjs",
    676    },
    677 
    678    messageManagerGroups: ["browsers"],
    679    enablePreference: "accessibility.blockautorefresh",
    680  },
    681 
    682  Rulesets: {
    683    parent: {
    684      esModuleURI: "resource:///modules/RulesetsParent.sys.mjs",
    685    },
    686    child: {
    687      esModuleURI: "resource:///modules/RulesetsChild.sys.mjs",
    688      events: {
    689        DOMWindowCreated: {},
    690      },
    691    },
    692    matches: ["about:rulesets*"],
    693  },
    694 
    695  ScreenshotsComponent: {
    696    parent: {
    697      esModuleURI: "resource:///modules/ScreenshotsUtils.sys.mjs",
    698    },
    699    child: {
    700      esModuleURI: "resource:///actors/ScreenshotsComponentChild.sys.mjs",
    701      events: {
    702        "Screenshots:Close": {},
    703        "Screenshots:Copy": {},
    704        "Screenshots:Download": {},
    705        "Screenshots:HidePanel": {},
    706        "Screenshots:OverlaySelection": {},
    707        "Screenshots:RecordEvent": {},
    708        "Screenshots:ShowPanel": {},
    709        "Screenshots:FocusPanel": {},
    710      },
    711    },
    712    enablePreference: "screenshots.browser.component.enabled",
    713  },
    714 
    715  ScreenshotsHelper: {
    716    parent: {
    717      esModuleURI: "resource:///modules/ScreenshotsUtils.sys.mjs",
    718    },
    719    child: {
    720      esModuleURI: "resource:///modules/ScreenshotsHelperChild.sys.mjs",
    721    },
    722    allFrames: true,
    723    enablePreference: "screenshots.browser.component.enabled",
    724  },
    725 
    726  SearchSERPTelemetry: {
    727    parent: {
    728      esModuleURI: "resource:///actors/SearchSERPTelemetryParent.sys.mjs",
    729    },
    730    child: {
    731      esModuleURI: "resource:///actors/SearchSERPTelemetryChild.sys.mjs",
    732      events: {
    733        DOMContentLoaded: {},
    734        pageshow: { mozSystemGroup: true },
    735        // The 'pagehide' event is only used to clean up state, and should not
    736        // force actor creation.
    737        pagehide: { createActor: false },
    738        load: { mozSystemGroup: true, capture: true },
    739      },
    740    },
    741    matches: ["https://*/*"],
    742  },
    743 
    744  ShieldFrame: {
    745    parent: {
    746      esModuleURI: "resource://normandy-content/ShieldFrameParent.sys.mjs",
    747    },
    748    child: {
    749      esModuleURI: "resource://normandy-content/ShieldFrameChild.sys.mjs",
    750      events: {
    751        pageshow: {},
    752        pagehide: {},
    753        ShieldPageEvent: { wantUntrusted: true },
    754      },
    755    },
    756    matches: ["about:studies*"],
    757  },
    758 
    759  SpeechDispatcher: {
    760    parent: {
    761      esModuleURI: "resource:///actors/SpeechDispatcherParent.sys.mjs",
    762    },
    763 
    764    child: {
    765      esModuleURI: "resource:///actors/SpeechDispatcherChild.sys.mjs",
    766      observers: ["chrome-synth-voices-error"],
    767    },
    768 
    769    messageManagerGroups: ["browsers"],
    770    allFrames: true,
    771  },
    772 
    773  SwitchDocumentDirection: {
    774    child: {
    775      esModuleURI: "resource:///actors/SwitchDocumentDirectionChild.sys.mjs",
    776    },
    777 
    778    allFrames: true,
    779  },
    780 
    781  TLSCertificateBinding: {
    782    child: {
    783      esModuleURI: "resource:///actors/TLSCertificateBindingChild.sys.mjs",
    784    },
    785 
    786    messageManagerGroups: ["browsers"],
    787  },
    788 
    789  UITour: {
    790    parent: {
    791      esModuleURI: "moz-src:///browser/components/uitour/UITourParent.sys.mjs",
    792    },
    793    child: {
    794      esModuleURI: "moz-src:///browser/components/uitour/UITourChild.sys.mjs",
    795      events: {
    796        mozUITour: { wantUntrusted: true },
    797      },
    798    },
    799 
    800    enablePreference: "browser.uitour.enabled",
    801    messageManagerGroups: ["browsers"],
    802  },
    803 
    804  WebRTC: {
    805    parent: {
    806      esModuleURI: "resource:///actors/WebRTCParent.sys.mjs",
    807    },
    808    child: {
    809      esModuleURI: "resource:///actors/WebRTCChild.sys.mjs",
    810    },
    811 
    812    allFrames: true,
    813  },
    814 };
    815 
    816 export let DesktopActorRegistry = {
    817  init() {
    818    ActorManagerParent.addJSProcessActors(JSPROCESSACTORS);
    819    ActorManagerParent.addJSWindowActors(JSWINDOWACTORS);
    820  },
    821 };