summaryrefslogtreecommitdiffstats
path: root/toolkit/modules/ActorManagerParent.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/modules/ActorManagerParent.sys.mjs')
-rw-r--r--toolkit/modules/ActorManagerParent.sys.mjs662
1 files changed, 662 insertions, 0 deletions
diff --git a/toolkit/modules/ActorManagerParent.sys.mjs b/toolkit/modules/ActorManagerParent.sys.mjs
new file mode 100644
index 0000000000..7805aa1da3
--- /dev/null
+++ b/toolkit/modules/ActorManagerParent.sys.mjs
@@ -0,0 +1,662 @@
+/* vim: set ts=2 sw=2 sts=2 et tw=80: */
+/* 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/. */
+
+/**
+ * This module handles JavaScript-implemented JSWindowActors, registered through DOM IPC
+ * infrastructure, and are fission-compatible.
+ */
+
+import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs";
+import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
+
+/**
+ * Fission-compatible JSProcess implementations.
+ * Each actor options object takes the form of a ProcessActorOptions dictionary.
+ * Detailed documentation of these options is in dom/docs/ipc/jsactors.rst,
+ * available at https://firefox-source-docs.mozilla.org/dom/ipc/jsactors.html
+ */
+let JSPROCESSACTORS = {
+ AsyncPrefs: {
+ parent: {
+ esModuleURI: "resource://gre/modules/AsyncPrefs.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/modules/AsyncPrefs.sys.mjs",
+ },
+ },
+
+ ContentPrefs: {
+ parent: {
+ esModuleURI: "resource://gre/modules/ContentPrefServiceParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/modules/ContentPrefServiceChild.sys.mjs",
+ },
+ },
+
+ ExtensionContent: {
+ child: {
+ esModuleURI: "resource://gre/modules/ExtensionContent.sys.mjs",
+ },
+ includeParent: true,
+ },
+
+ ProcessConduits: {
+ parent: {
+ esModuleURI: "resource://gre/modules/ConduitsParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/modules/ConduitsChild.sys.mjs",
+ },
+ },
+};
+
+/**
+ * Fission-compatible JSWindowActor implementations.
+ * Each actor options object takes the form of a WindowActorOptions dictionary.
+ * Detailed documentation of these options is in dom/docs/ipc/jsactors.rst,
+ * available at https://firefox-source-docs.mozilla.org/dom/ipc/jsactors.html
+ */
+let JSWINDOWACTORS = {
+ AboutCertViewer: {
+ parent: {
+ esModuleURI: "resource://gre/modules/AboutCertViewerParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/modules/AboutCertViewerChild.sys.mjs",
+
+ events: {
+ DOMDocElementInserted: { capture: true },
+ },
+ },
+
+ matches: ["about:certificate"],
+ },
+
+ AboutHttpsOnlyError: {
+ parent: {
+ esModuleURI: "resource://gre/actors/AboutHttpsOnlyErrorParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/AboutHttpsOnlyErrorChild.sys.mjs",
+ events: {
+ DOMDocElementInserted: {},
+ },
+ },
+ matches: ["about:httpsonlyerror?*"],
+ allFrames: true,
+ },
+
+ AboutTranslations: {
+ parent: {
+ esModuleURI: "resource://gre/actors/AboutTranslationsParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/AboutTranslationsChild.sys.mjs",
+ events: {
+ // Run the actor before any content of the page appears to inject functions.
+ DOMDocElementInserted: {},
+ DOMContentLoaded: {},
+ // Used to show and hide the translations button.
+ pageshow: { mozSystemGroup: true },
+ pagehide: { mozSystemGroup: true },
+ },
+ },
+ matches: ["about:translations"],
+
+ enablePreference: "browser.translations.enable",
+ },
+
+ AudioPlayback: {
+ parent: {
+ esModuleURI: "resource://gre/actors/AudioPlaybackParent.sys.mjs",
+ },
+
+ child: {
+ esModuleURI: "resource://gre/actors/AudioPlaybackChild.sys.mjs",
+ observers: ["audio-playback"],
+ },
+
+ allFrames: true,
+ },
+
+ AutoComplete: {
+ parent: {
+ esModuleURI: "resource://gre/actors/AutoCompleteParent.sys.mjs",
+ // These two messages are also used, but are currently synchronous calls
+ // through the per-process message manager.
+ // "FormAutoComplete:GetSelectedIndex",
+ // "FormAutoComplete:SelectBy"
+ },
+
+ child: {
+ esModuleURI: "resource://gre/actors/AutoCompleteChild.sys.mjs",
+ },
+
+ allFrames: true,
+ },
+
+ Autoplay: {
+ parent: {
+ esModuleURI: "resource://gre/actors/AutoplayParent.sys.mjs",
+ },
+
+ child: {
+ esModuleURI: "resource://gre/actors/AutoplayChild.sys.mjs",
+ events: {
+ GloballyAutoplayBlocked: {},
+ },
+ },
+
+ allFrames: true,
+ },
+
+ AutoScroll: {
+ parent: {
+ esModuleURI: "resource://gre/actors/AutoScrollParent.sys.mjs",
+ },
+
+ child: {
+ esModuleURI: "resource://gre/actors/AutoScrollChild.sys.mjs",
+ events: {
+ mousedown: { capture: true, mozSystemGroup: true },
+ },
+ },
+
+ allFrames: true,
+ },
+
+ BackgroundThumbnails: {
+ child: {
+ esModuleURI: "resource://gre/actors/BackgroundThumbnailsChild.sys.mjs",
+ events: {
+ DOMDocElementInserted: { capture: true },
+ },
+ },
+ messageManagerGroups: ["thumbnails"],
+ },
+
+ BrowserElement: {
+ parent: {
+ esModuleURI: "resource://gre/actors/BrowserElementParent.sys.mjs",
+ },
+
+ child: {
+ esModuleURI: "resource://gre/actors/BrowserElementChild.sys.mjs",
+ events: {
+ DOMWindowClose: {},
+ },
+ },
+
+ allFrames: true,
+ },
+
+ Conduits: {
+ parent: {
+ esModuleURI: "resource://gre/modules/ConduitsParent.sys.mjs",
+ },
+
+ child: {
+ esModuleURI: "resource://gre/modules/ConduitsChild.sys.mjs",
+ },
+
+ allFrames: true,
+ },
+
+ Controllers: {
+ parent: {
+ esModuleURI: "resource://gre/actors/ControllersParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/ControllersChild.sys.mjs",
+ },
+
+ allFrames: true,
+ },
+
+ CookieBanner: {
+ parent: {
+ esModuleURI: "resource://gre/actors/CookieBannerParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/CookieBannerChild.sys.mjs",
+ events: {
+ DOMContentLoaded: {},
+ load: { capture: true },
+ },
+ },
+ // Only need handle cookie banners for HTTP/S scheme.
+ matches: ["https://*/*", "http://*/*"],
+ // Only handle banners for browser tabs (including sub-frames).
+ messageManagerGroups: ["browsers"],
+ // Cookie banners can be shown in sub-frames so we need to include them.
+ allFrames: true,
+ enablePreference: "cookiebanners.bannerClicking.enabled",
+ },
+
+ ExtFind: {
+ child: {
+ esModuleURI: "resource://gre/actors/ExtFindChild.sys.mjs",
+ },
+
+ allFrames: true,
+ },
+
+ FindBar: {
+ parent: {
+ esModuleURI: "resource://gre/actors/FindBarParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/FindBarChild.sys.mjs",
+ events: {
+ keypress: { mozSystemGroup: true },
+ },
+ },
+
+ allFrames: true,
+ messageManagerGroups: ["browsers", "test"],
+ },
+
+ // This is the actor that responds to requests from the find toolbar and
+ // searches for matches and highlights them.
+ Finder: {
+ child: {
+ esModuleURI: "resource://gre/actors/FinderChild.sys.mjs",
+ },
+
+ allFrames: true,
+ },
+
+ FormHistory: {
+ parent: {
+ esModuleURI: "resource://gre/actors/FormHistoryParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/FormHistoryChild.sys.mjs",
+ events: {
+ DOMFormBeforeSubmit: {},
+ },
+ },
+
+ allFrames: true,
+ },
+
+ InlineSpellChecker: {
+ parent: {
+ esModuleURI: "resource://gre/actors/InlineSpellCheckerParent.sys.mjs",
+ },
+
+ child: {
+ esModuleURI: "resource://gre/actors/InlineSpellCheckerChild.sys.mjs",
+ },
+
+ allFrames: true,
+ },
+
+ KeyPressEventModelChecker: {
+ child: {
+ esModuleURI:
+ "resource://gre/actors/KeyPressEventModelCheckerChild.sys.mjs",
+ events: {
+ CheckKeyPressEventModel: { capture: true, mozSystemGroup: true },
+ },
+ },
+
+ allFrames: true,
+ },
+
+ LoginManager: {
+ parent: {
+ esModuleURI: "resource://gre/modules/LoginManagerParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/modules/LoginManagerChild.sys.mjs",
+ events: {
+ DOMDocFetchSuccess: {},
+ DOMFormBeforeSubmit: {},
+ DOMFormHasPassword: {},
+ DOMFormHasPossibleUsername: {},
+ DOMInputPasswordAdded: {},
+ },
+ },
+
+ allFrames: true,
+ messageManagerGroups: ["browsers", "webext-browsers", ""],
+ },
+
+ ManifestMessages: {
+ child: {
+ esModuleURI: "resource://gre/modules/ManifestMessagesChild.sys.mjs",
+ },
+ },
+
+ NetError: {
+ parent: {
+ esModuleURI: "resource://gre/actors/NetErrorParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/NetErrorChild.sys.mjs",
+ events: {
+ DOMDocElementInserted: {},
+ click: {},
+ },
+ },
+
+ matches: ["about:certerror?*", "about:neterror?*"],
+ allFrames: true,
+ },
+
+ PictureInPictureLauncher: {
+ parent: {
+ esModuleURI: "resource://gre/modules/PictureInPicture.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/PictureInPictureChild.sys.mjs",
+ events: {
+ MozTogglePictureInPicture: { capture: true },
+ },
+ },
+
+ allFrames: true,
+ },
+
+ PictureInPicture: {
+ parent: {
+ esModuleURI: "resource://gre/modules/PictureInPicture.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/PictureInPictureChild.sys.mjs",
+ },
+
+ allFrames: true,
+ },
+
+ PictureInPictureToggle: {
+ parent: {
+ esModuleURI: "resource://gre/modules/PictureInPicture.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/PictureInPictureChild.sys.mjs",
+ events: {
+ UAWidgetSetupOrChange: {},
+ contextmenu: { capture: true },
+ },
+ },
+
+ allFrames: true,
+ },
+
+ PopupBlocking: {
+ parent: {
+ esModuleURI: "resource://gre/actors/PopupBlockingParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/PopupBlockingChild.sys.mjs",
+ events: {
+ DOMPopupBlocked: { capture: true },
+ // Only listen for the `pageshow` event after the actor has already been
+ // created for some other reason.
+ pageshow: { createActor: false },
+ },
+ },
+ allFrames: true,
+ },
+
+ Printing: {
+ parent: {
+ esModuleURI: "resource://gre/actors/PrintingParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/PrintingChild.sys.mjs",
+ events: {
+ PrintingError: { capture: true },
+ printPreviewUpdate: { capture: true },
+ },
+ },
+ },
+
+ PrintingSelection: {
+ child: {
+ esModuleURI: "resource://gre/actors/PrintingSelectionChild.sys.mjs",
+ },
+ allFrames: true,
+ },
+
+ PurgeSessionHistory: {
+ child: {
+ esModuleURI: "resource://gre/actors/PurgeSessionHistoryChild.sys.mjs",
+ },
+ allFrames: true,
+ },
+
+ // This actor is available for all pages that one can
+ // view the source of, however it won't be created until a
+ // request to view the source is made via the message
+ // 'ViewSource:LoadSource' or 'ViewSource:LoadSourceWithSelection'.
+ ViewSource: {
+ child: {
+ esModuleURI: "resource://gre/actors/ViewSourceChild.sys.mjs",
+ },
+
+ allFrames: true,
+ },
+
+ // This actor is for the view-source page itself.
+ ViewSourcePage: {
+ parent: {
+ esModuleURI: "resource://gre/actors/ViewSourcePageParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/ViewSourcePageChild.sys.mjs",
+ events: {
+ pageshow: { capture: true },
+ click: {},
+ },
+ },
+
+ matches: ["view-source:*"],
+ allFrames: true,
+ },
+
+ WebChannel: {
+ parent: {
+ esModuleURI: "resource://gre/actors/WebChannelParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/WebChannelChild.sys.mjs",
+ events: {
+ WebChannelMessageToChrome: { capture: true, wantUntrusted: true },
+ },
+ },
+
+ allFrames: true,
+ },
+
+ Thumbnails: {
+ child: {
+ esModuleURI: "resource://gre/actors/ThumbnailsChild.sys.mjs",
+ },
+ },
+
+ // The newer translations feature backed by local machine learning models.
+ // See Bug 971044.
+ Translations: {
+ parent: {
+ esModuleURI: "resource://gre/actors/TranslationsParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/TranslationsChild.sys.mjs",
+ events: {
+ pageshow: {},
+ DOMHeadElementParsed: {},
+ DOMDocElementInserted: {},
+ DOMContentLoaded: {},
+ },
+ },
+ enablePreference: "browser.translations.enable",
+ },
+
+ UAWidgets: {
+ child: {
+ esModuleURI: "resource://gre/actors/UAWidgetsChild.sys.mjs",
+ events: {
+ UAWidgetSetupOrChange: {},
+ UAWidgetTeardown: {},
+ },
+ },
+
+ includeChrome: true,
+ allFrames: true,
+ },
+
+ UnselectedTabHover: {
+ parent: {
+ esModuleURI: "resource://gre/actors/UnselectedTabHoverParent.sys.mjs",
+ },
+ child: {
+ esModuleURI: "resource://gre/actors/UnselectedTabHoverChild.sys.mjs",
+ events: {
+ "UnselectedTabHover:Enable": {},
+ "UnselectedTabHover:Disable": {},
+ },
+ },
+
+ allFrames: true,
+ },
+};
+
+/**
+ * Note that turning on page data collection for snapshots currently disables
+ * collection of generic page info for normal history entries. See bug 1740234.
+ */
+if (!Services.prefs.getBoolPref("browser.pagedata.enabled", false)) {
+ JSWINDOWACTORS.ContentMeta = {
+ parent: {
+ esModuleURI: "resource://gre/actors/ContentMetaParent.sys.mjs",
+ },
+
+ child: {
+ esModuleURI: "resource://gre/actors/ContentMetaChild.sys.mjs",
+ events: {
+ DOMContentLoaded: {},
+ DOMMetaAdded: { createActor: false },
+ },
+ },
+
+ messageManagerGroups: ["browsers"],
+ };
+}
+
+if (AppConstants.platform != "android") {
+ // For GeckoView support see bug 1776829.
+ JSWINDOWACTORS.ClipboardReadPaste = {
+ parent: {
+ esModuleURI: "resource://gre/actors/ClipboardReadPasteParent.sys.mjs",
+ },
+
+ child: {
+ esModuleURI: "resource://gre/actors/ClipboardReadPasteChild.sys.mjs",
+ events: {
+ MozClipboardReadPaste: {},
+ },
+ },
+
+ allFrames: true,
+ };
+
+ // Note that GeckoView has another implementation in mobile/android/actors.
+ JSWINDOWACTORS.Select = {
+ parent: {
+ esModuleURI: "resource://gre/actors/SelectParent.sys.mjs",
+ },
+
+ child: {
+ esModuleURI: "resource://gre/actors/SelectChild.sys.mjs",
+ events: {
+ mozshowdropdown: {},
+ "mozshowdropdown-sourcetouch": {},
+ mozhidedropdown: { mozSystemGroup: true },
+ },
+ },
+
+ includeChrome: true,
+ allFrames: true,
+ };
+
+ // Note that GeckoView handles MozOpenDateTimePicker in GeckoViewPrompt.
+ JSWINDOWACTORS.DateTimePicker = {
+ parent: {
+ esModuleURI: "resource://gre/actors/DateTimePickerParent.sys.mjs",
+ },
+
+ child: {
+ esModuleURI: "resource://gre/actors/DateTimePickerChild.sys.mjs",
+ events: {
+ MozOpenDateTimePicker: {},
+ MozUpdateDateTimePicker: {},
+ MozCloseDateTimePicker: {},
+ },
+ },
+
+ includeChrome: true,
+ allFrames: true,
+ };
+}
+
+export var ActorManagerParent = {
+ _addActors(actors, kind) {
+ let register, unregister;
+ switch (kind) {
+ case "JSProcessActor":
+ register = ChromeUtils.registerProcessActor;
+ unregister = ChromeUtils.unregisterProcessActor;
+ break;
+ case "JSWindowActor":
+ register = ChromeUtils.registerWindowActor;
+ unregister = ChromeUtils.unregisterWindowActor;
+ break;
+ default:
+ throw new Error("Invalid JSActor kind " + kind);
+ }
+ for (let [actorName, actor] of Object.entries(actors)) {
+ // If enablePreference is set, only register the actor while the
+ // preference is set to true.
+ if (actor.enablePreference) {
+ let actorNameProp = actorName + "_Preference";
+ XPCOMUtils.defineLazyPreferenceGetter(
+ this,
+ actorNameProp,
+ actor.enablePreference,
+ false,
+ (prefName, prevValue, isEnabled) => {
+ if (isEnabled) {
+ register(actorName, actor);
+ } else {
+ unregister(actorName, actor);
+ }
+ if (actor.onPreferenceChanged) {
+ actor.onPreferenceChanged(prefName, prevValue, isEnabled);
+ }
+ }
+ );
+ if (!this[actorNameProp]) {
+ continue;
+ }
+ }
+
+ register(actorName, actor);
+ }
+ },
+
+ addJSProcessActors(actors) {
+ this._addActors(actors, "JSProcessActor");
+ },
+ addJSWindowActors(actors) {
+ this._addActors(actors, "JSWindowActor");
+ },
+};
+
+ActorManagerParent.addJSProcessActors(JSPROCESSACTORS);
+ActorManagerParent.addJSWindowActors(JSWINDOWACTORS);