Skip to content

Commit 1bebc28

Browse files
authored
chore: reset page/context for reuse in component tests (#13264)
1 parent 8232497 commit 1bebc28

File tree

19 files changed

+194
-17
lines changed

19 files changed

+194
-17
lines changed

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,20 @@ export class BrowserContext extends ChannelOwner<channels.BrowserContextChannel>
242242
await this._channel.addInitScript({ source });
243243
}
244244

245+
async _removeInitScripts() {
246+
await this._channel.removeInitScripts();
247+
}
248+
245249
async exposeBinding(name: string, callback: (source: structs.BindingSource, ...args: any[]) => any, options: { handle?: boolean } = {}): Promise<void> {
246250
await this._channel.exposeBinding({ name, needsHandle: options.handle });
247251
this._bindings.set(name, callback);
248252
}
249253

254+
async _removeExposedBindings() {
255+
this._bindings.clear();
256+
await this._channel.removeExposedBindings();
257+
}
258+
250259
async exposeFunction(name: string, callback: Function): Promise<void> {
251260
await this._channel.exposeBinding({ name });
252261
const binding = (source: structs.BindingSource, ...args: any[]) => callback(...args);
@@ -265,6 +274,11 @@ export class BrowserContext extends ChannelOwner<channels.BrowserContextChannel>
265274
await this._disableInterception();
266275
}
267276

277+
async _unrouteAll() {
278+
this._routes = [];
279+
await this._disableInterception();
280+
}
281+
268282
private async _disableInterception() {
269283
await this._channel.setNetworkInterceptionEnabled({ enabled: false });
270284
}
@@ -346,6 +360,12 @@ export class BrowserContext extends ChannelOwner<channels.BrowserContextChannel>
346360
}) {
347361
await this._channel.recorderSupplementEnable(params);
348362
}
363+
364+
async _resetForReuse() {
365+
await this._unrouteAll();
366+
await this._removeInitScripts();
367+
await this._removeExposedBindings();
368+
}
349369
}
350370

351371
async function prepareStorageState(options: BrowserContextOptions): Promise<channels.BrowserNewContextParams['storageState']> {

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,11 @@ export class Page extends ChannelOwner<channels.PageChannel> implements api.Page
329329
this._bindings.set(name, callback);
330330
}
331331

332+
async _removeExposedBindings() {
333+
this._bindings.clear();
334+
await this._channel.removeExposedBindings();
335+
}
336+
332337
async setExtraHTTPHeaders(headers: Headers) {
333338
validateHeaders(headers);
334339
await this._channel.setExtraHTTPHeaders({ headers: headersObjectToArray(headers) });
@@ -449,6 +454,10 @@ export class Page extends ChannelOwner<channels.PageChannel> implements api.Page
449454
await this._channel.addInitScript({ source });
450455
}
451456

457+
async _removeInitScripts() {
458+
await this._channel.removeInitScripts();
459+
}
460+
452461
async route(url: URLMatch, handler: RouteHandlerCallback, options: { times?: number } = {}): Promise<void> {
453462
this._routes.unshift(new RouteHandler(this._browserContext._options.baseURL, url, handler, options.times));
454463
if (this._routes.length === 1)
@@ -461,6 +470,11 @@ export class Page extends ChannelOwner<channels.PageChannel> implements api.Page
461470
await this._disableInterception();
462471
}
463472

473+
async _unrouteAll() {
474+
this._routes = [];
475+
await this._disableInterception();
476+
}
477+
464478
private async _disableInterception() {
465479
await this._channel.setNetworkInterceptionEnabled({ enabled: false });
466480
}
@@ -715,6 +729,12 @@ export class Page extends ChannelOwner<channels.PageChannel> implements api.Page
715729
}
716730
return buffer;
717731
}
732+
733+
async _resetForReuse() {
734+
await this._unrouteAll();
735+
await this._removeInitScripts();
736+
await this._removeExposedBindings();
737+
}
718738
}
719739

720740
export class BindingCall extends ChannelOwner<channels.BindingCallChannel> {

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ export class BrowserContextDispatcher extends Dispatcher<BrowserContext, channel
125125
});
126126
}
127127

