summaryrefslogtreecommitdiffstats
path: root/remote/test/puppeteer/packages/puppeteer-core/src/cdp/WebWorker.ts
diff options
context:
space:
mode:
Diffstat (limited to 'remote/test/puppeteer/packages/puppeteer-core/src/cdp/WebWorker.ts')
-rw-r--r--remote/test/puppeteer/packages/puppeteer-core/src/cdp/WebWorker.ts31
1 files changed, 29 insertions, 2 deletions
diff --git a/remote/test/puppeteer/packages/puppeteer-core/src/cdp/WebWorker.ts b/remote/test/puppeteer/packages/puppeteer-core/src/cdp/WebWorker.ts
index 552e8a6cf5..ed2407ba66 100644
--- a/remote/test/puppeteer/packages/puppeteer-core/src/cdp/WebWorker.ts
+++ b/remote/test/puppeteer/packages/puppeteer-core/src/cdp/WebWorker.ts
@@ -7,8 +7,8 @@ import type {Protocol} from 'devtools-protocol';
import type {CDPSession} from '../api/CDPSession.js';
import type {Realm} from '../api/Realm.js';
+import {TargetType} from '../api/Target.js';
import {WebWorker} from '../api/WebWorker.js';
-import type {ConsoleMessageType} from '../common/ConsoleMessage.js';
import {TimeoutSettings} from '../common/TimeoutSettings.js';
import {debugError} from '../common/util.js';
@@ -20,7 +20,7 @@ import {CdpJSHandle} from './JSHandle.js';
* @internal
*/
export type ConsoleAPICalledCallback = (
- eventType: ConsoleMessageType,
+ eventType: string,
handles: CdpJSHandle[],
trace?: Protocol.Runtime.StackTrace
) => void;
@@ -38,15 +38,21 @@ export type ExceptionThrownCallback = (
export class CdpWebWorker extends WebWorker {
#world: IsolatedWorld;
#client: CDPSession;
+ readonly #id: string;
+ readonly #targetType: TargetType;
constructor(
client: CDPSession,
url: string,
+ targetId: string,
+ targetType: TargetType,
consoleAPICalled: ConsoleAPICalledCallback,
exceptionThrown: ExceptionThrownCallback
) {
super(url);
+ this.#id = targetId;
this.#client = client;
+ this.#targetType = targetType;
this.#world = new IsolatedWorld(this, new TimeoutSettings());
this.#client.once('Runtime.executionContextCreated', async event => {
@@ -80,4 +86,25 @@ export class CdpWebWorker extends WebWorker {
get client(): CDPSession {
return this.#client;
}
+
+ override async close(): Promise<void> {
+ switch (this.#targetType) {
+ case TargetType.SERVICE_WORKER:
+ case TargetType.SHARED_WORKER: {
+ // For service and shared workers we need to close the target and detach to allow
+ // the worker to stop.
+ await this.client.connection()?.send('Target.closeTarget', {
+ targetId: this.#id,
+ });
+ await this.client.connection()?.send('Target.detachFromTarget', {
+ sessionId: this.client.id(),
+ });
+ break;
+ }
+ default:
+ await this.evaluate(() => {
+ self.close();
+ });
+ }
+ }
}