summaryrefslogtreecommitdiffstats
path: root/remote/shared/js-window-actors/NavigationListenerActor.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--remote/shared/js-window-actors/NavigationListenerActor.sys.mjs80
1 files changed, 80 insertions, 0 deletions
diff --git a/remote/shared/js-window-actors/NavigationListenerActor.sys.mjs b/remote/shared/js-window-actors/NavigationListenerActor.sys.mjs
new file mode 100644
index 0000000000..13335177c6
--- /dev/null
+++ b/remote/shared/js-window-actors/NavigationListenerActor.sys.mjs
@@ -0,0 +1,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/. */
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ Log: "chrome://remote/content/shared/Log.sys.mjs",
+ TabManager: "chrome://remote/content/shared/TabManager.sys.mjs",
+});
+
+ChromeUtils.defineLazyGetter(lazy, "logger", () => lazy.Log.get());
+
+let registered = false;
+export function isNavigationListenerActorRegistered() {
+ return registered;
+}
+
+/**
+ * Register the NavigationListener actor that will keep track of all ongoing
+ * navigations.
+ */
+export function registerNavigationListenerActor() {
+ if (registered) {
+ return;
+ }
+
+ try {
+ ChromeUtils.registerWindowActor("NavigationListener", {
+ kind: "JSWindowActor",
+ parent: {
+ esModuleURI:
+ "chrome://remote/content/shared/js-window-actors/NavigationListenerParent.sys.mjs",
+ },
+ child: {
+ esModuleURI:
+ "chrome://remote/content/shared/js-window-actors/NavigationListenerChild.sys.mjs",
+ events: {
+ DOMWindowCreated: {},
+ },
+ },
+ allFrames: true,
+ messageManagerGroups: ["browsers"],
+ });
+ registered = true;
+
+ // Ensure the navigation listener is started in existing contexts.
+ for (const browser of lazy.TabManager.browsers) {
+ if (!browser?.browsingContext) {
+ continue;
+ }
+
+ for (const context of browser.browsingContext.getAllBrowsingContextsInSubtree()) {
+ if (!context.currentWindowGlobal) {
+ continue;
+ }
+
+ context.currentWindowGlobal
+ .getActor("NavigationListener")
+ // Note that "createActor" is not explicitly referenced in the child
+ // actor, this is only used to trigger the creation of the actor.
+ .sendAsyncMessage("createActor");
+ }
+ }
+ } catch (e) {
+ if (e.name === "NotSupportedError") {
+ lazy.logger.warn(`NavigationListener actor is already registered!`);
+ } else {
+ throw e;
+ }
+ }
+}
+
+export function unregisterNavigationListenerActor() {
+ if (!registered) {
+ return;
+ }
+ ChromeUtils.unregisterWindowActor("NavigationListener");
+ registered = false;
+}