128+
async removeExposedBindings() {
129+
await this._context.removeExposedBindings();
130+
}
131+
128132
async newPage(params: channels.BrowserContextNewPageParams, metadata: CallMetadata): Promise<channels.BrowserContextNewPageResult> {
129133
return { page: lookupDispatcher<PageDispatcher>(await this._context.newPage(metadata)) };
130134
}
@@ -169,6 +173,10 @@ export class BrowserContextDispatcher extends Dispatcher<BrowserContext, channel
169173
await this._context.addInitScript(params.source);
170174
}
171175

176+
async removeInitScripts(): Promise<void> {
177+
await this._context.removeInitScripts();
178+
}
179+
172180
async setNetworkInterceptionEnabled(params: channels.BrowserContextSetNetworkInterceptionEnabledParams): Promise<void> {
173181
if (!params.enabled) {
174182
await this._context.setRequestInterceptor(undefined);

packages/playwright-core/src/dispatchers/pageDispatcher.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ export class PageDispatcher extends Dispatcher<Page, channels.PageChannel> imple
107107
});
108108
}
109109

110+
async removeExposedBindings() {
111+
await this._page.removeExposedBindings();
112+
}
113+
110114
async setExtraHTTPHeaders(params: channels.PageSetExtraHTTPHeadersParams, metadata: CallMetadata): Promise<void> {
111115
await this._page.setExtraHTTPHeaders(params.headers);
112116
}
@@ -140,6 +144,10 @@ export class PageDispatcher extends Dispatcher<Page, channels.PageChannel> imple
140144
await this._page.addInitScript(params.source);
141145
}
142146

