summaryrefslogtreecommitdiffstats
path: root/toolkit/actors/WebChannelParent.jsm
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
commit43a97878ce14b72f0981164f87f2e35e14151312 (patch)
tree620249daf56c0258faa40cbdcf9cfba06de2a846 /toolkit/actors/WebChannelParent.jsm
parentInitial commit. (diff)
downloadfirefox-upstream.tar.xz
firefox-upstream.zip
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'toolkit/actors/WebChannelParent.jsm')
-rw-r--r--toolkit/actors/WebChannelParent.jsm96
1 files changed, 96 insertions, 0 deletions
diff --git a/toolkit/actors/WebChannelParent.jsm b/toolkit/actors/WebChannelParent.jsm
new file mode 100644
index 0000000000..ee62c04c90
--- /dev/null
+++ b/toolkit/actors/WebChannelParent.jsm
@@ -0,0 +1,96 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* 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/. */
+
+var EXPORTED_SYMBOLS = ["WebChannelParent"];
+
+const { WebChannelBroker } = ChromeUtils.importESModule(
+ "resource://gre/modules/WebChannel.sys.mjs"
+);
+
+const ERRNO_MISSING_PRINCIPAL = 1;
+const ERRNO_NO_SUCH_CHANNEL = 2;
+
+class WebChannelParent extends JSWindowActorParent {
+ receiveMessage(msg) {
+ let data = msg.data.contentData;
+ let sendingContext = {
+ browsingContext: this.browsingContext,
+ browser: this.browsingContext.top.embedderElement,
+ eventTarget: msg.data.eventTarget,
+ principal: msg.data.principal,
+ };
+ // data must be a string except for a few legacy origins allowed by browser-content.js.
+ if (typeof data == "string") {
+ try {
+ data = JSON.parse(data);
+ } catch (e) {
+ Cu.reportError("Failed to parse WebChannel data as a JSON object");
+ return;
+ }
+ }
+
+ if (data && data.id) {
+ if (!msg.data.principal) {
+ this._sendErrorEventToContent(
+ data.id,
+ sendingContext,
+ ERRNO_MISSING_PRINCIPAL,
+ "Message principal missing"
+ );
+ } else {
+ let validChannelFound = WebChannelBroker.tryToDeliver(
+ data,
+ sendingContext
+ );
+
+ // if no valid origins send an event that there is no such valid channel
+ if (!validChannelFound) {
+ this._sendErrorEventToContent(
+ data.id,
+ sendingContext,
+ ERRNO_NO_SUCH_CHANNEL,
+ "No Such Channel"
+ );
+ }
+ }
+ } else {
+ Cu.reportError("WebChannel channel id missing");
+ }
+ }
+
+ /**
+ *
+ * @param id {String}
+ * The WebChannel id to include in the message
+ * @param sendingContext {Object}
+ * Message sending context
+ * @param [errorMsg] {String}
+ * Error message
+ * @private
+ */
+ _sendErrorEventToContent(id, sendingContext, errorNo, errorMsg) {
+ let { eventTarget, principal } = sendingContext;
+
+ errorMsg = errorMsg || "Web Channel Parent error";
+
+ let { currentWindowGlobal = null } = this.browsingContext;
+ if (currentWindowGlobal) {
+ currentWindowGlobal
+ .getActor("WebChannel")
+ .sendAsyncMessage("WebChannelMessageToContent", {
+ id,
+ message: {
+ errno: errorNo,
+ error: errorMsg,
+ },
+ eventTarget,
+ principal,
+ });
+ } else {
+ Cu.reportError("Failed to send a WebChannel error. Target invalid.");
+ }
+ Cu.reportError(id.toString() + " error message. " + errorMsg);
+ }
+}