diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
commit | 2aa4a82499d4becd2284cdb482213d541b8804dd (patch) | |
tree | b80bf8bf13c3766139fbacc530efd0dd9d54394c /devtools/server/connectors/content-process-connector.js | |
parent | Initial commit. (diff) | |
download | firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip |
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'devtools/server/connectors/content-process-connector.js')
-rw-r--r-- | devtools/server/connectors/content-process-connector.js | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/devtools/server/connectors/content-process-connector.js b/devtools/server/connectors/content-process-connector.js new file mode 100644 index 0000000000..7c5c0de0e1 --- /dev/null +++ b/devtools/server/connectors/content-process-connector.js @@ -0,0 +1,118 @@ +/* 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/. */ + +"use strict"; + +var Services = require("Services"); +var DevToolsUtils = require("devtools/shared/DevToolsUtils"); +var { dumpn } = DevToolsUtils; + +loader.lazyRequireGetter( + this, + "ChildDebuggerTransport", + "devtools/shared/transport/child-transport", + true +); + +const CONTENT_PROCESS_SERVER_STARTUP_SCRIPT = + "resource://devtools/server/startup/content-process.js"; + +loader.lazyRequireGetter(this, "EventEmitter", "devtools/shared/event-emitter"); + +/** + * Start a DevTools server in a content process (representing the entire process, not + * just a single frame) and add it as a child server for an active connection. + */ +function connectToContentProcess(connection, mm, onDestroy) { + return new Promise(resolve => { + const prefix = connection.allocID("content-process"); + let actor, childTransport; + + mm.addMessageListener("debug:content-process-actor", function listener( + msg + ) { + // Ignore actors being created by a Watcher actor, + // they will be handled by devtools/server/watcher/target-helpers/process.js + if (msg.watcherActorID) { + return; + } + mm.removeMessageListener("debug:content-process-actor", listener); + + // Pipe Debugger message from/to parent/child via the message manager + childTransport = new ChildDebuggerTransport(mm, prefix); + childTransport.hooks = { + onPacket: connection.send.bind(connection), + }; + childTransport.ready(); + + connection.setForwarding(prefix, childTransport); + + dumpn(`Start forwarding for process with prefix ${prefix}`); + + actor = msg.json.actor; + + resolve(actor); + }); + + // Load the content process server startup script only once. + const isContentProcessServerStartupScripLoaded = Services.ppmm + .getDelayedProcessScripts() + .some(([uri]) => uri === CONTENT_PROCESS_SERVER_STARTUP_SCRIPT); + if (!isContentProcessServerStartupScripLoaded) { + // Load the process script that will receive the debug:init-content-server message + Services.ppmm.loadProcessScript( + CONTENT_PROCESS_SERVER_STARTUP_SCRIPT, + true + ); + } + + // Send a message to the content process server startup script to forward it the + // prefix. + mm.sendAsyncMessage("debug:init-content-server", { + prefix: prefix, + }); + + function onClose() { + Services.obs.removeObserver( + onMessageManagerClose, + "message-manager-close" + ); + EventEmitter.off(connection, "closed", onClose); + if (childTransport) { + // If we have a child transport, the actor has already + // been created. We need to stop using this message manager. + childTransport.close(); + childTransport = null; + connection.cancelForwarding(prefix); + + // ... and notify the child process to clean the target-scoped actors. + try { + mm.sendAsyncMessage("debug:content-process-disconnect", { prefix }); + } catch (e) { + // Nothing to do + } + } + + if (onDestroy) { + onDestroy(mm); + } + } + + const onMessageManagerClose = DevToolsUtils.makeInfallible( + (subject, topic, data) => { + if (subject == mm) { + // Send the "tabDetached" event before closing the connection which + // will destroy fronts on the client. + connection.send({ from: actor.actor, type: "tabDetached" }); + onClose(); + } + } + ); + Services.obs.addObserver(onMessageManagerClose, "message-manager-close"); + + EventEmitter.on(connection, "closed", onClose); + }); +} + +exports.connectToContentProcess = connectToContentProcess; |