147+
async removeInitScripts(): Promise<void> {
148+
await this._page.removeInitScripts();
149+
}
150+
143151
async setNetworkInterceptionEnabled(params: channels.PageSetNetworkInterceptionEnabledParams, metadata: CallMetadata): Promise<void> {
144152
if (!params.enabled) {
145153
await this._page.setClientRequestInterceptor(undefined);

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,11 +1056,13 @@ export interface BrowserContextChannel extends BrowserContextEventTarget, EventT
10561056
_type_BrowserContext: boolean;
10571057
addCookies(params: BrowserContextAddCookiesParams, metadata?: Metadata): Promise<BrowserContextAddCookiesResult>;
10581058
addInitScript(params: BrowserContextAddInitScriptParams, metadata?: Metadata): Promise<BrowserContextAddInitScriptResult>;
1059+
removeInitScripts(params?: BrowserContextRemoveInitScriptsParams, metadata?: Metadata): Promise<BrowserContextRemoveInitScriptsResult>;
10591060
clearCookies(params?: BrowserContextClearCookiesParams, metadata?: Metadata): Promise<BrowserContextClearCookiesResult>;
10601061
clearPermissions(params?: BrowserContextClearPermissionsParams, metadata?: Metadata): Promise<BrowserContextClearPermissionsResult>;
10611062
close(params?: BrowserContextCloseParams, metadata?: Metadata): Promise<BrowserContextCloseResult>;
10621063
cookies(params: BrowserContextCookiesParams, metadata?: Metadata): Promise<BrowserContextCookiesResult>;
10631064
exposeBinding(params: BrowserContextExposeBindingParams, metadata?: Metadata): Promise<BrowserContextExposeBindingResult>;
1065+
removeExposedBindings(params?: BrowserContextRemoveExposedBindingsParams, metadata?: Metadata): Promise<BrowserContextRemoveExposedBindingsResult>;
10641066
grantPermissions(params: BrowserContextGrantPermissionsParams, metadata?: Metadata): Promise<BrowserContextGrantPermissionsResult>;
10651067
newPage(params?: BrowserContextNewPageParams, metadata?: Metadata): Promise<BrowserContextNewPageResult>;
10661068
setDefaultNavigationTimeoutNoReply(params: BrowserContextSetDefaultNavigationTimeoutNoReplyParams, metadata?: Metadata): Promise<BrowserContextSetDefaultNavigationTimeoutNoReplyResult>;
@@ -1131,6 +1133,9 @@ export type BrowserContextAddInitScriptOptions = {
11311133

11321134
};
11331135
export type BrowserContextAddInitScriptResult = void;
1136+
export type BrowserContextRemoveInitScriptsParams = {};
1137+
export type BrowserContextRemoveInitScriptsOptions = {};
1138+
export type BrowserContextRemoveInitScriptsResult = void;
11341139
export type BrowserContextClearCookiesParams = {};
11351140
export type BrowserContextClearCookiesOptions = {};
11361141
export type BrowserContextClearCookiesResult = void;
@@ -1157,6 +1162,9 @@ export type BrowserContextExposeBindingOptions = {
11571162
needsHandle?: boolean,
11581163
};
11591164
export type BrowserContextExposeBindingResult = void;
1165+
export type BrowserContextRemoveExposedBindingsParams = {};
1166+
export type BrowserContextRemoveExposedBindingsOptions = {};
1167+
export type BrowserContextRemoveExposedBindingsResult = void;
11601168
export type BrowserContextGrantPermissionsParams = {
11611169
permissions: string[],
11621170
origin?: string,
@@ -1337,9 +1345,11 @@ export interface PageChannel extends PageEventTarget, EventTargetChannel {
13371345
setDefaultTimeoutNoReply(params: PageSetDefaultTimeoutNoReplyParams, metadata?: Metadata): Promise<PageSetDefaultTimeoutNoReplyResult>;
13381346
setFileChooserInterceptedNoReply(params: PageSetFileChooserInterceptedNoReplyParams, metadata?: Metadata): Promise<PageSetFileChooserInterceptedNoReplyResult>;
13391347
addInitScript(params: PageAddInitScriptParams, metadata?: Metadata): Promise<PageAddInitScriptResult>;
1348+
removeInitScripts(params?: PageRemoveInitScriptsParams, metadata?: Metadata): Promise<PageRemoveInitScriptsResult>;
13401349
close(params: PageCloseParams, metadata?: Metadata): Promise<PageCloseResult>;
13411350
emulateMedia(params: PageEmulateMediaParams, metadata?: Metadata): Promise<PageEmulateMediaResult>;
13421351
exposeBinding(params: PageExposeBindingParams, metadata?: Metadata): Promise<PageExposeBindingResult>;
1352+
removeExposedBindings(params?: PageRemoveExposedBindingsParams, metadata?: Metadata): Promise<PageRemoveExposedBindingsResult>;
13431353
goBack(params: PageGoBackParams, metadata?: Metadata): Promise<PageGoBackResult>;
13441354
goForward(params: PageGoForwardParams, metadata?: Metadata): Promise<PageGoForwardResult>;
13451355
reload(params: PageReloadParams, metadata?: Metadata): Promise<PageReloadResult>;
@@ -1439,6 +1449,9 @@ export type PageAddInitScriptOptions = {
14391449

14401450
};
14411451
export type PageAddInitScriptResult = void;
1452+
export type PageRemoveInitScriptsParams = {};
1453+
export type PageRemoveInitScriptsOptions = {};
1454+
export type PageRemoveInitScriptsResult = void;
14421455
export type PageCloseParams = {
14431456
runBeforeUnload?: boolean,
14441457
};
@@ -1467,6 +1480,9 @@ export type PageExposeBindingOptions = {
14671480
needsHandle?: boolean,
14681481
};
14691482
export type PageExposeBindingResult = void;
1483+
export type PageRemoveExposedBindingsParams = {};
1484+
export type PageRemoveExposedBindingsOptions = {};
1485+
export type PageRemoveExposedBindingsResult = void;
14701486
export type PageGoBackParams = {
14711487
timeout?: number,
14721488
waitUntil?: LifecycleEvent,

packages/playwright-core/src/protocol/protocol.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,8 @@ BrowserContext:
761761
parameters:
762762
source: string
763763

764+
removeInitScripts:
765+
764766
clearCookies:
765767

766768
clearPermissions:
@@ -782,6 +784,8 @@ BrowserContext:
782784
name: string
783785
needsHandle: boolean?
784786

787+
removeExposedBindings:
788+
785789
grantPermissions:
786790
parameters:
787791
permissions:
@@ -873,7 +877,6 @@ BrowserContext:
873877
returns:
874878
writableStream: WritableStream
875879

876-
877880
events:
878881

879882
bindingCall:
@@ -960,6 +963,8 @@ Page:
960963
parameters:
961964
source: string
962965

966+
removeInitScripts:
967+
963968
close:
964969
parameters:
965970
runBeforeUnload: boolean?
@@ -1001,6 +1006,8 @@ Page:
10011006
name: string
10021007
needsHandle: boolean?
10031008

1009+
removeExposedBindings:
1010+
10041011
goBack:
10051012
parameters:
10061013
timeout: number?

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,7 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme {
444444
scheme.BrowserContextAddInitScriptParams = tObject({
445445
source: tString,
446446
});
447+
scheme.BrowserContextRemoveInitScriptsParams = tOptional(tObject({}));
447448
scheme.BrowserContextClearCookiesParams = tOptional(tObject({}));
448449
scheme.BrowserContextClearPermissionsParams = tOptional(tObject({}));
449450
scheme.BrowserContextCloseParams = tOptional(tObject({}));
@@ -454,6 +455,7 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme {
454455
name: tString,
455456
needsHandle: tOptional(tBoolean),
456457
});
458+
scheme.BrowserContextRemoveExposedBindingsParams = tOptional(tObject({}));
457459
scheme.BrowserContextGrantPermissionsParams = tObject({
458460
permissions: tArray(tString),
459461
origin: tOptional(tString),
@@ -519,6 +521,7 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme {
519521
scheme.PageAddInitScriptParams = tObject({
520522
source: tString,
521523
});
524+
scheme.PageRemoveInitScriptsParams = tOptional(tObject({}));
522525
scheme.PageCloseParams = tObject({
523526
runBeforeUnload: tOptional(tBoolean),
524527
});
@@ -532,6 +535,7 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme {
532535
name: tString,
533536
needsHandle: tOptional(tBoolean),
534537
});
538+
scheme.PageRemoveExposedBindingsParams = tOptional(tObject({}));
535539
scheme.PageGoBackParams = tObject({
536540
timeout: tOptional(tNumber),
537541
waitUntil: tOptional(tType('LifecycleEvent')),

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,9 @@ export abstract class BrowserContext extends SdkObject {
163163
protected abstract doClearPermissions(): Promise<void>;
164164
protected abstract doSetHTTPCredentials(httpCredentials?: types.Credentials): Promise<void>;
165165
protected abstract doAddInitScript(expression: string): Promise<void>;
166+
protected abstract doRemoveInitScripts(): Promise<void>;
166167
protected abstract doExposeBinding(binding: PageBinding): Promise<void>;
168+
protected abstract doRemoveExposedBindings(): Promise<void>;
167169
protected abstract doUpdateRequestInterception(): Promise<void>;
168170
protected abstract doClose(): Promise<void>;
169171
protected abstract onClosePersistent(): void;
@@ -190,6 +192,11 @@ export abstract class BrowserContext extends SdkObject {
190192
await this.doExposeBinding(binding);
191193
}
192194

195+
async removeExposedBindings() {
196+
this._pageBindings.clear();
197+
await this.doRemoveExposedBindings();
198+
}
199+
193200
async grantPermissions(permissions: string[], origin?: string) {
194201
let resolvedOrigin = '*';
195202
if (origin) {
@@ -270,6 +277,11 @@ export abstract class BrowserContext extends SdkObject {
270277
await this.doAddInitScript(script);
271278
}
272279

280+
async removeInitScripts(): Promise<void> {
281+
this.initScripts.splice(0, this.initScripts.length);
282+
await this.doRemoveInitScripts();
283+
}
284+
273285
async setRequestInterceptor(handler: network.RouteHandler | undefined): Promise<void> {
274286
this._requestInterceptor = handler;
275287
await this.doUpdateRequestInterception();

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,11 +464,21 @@ export class CRBrowserContext extends BrowserContext {
464464
await (page._delegate as CRPage).addInitScript(source);
465465
}
466466

467+
async doRemoveInitScripts() {
468+
for (const page of this.pages())
469+
await (page._delegate as CRPage).removeInitScripts();
470+
}
471+
467472
async doExposeBinding(binding: PageBinding) {
468473
for (const page of this.pages())
469474
await (page._delegate as CRPage).exposeBinding(binding);
470475
}
471476

477+
async doRemoveExposedBindings() {
478+
for (const page of this.pages())
479+
await (page._delegate as CRPage).removeExposedBindings();
480+
}
481+
472482
async doUpdateRequestInterception(): Promise<void> {
473483
for (const page of this.pages())
474484
await (page._delegate as CRPage).updateRequestInterception();

0 commit comments

Comments
 (0)