Skip to content

Commit 4afdd64

Browse files
authored
chore(browserType): merge connectOverCDP and connectOverCDPTransport (microsoft#41014)
1 parent 1845d3f commit 4afdd64

13 files changed

Lines changed: 49 additions & 83 deletions

File tree

packages/isomorphic/protocolMetainfo.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ export const methodMetainfo = new Map<string, MethodMetainfo>([
115115
['BrowserType.launch', { title: 'Launch browser', }],
116116
['BrowserType.launchPersistentContext', { title: 'Launch persistent context', }],
117117
['BrowserType.connectOverCDP', { title: 'Connect over CDP', }],
118-
['BrowserType.connectOverCDPTransport', { title: 'Connect over CDP transport', }],
119118
['BrowserType.connectToWorker', { title: 'Connect to worker', }],
120119
['Disposable.dispose', { internal: true, potentiallyClosesScope: true, }],
121120
['Electron.launch', { title: 'Launch electron', }],

packages/playwright-client/types/types.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15439,7 +15439,8 @@ export interface BrowserType<Unused = {}> {
1543915439
* `ws://127.0.0.1:9222/devtools/browser/387adf4c-243f-4051-a181-46798f4a46f4`.
1544015440
* @param options
1544115441
*/
15442-
connectOverCDP(transport: ConnectionTransport): Promise<Browser>;
15442+
connectOverCDP(transport: ConnectionTransport, options?: ConnectOverCDPOptions): Promise<Browser>;
15443+
1544315444
/**
1544415445
* This method attaches Playwright to an existing browser instance created via `BrowserType.launchServer` in Node.js.
1544515446
*

packages/playwright-core/src/client/browserType.ts

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -138,24 +138,33 @@ export class BrowserType extends ChannelOwner<channels.BrowserTypeChannel> imple
138138

139139
async connectOverCDP(options: api.ConnectOverCDPOptions & { wsEndpoint?: string }): Promise<api.Browser>;
140140
async connectOverCDP(endpointURL: string, options?: api.ConnectOverCDPOptions): Promise<api.Browser>;
141-
async connectOverCDP(transport: api.ConnectionTransport): Promise<api.Browser>;
142-
async connectOverCDP(endpointURLOrOptions: (api.ConnectOverCDPOptions & { wsEndpoint?: string })|string|api.ConnectionTransport, options?: api.ConnectOverCDPOptions) {
143-
if (typeof endpointURLOrOptions === 'string')
144-
return await this._connectOverCDP(endpointURLOrOptions, options);
145-
if (isConnectionTransport(endpointURLOrOptions))
146-
return await this._connectOverCDPTransport(endpointURLOrOptions);
147-
const endpointURL = 'endpointURL' in endpointURLOrOptions ? endpointURLOrOptions.endpointURL : endpointURLOrOptions.wsEndpoint;
148-
assert(endpointURL, 'Cannot connect over CDP without wsEndpoint.');
149-
return await this._connectOverCDP(endpointURL, endpointURLOrOptions);
150-
}
151-
152-
async _connectOverCDP(endpointURL: string, params: api.ConnectOverCDPOptions = {}): Promise<Browser> {
153-
if (this.name() !== 'chromium' && this.name() !== 'webkit')
141+
async connectOverCDP(transport: api.ConnectionTransport, options?: api.ConnectOverCDPOptions): Promise<api.Browser>;
142+
async connectOverCDP(overloaded: (api.ConnectOverCDPOptions & { wsEndpoint?: string }) | string | api.ConnectionTransport, options?: api.ConnectOverCDPOptions): Promise<Browser> {
143+
let endpointURL: string | undefined;
144+
let transport: api.ConnectionTransport | undefined;
145+
let params: api.ConnectOverCDPOptions;
146+
if (typeof overloaded === 'string') {
147+
endpointURL = overloaded;
148+
params = options ?? {};
149+
} else if (isConnectionTransport(overloaded)) {
150+
if (this.name() !== 'chromium' && this.name() !== 'webkit')
151+
throw new Error('Connecting over CDP is only supported in Chromium and WebKit.');
152+
if (this._connection.isRemote())
153+
throw new Error('Passing a ConnectionTransport to connectOverCDP is not supported when connecting remotely.');
154+
transport = overloaded;
155+
params = options ?? {};
156+
} else {
157+
endpointURL = 'endpointURL' in overloaded ? (overloaded as any).endpointURL : overloaded.wsEndpoint;
158+
assert(endpointURL, 'Cannot connect over CDP without wsEndpoint.');
159+
params = overloaded;
160+
}
161+
if (endpointURL && this.name() !== 'chromium' && this.name() !== 'webkit')
154162
throw new Error('Connecting over CDP is only supported in Chromium and WebKit.');
155-
const headers = params.headers ? headersObjectToArray(params.headers) : undefined;
163+
156164
const result = await this._channel.connectOverCDP({
157165
endpointURL,
158-
headers,
166+
transport: transport as any,
167+
headers: params.headers ? headersObjectToArray(params.headers) : undefined,
159168
slowMo: params.slowMo,
160169
timeout: new TimeoutSettings(this._platform).timeout(params),
161170
isLocal: params.isLocal,
@@ -165,15 +174,6 @@ export class BrowserType extends ChannelOwner<channels.BrowserTypeChannel> imple
165174
return await this._browserFromConnectResult(result);
166175
}
167176

168-
async _connectOverCDPTransport(transport: api.ConnectionTransport): Promise<Browser> {
169-
if (this.name() !== 'chromium')
170-
throw new Error('Connecting over CDP is only supported in Chromium.');
171-
if (this._connection.isRemote())
172-
throw new Error('Passing a ConnectionTransport to connectOverCDP is not supported when connecting remotely.');
173-
const result = await this._channel.connectOverCDPTransport({ transport: transport as any });
174-
return await this._browserFromConnectResult(result);
175-
}
176-
177177
private async _browserFromConnectResult(result: { browser: channels.BrowserChannel, defaultContext?: channels.BrowserContextChannel }): Promise<Browser> {
178178
const browser = Browser.from(result.browser);
179179
browser._connectToBrowserType(this, {}, undefined);

packages/playwright-core/src/protocol/validator.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,25 +1087,19 @@ scheme.BrowserTypeLaunchPersistentContextResult = tObject({
10871087
context: tChannel(['BrowserContext']),
10881088
});
10891089
scheme.BrowserTypeConnectOverCDPParams = tObject({
1090-
endpointURL: tString,
1090+
endpointURL: tOptional(tString),
10911091
headers: tOptional(tArray(tType('NameValue'))),
10921092
slowMo: tOptional(tFloat),
10931093
timeout: tFloat,
10941094
isLocal: tOptional(tBoolean),
10951095
noDefaults: tOptional(tBoolean),
10961096
artifactsDir: tOptional(tString),
1097+
transport: tOptional(tBinary),
10971098
});
10981099
scheme.BrowserTypeConnectOverCDPResult = tObject({
10991100
browser: tChannel(['Browser']),
11001101
defaultContext: tOptional(tChannel(['BrowserContext'])),
11011102
});
1102-
scheme.BrowserTypeConnectOverCDPTransportParams = tObject({
1103-
transport: tBinary,
1104-
});
1105-
scheme.BrowserTypeConnectOverCDPTransportResult = tObject({
1106-
browser: tChannel(['Browser']),
1107-
defaultContext: tOptional(tChannel(['BrowserContext'])),
1108-
});
11091103
scheme.BrowserTypeConnectToWorkerParams = tObject({
11101104
endpoint: tString,
11111105
timeout: tFloat,

packages/playwright-core/src/server/browserType.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -286,11 +286,7 @@ export abstract class BrowserType extends SdkObject {
286286
}
287287
}
288288

289-
async connectOverCDP(progress: Progress, endpointURL: string, options: { slowMo?: number, timeout?: number, headers?: types.HeadersArray, isLocal?: boolean, noDefaults?: boolean, artifactsDir?: string }): Promise<Browser> {
290-
throw new Error('CDP connections are only supported by Chromium');
291-
}
292-
293-
async connectOverCDPTransport(progress: Progress, transport: ConnectionTransport): Promise<Browser> {
289+
async connectOverCDP(progress: Progress, params: channels.BrowserTypeConnectOverCDPParams): Promise<Browser> {
294290
throw new Error('CDP connections are only supported by Chromium');
295291
}
296292

packages/playwright-core/src/server/chromium/chromium.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,10 @@ export class Chromium extends BrowserType {
8181
return super.launchPersistentContext(progress, userDataDir, options);
8282
}
8383

84-
override async connectOverCDP(progress: Progress, endpointURL: string, options: { slowMo?: number, headers?: types.HeadersArray, isLocal?: boolean, noDefaults?: boolean, artifactsDir?: string }) {
85-
return await this._connectOverCDPInternal(progress, endpointURL, options);
84+
override async connectOverCDP(progress: Progress, params: channels.BrowserTypeConnectOverCDPParams) {
85+
if (params.transport)
86+
return this._connectOverCDPImpl(progress, params.transport as any, async () => (params.transport as any).close(), { ...params, isLocal: true });
87+
return await this._connectOverCDPInternal(progress, params.endpointURL!, params);
8688
}
8789

8890
async _connectOverCDPInternal(progress: Progress, endpointURL: string, options: types.LaunchOptions & { headers?: types.HeadersArray, isLocal?: boolean, noDefaults?: boolean, artifactsDir?: string }, onClose?: () => Promise<void>) {
@@ -166,11 +168,6 @@ export class Chromium extends BrowserType {
166168
}
167169
}
168170

169-
override async connectOverCDPTransport(progress: Progress, transport: ConnectionTransport) {
170-
const closeAndWait = async () => transport.close();
171-
return this._connectOverCDPImpl(progress, transport, closeAndWait, { isLocal: true });
172-
}
173-
174171
override async connectToWorker(progress: Progress, endpoint: string) {
175172
const wsEndpoint = await urlToWSEndpoint(progress, endpoint, {});
176173
const transport = await WebSocketTransport.connect(progress, wsEndpoint);

packages/playwright-core/src/server/dispatchers/browserTypeDispatcher.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,23 +57,14 @@ export class BrowserTypeDispatcher extends Dispatcher<BrowserType, channels.Brow
5757
if (this._denyLaunch)
5858
throw new Error(`Launching more browsers is not allowed.`);
5959

60-
const browser = await this._object.connectOverCDP(progress, params.endpointURL, params);
60+
const browser = await this._object.connectOverCDP(progress, params);
6161
const browserDispatcher = new BrowserDispatcher(this, browser);
6262
return {
6363
browser: browserDispatcher,
6464
defaultContext: browser._defaultContext ? BrowserContextDispatcher.from(browserDispatcher, browser._defaultContext) : undefined,
6565
};
6666
}
6767

68-
async connectOverCDPTransport(params: channels.BrowserTypeConnectOverCDPTransportParams, progress: Progress): Promise<channels.BrowserTypeConnectOverCDPTransportResult> {
69-
if (this._denyLaunch)
70-
throw new Error(`Launching more browsers is not allowed.`);
71-
72-
const browser = await this._object.connectOverCDPTransport(progress, params.transport as any);
73-
const browserDispatcher = new BrowserDispatcher(this, browser);
74-
return { browser: browserDispatcher, defaultContext: browser._defaultContext ? BrowserContextDispatcher.from(browserDispatcher, browser._defaultContext) : undefined };
75-
}
76-
7768
async connectToWorker(params: channels.BrowserTypeConnectToWorkerParams, progress: Progress): Promise<channels.BrowserTypeConnectToWorkerResult> {
7869
if (this._denyLaunch)
7970
throw new Error(`Launching more browsers is not allowed.`);

packages/playwright-core/src/server/webkit/webkit.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import type { SdkObject } from '../instrumentation';
3030
import type { Progress } from '../progress';
3131
import type { ConnectionTransport } from '../transport';
3232
import type * as types from '../types';
33+
import type * as channels from '@protocol/channels';
3334

3435
export class WebKit extends BrowserType {
3536
constructor(parent: SdkObject) {
@@ -40,8 +41,8 @@ export class WebKit extends BrowserType {
4041
return WKBrowser.connect(this.attribution.playwright, transport, options);
4142
}
4243

43-
override async connectOverCDP(progress: Progress, endpointURL: string, options: { slowMo?: number, headers?: types.HeadersArray, isLocal?: boolean, noDefaults?: boolean }): Promise<Browser> {
44-
return connectOverRDP(progress, this, endpointURL, options);
44+
override async connectOverCDP(progress: Progress, params: channels.BrowserTypeConnectOverCDPParams): Promise<Browser> {
45+
return connectOverRDP(progress, this, params.endpointURL!, params);
4546
}
4647

4748
override amendEnvironment(env: NodeJS.ProcessEnv, userDataDir: string, isPersistent: boolean, options: types.LaunchOptions): NodeJS.ProcessEnv {

packages/playwright-core/types/types.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15439,7 +15439,8 @@ export interface BrowserType<Unused = {}> {
1543915439
* `ws://127.0.0.1:9222/devtools/browser/387adf4c-243f-4051-a181-46798f4a46f4`.
1544015440
* @param options
1544115441
*/
15442-
connectOverCDP(transport: ConnectionTransport): Promise<Browser>;
15442+
connectOverCDP(transport: ConnectionTransport, options?: ConnectOverCDPOptions): Promise<Browser>;
15443+
1544315444
/**
1544415445
* This method attaches Playwright to an existing browser instance created via `BrowserType.launchServer` in Node.js.
1544515446
*

packages/protocol/spec/browserType.yml

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ BrowserType:
4343
connectOverCDP:
4444
title: Connect over CDP
4545
parameters:
46-
endpointURL: string
46+
endpointURL: string?
4747
headers:
4848
type: array?
4949
items: NameValue
@@ -52,14 +52,7 @@ BrowserType:
5252
isLocal: boolean?
5353
noDefaults: boolean?
5454
artifactsDir: string?
55-
returns:
56-
browser: Browser
57-
defaultContext: BrowserContext?
58-
59-
connectOverCDPTransport:
60-
title: Connect over CDP transport
61-
parameters:
62-
transport: binary
55+
transport: binary?
6356
returns:
6457
browser: Browser
6558
defaultContext: BrowserContext?

0 commit comments

Comments
 (0)