diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /toolkit/actors/WebChannelParent.jsm | |
parent | Initial commit. (diff) | |
download | firefox-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.jsm | 96 |
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); + } +} |