Source code

Revision control

Copy as Markdown

Other Tools

/* 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, {
DomainCache: "chrome://remote/content/cdp/domains/DomainCache.sys.mjs",
NetworkObserver:
"chrome://remote/content/cdp/observers/NetworkObserver.sys.mjs",
ParentProcessDomains:
"chrome://remote/content/cdp/domains/ParentProcessDomains.sys.mjs",
});
/**
* A session represents exactly one client WebSocket connection.
*
* Every new WebSocket connections is associated with one session that
* deals with dispatching incoming command requests to the right
* target, sending back responses, and propagating events originating
* from domains.
* Then, some subsequent Sessions may be created over a single WebSocket
* connection. In this case, the subsequent session will have an `id`
* being passed to their constructor and each packet of these sessions
* will have a `sessionId` attribute in order to filter the packets
* by session both on client and server side.
*/
export class Session {
/**
* @param {Connection} connection
* The connection used to communicate with the server.
* @param {Target} target
* The target to which this session communicates with.
* @param {number=} id
* If this session isn't the default one used for the HTTP endpoint we
* connected to, the session requires an id to distinguish it from the default
* one. This id is used to filter our request, responses and events between
* all active sessions. For now, this is only passed by `Target.attachToTarget()`.
*/
constructor(connection, target, id) {
this.connection = connection;
this.target = target;
this.id = id;
this.domains = new lazy.DomainCache(this, lazy.ParentProcessDomains);
}
destructor() {
if (
this.networkObserver &&
this.networkObserver.isActive(this.target.browser)
) {
this.networkObserver.dispose();
}
this.domains.clear();
}
execute(id, domain, command, params) {
return this.domains.execute(domain, command, params);
}
get networkObserver() {
if (!this._networkObserver) {
this._networkObserver = new lazy.NetworkObserver();
}
return this._networkObserver;
}
/**
* Domains event listener. Called when an event is fired
* by any Domain and has to be sent to the client.
*/
onEvent(eventName, params) {
this.connection.sendEvent(eventName, params, this.id);
}
toString() {
return `[object ${this.constructor.name} ${this.connection.id}]`;
}
}