mirror of
https://github.com/microsoft/playwright.git
synced 2024-12-15 14:11:50 +03:00
4ab66a4fe5
This patch: - moves `SimpleChannel` to synchronously dispatch buffered commands instead of a `await Promise.resolve()` hack - moves dialog & screencast handling from `PageHandler` to `TargetManager`. This leaves `PageHandler` to be concerned solely about protocol. - removes `attach` and `detach` methods for worker channels: since channels are buffering messages until the namespace registers, there's no chance to loose any events. - slightly simplifies `PageNetwork` class: it's lifetime is now identical to the lifetime of the associated `PageTarget`, so a lot can be simplified later on. References #3995
77 lines
2.6 KiB
JavaScript
77 lines
2.6 KiB
JavaScript
/* 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";
|
|
loadSubScript('chrome://juggler/content/content/Runtime.js');
|
|
loadSubScript('chrome://juggler/content/SimpleChannel.js');
|
|
|
|
const channel = new SimpleChannel('worker::worker');
|
|
const eventListener = event => channel._onMessage(JSON.parse(event.data));
|
|
this.addEventListener('message', eventListener);
|
|
channel.transport = {
|
|
sendMessage: msg => postMessage(JSON.stringify(msg)),
|
|
dispose: () => this.removeEventListener('message', eventListener),
|
|
};
|
|
|
|
const runtime = new Runtime(true /* isWorker */);
|
|
|
|
(() => {
|
|
// Create execution context in the runtime only when the script
|
|
// source was actually evaluated in it.
|
|
const dbg = new Debugger(global);
|
|
if (dbg.findScripts({global}).length) {
|
|
runtime.createExecutionContext(null /* domWindow */, global, {});
|
|
} else {
|
|
dbg.onNewScript = function(s) {
|
|
dbg.onNewScript = undefined;
|
|
dbg.removeAllDebuggees();
|
|
runtime.createExecutionContext(null /* domWindow */, global, {});
|
|
};
|
|
}
|
|
})();
|
|
|
|
class RuntimeAgent {
|
|
constructor(runtime, channel) {
|
|
this._runtime = runtime;
|
|
this._browserRuntime = channel.connect('runtime');
|
|
|
|
for (const context of this._runtime.executionContexts())
|
|
this._onExecutionContextCreated(context);
|
|
|
|
this._eventListeners = [
|
|
this._runtime.events.onConsoleMessage(msg => this._browserRuntime.emit('runtimeConsole', msg)),
|
|
this._runtime.events.onExecutionContextCreated(this._onExecutionContextCreated.bind(this)),
|
|
this._runtime.events.onExecutionContextDestroyed(this._onExecutionContextDestroyed.bind(this)),
|
|
channel.register('runtime', {
|
|
evaluate: this._runtime.evaluate.bind(this._runtime),
|
|
callFunction: this._runtime.callFunction.bind(this._runtime),
|
|
getObjectProperties: this._runtime.getObjectProperties.bind(this._runtime),
|
|
disposeObject: this._runtime.disposeObject.bind(this._runtime),
|
|
}),
|
|
];
|
|
}
|
|
|
|
_onExecutionContextCreated(executionContext) {
|
|
this._browserRuntime.emit('runtimeExecutionContextCreated', {
|
|
executionContextId: executionContext.id(),
|
|
auxData: executionContext.auxData(),
|
|
});
|
|
}
|
|
|
|
_onExecutionContextDestroyed(executionContext) {
|
|
this._browserRuntime.emit('runtimeExecutionContextDestroyed', {
|
|
executionContextId: executionContext.id(),
|
|
});
|
|
}
|
|
|
|
dispose() {
|
|
for (const disposer of this._eventListeners)
|
|
disposer();
|
|
this._eventListeners = [];
|
|
}
|
|
}
|
|
|
|
new RuntimeAgent(runtime, channel);
|
|
|