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 /remote/sessions/ContentProcessSession.jsm | |
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 'remote/sessions/ContentProcessSession.jsm')
-rw-r--r-- | remote/sessions/ContentProcessSession.jsm | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/remote/sessions/ContentProcessSession.jsm b/remote/sessions/ContentProcessSession.jsm new file mode 100644 index 0000000000..1aaa822001 --- /dev/null +++ b/remote/sessions/ContentProcessSession.jsm @@ -0,0 +1,111 @@ +/* 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 EXPORTED_SYMBOLS = ["ContentProcessSession"]; + +const { ContentProcessDomains } = ChromeUtils.import( + "chrome://remote/content/domains/ContentProcessDomains.jsm" +); +const { DomainCache } = ChromeUtils.import( + "chrome://remote/content/domains/DomainCache.jsm" +); + +ChromeUtils.defineModuleGetter( + this, + "ContextObserver", + "chrome://remote/content/observers/ContextObserver.jsm" +); + +class ContentProcessSession { + constructor(messageManager, browsingContext, content, docShell) { + this.messageManager = messageManager; + this.browsingContext = browsingContext; + this.content = content; + this.docShell = docShell; + // Most children or sibling classes are going to assume that docShell + // implements the following interface. So do the QI only once from here. + this.docShell.QueryInterface(Ci.nsIWebNavigation); + + this.domains = new DomainCache(this, ContentProcessDomains); + this.messageManager.addMessageListener("remote:request", this); + this.messageManager.addMessageListener("remote:destroy", this); + } + + destructor() { + this._contextObserver?.destructor(); + + this.messageManager.removeMessageListener("remote:request", this); + this.messageManager.removeMessageListener("remote:destroy", this); + this.domains.clear(); + } + + get contextObserver() { + if (!this._contextObserver) { + this._contextObserver = new ContextObserver( + this.docShell.chromeEventHandler + ); + } + return this._contextObserver; + } + + // Domain event listener + + onEvent(eventName, params) { + this.messageManager.sendAsyncMessage("remote:event", { + browsingContextId: this.browsingContext.id, + event: { + eventName, + params, + }, + }); + } + + // nsIMessageListener + + async receiveMessage({ name, data }) { + const { browsingContextId } = data; + + // We may have more than one tab loaded in the same process, + // and debug the two at the same time. We want to ensure not + // mixing up the requests made against two such tabs. + // Each tab is going to have its own frame script instance + // and two communication channels are going to be set up via + // the two message managers. + if (browsingContextId != this.browsingContext.id) { + return; + } + + switch (name) { + case "remote:request": + try { + const { id, domain, command, params } = data.request; + + const result = await this.domains.execute(domain, command, params); + + this.messageManager.sendAsyncMessage("remote:result", { + browsingContextId, + id, + result, + }); + } catch (e) { + this.messageManager.sendAsyncMessage("remote:error", { + browsingContextId, + id: data.request.id, + error: { + name: e.name || "exception", + message: e.message || String(e), + stack: e.stack, + }, + }); + } + break; + + case "remote:destroy": + this.destructor(); + break; + } + } +} |