Skip to content

Commit b848bb0

Browse files
authored
fix: npx playwright open should include console api (#38721)
1 parent db0c954 commit b848bb0

File tree

8 files changed

+33
-6
lines changed

8 files changed

+33
-6
lines changed

packages/playwright-core/src/cli/program.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,7 @@ async function openPage(context: BrowserContext, url: string | undefined): Promi
552552

553553
async function open(options: Options, url: string | undefined) {
554554
const { context } = await launchContext(options, { headless: !!process.env.PWTEST_CLI_HEADLESS, executablePath: process.env.PWTEST_CLI_EXECUTABLE_PATH });
555+
await context._exposeConsoleApi();
555556
await openPage(context, url);
556557
}
557558

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,10 @@ export class BrowserContext extends ChannelOwner<channels.BrowserContextChannel>
542542
await this._channel.disableRecorder();
543543
}
544544

545+
async _exposeConsoleApi() {
546+
await this._channel.exposeConsoleApi();
547+
}
548+
545549
_setAllowedProtocols(protocols: string[]) {
546550
this._allowedProtocols = protocols;
547551
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,6 +1112,8 @@ scheme.BrowserContextEnableRecorderParams = tObject({
11121112
scheme.BrowserContextEnableRecorderResult = tOptional(tObject({}));
11131113
scheme.BrowserContextDisableRecorderParams = tOptional(tObject({}));
11141114
scheme.BrowserContextDisableRecorderResult = tOptional(tObject({}));
1115+
scheme.BrowserContextExposeConsoleApiParams = tOptional(tObject({}));
1116+
scheme.BrowserContextExposeConsoleApiResult = tOptional(tObject({}));
11151117
scheme.BrowserContextNewCDPSessionParams = tObject({
11161118
page: tOptional(tChannel(['Page'])),
11171119
frame: tOptional(tChannel(['Frame'])),

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ export abstract class BrowserContext<EM extends EventMap = EventMap> extends Sdk
115115
_clientCertificatesProxy: ClientCertificatesProxy | undefined;
116116
private _playwrightBindingExposed?: Promise<void>;
117117
readonly dialogManager: DialogManager;
118+
private _consoleApiExposed = false;
118119

119120
constructor(browser: Browser, options: types.BrowserContextOptions, browserContextId: string | undefined) {
120121
super(browser, 'browser-context');
@@ -159,12 +160,9 @@ export abstract class BrowserContext<EM extends EventMap = EventMap> extends Sdk
159160
RecorderApp.showInspectorNoReply(this);
160161
});
161162

162-
if (debugMode() === 'console') {
163-
await this.extendInjectedScript(`
164-
function installConsoleApi(injectedScript) { injectedScript.consoleApi.install(); }
165-
module.exports = { default: () => installConsoleApi };
166-
`);
167-
}
163+
if (debugMode() === 'console')
164+
await this.exposeConsoleApi();
165+
168166
if (this._options.serviceWorkers === 'block')
169167
await this.addInitScript(undefined, `\nif (navigator.serviceWorker) navigator.serviceWorker.register = async () => { console.warn('Service Worker registration blocked by Playwright'); };\n`);
170168

@@ -176,6 +174,16 @@ export abstract class BrowserContext<EM extends EventMap = EventMap> extends Sdk
176174
return this._debugger;
177175
}
178176

177+
async exposeConsoleApi() {
178+
if (this._consoleApiExposed)
179+
return;
180+
this._consoleApiExposed = true;
181+
await this.extendInjectedScript(`
182+
function installConsoleApi(injectedScript) { injectedScript.consoleApi.install(); }
183+
module.exports = { default: () => installConsoleApi };
184+
`);
185+
}
186+
179187
async _ensureVideosPath() {
180188
if (this._options.recordVideo)
181189
await mkdirIfNeeded(path.join(this._options.recordVideo.dir, 'dummy'));

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,10 @@ export class BrowserContextDispatcher extends Dispatcher<BrowserContext, channel
349349
recorder.setMode('none');
350350
}
351351

352+
async exposeConsoleApi(params: channels.BrowserContextExposeConsoleApiParams, progress: Progress): Promise<void> {
353+
await this._context.exposeConsoleApi();
354+
}
355+
352356
async pause(params: channels.BrowserContextPauseParams, progress: Progress) {
353357
// Debugger will take care of this.
354358
}

packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ export const methodMetainfo = new Map<string, { internal?: boolean, title?: stri
8787
['BrowserContext.pause', { title: 'Pause', }],
8888
['BrowserContext.enableRecorder', { internal: true, }],
8989
['BrowserContext.disableRecorder', { internal: true, }],
90+
['BrowserContext.exposeConsoleApi', { internal: true, }],
9091
['BrowserContext.newCDPSession', { title: 'Create CDP session', group: 'configuration', }],
9192
['BrowserContext.harStart', { internal: true, }],
9293
['BrowserContext.harExport', { internal: true, }],

packages/protocol/src/channels.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1674,6 +1674,7 @@ export interface BrowserContextChannel extends BrowserContextEventTarget, EventT
16741674
pause(params?: BrowserContextPauseParams, progress?: Progress): Promise<BrowserContextPauseResult>;
16751675
enableRecorder(params: BrowserContextEnableRecorderParams, progress?: Progress): Promise<BrowserContextEnableRecorderResult>;
16761676
disableRecorder(params?: BrowserContextDisableRecorderParams, progress?: Progress): Promise<BrowserContextDisableRecorderResult>;
1677+
exposeConsoleApi(params?: BrowserContextExposeConsoleApiParams, progress?: Progress): Promise<BrowserContextExposeConsoleApiResult>;
16771678
newCDPSession(params: BrowserContextNewCDPSessionParams, progress?: Progress): Promise<BrowserContextNewCDPSessionResult>;
16781679
harStart(params: BrowserContextHarStartParams, progress?: Progress): Promise<BrowserContextHarStartResult>;
16791680
harExport(params: BrowserContextHarExportParams, progress?: Progress): Promise<BrowserContextHarExportResult>;
@@ -1953,6 +1954,9 @@ export type BrowserContextEnableRecorderResult = void;
19531954
export type BrowserContextDisableRecorderParams = {};
19541955
export type BrowserContextDisableRecorderOptions = {};
19551956
export type BrowserContextDisableRecorderResult = void;
1957+
export type BrowserContextExposeConsoleApiParams = {};
1958+
export type BrowserContextExposeConsoleApiOptions = {};
1959+
export type BrowserContextExposeConsoleApiResult = void;
19561960
export type BrowserContextNewCDPSessionParams = {
19571961
page?: PageChannel,
19581962
frame?: FrameChannel,

packages/protocol/src/protocol.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1353,6 +1353,9 @@ BrowserContext:
13531353
disableRecorder:
13541354
internal: true
13551355

1356+
exposeConsoleApi:
1357+
internal: true
1358+
13561359
newCDPSession:
13571360
title: Create CDP session
13581361
group: configuration

0 commit comments

Comments
 (0)