Skip to content

Commit

Permalink
chore: support await using for close() and dispose() (#27766)
Browse files Browse the repository at this point in the history
This change assumes that the user has Node 18 with Symbol.dispose
available.

Fixes #27141
  • Loading branch information
pavelfeldman committed Oct 24, 2023
1 parent c8134bc commit 7de0ccd
Show file tree
Hide file tree
Showing 21 changed files with 282 additions and 67 deletions.
1 change: 1 addition & 0 deletions packages/playwright-core/src/browserServerImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ export class BrowserServerLauncherImpl implements BrowserServerLauncher {
browserServer.process = () => browser.options.browserProcess.process!;
browserServer.wsEndpoint = () => wsEndpoint;
browserServer.close = () => browser.options.browserProcess.close();
browserServer[Symbol.asyncDispose] = browserServer.close;
browserServer.kill = () => browser.options.browserProcess.kill();
(browserServer as any)._disconnectForTest = () => server.close();
(browserServer as any)._userDataDirForTest = (browser as any)._userDataDirForTest;
Expand Down
8 changes: 8 additions & 0 deletions packages/playwright-core/src/client/android.ts
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,10 @@ export class AndroidDevice extends ChannelOwner<channels.AndroidDeviceChannel> i
return binary;
}

async [Symbol.asyncDispose]() {
await this.close();
}

async close() {
try {
if (this._shouldCloseConnectionOnClose)
Expand Down Expand Up @@ -307,6 +311,10 @@ export class AndroidSocket extends ChannelOwner<channels.AndroidSocketChannel> i
async close(): Promise<void> {
await this._channel.close();
}

async [Symbol.asyncDispose]() {
await this.close();
}
}

async function loadFile(file: string | Buffer): Promise<Buffer> {
Expand Down
4 changes: 4 additions & 0 deletions packages/playwright-core/src/client/browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,10 @@ export class Browser extends ChannelOwner<channels.BrowserChannel> implements ap
return buffer;
}

async [Symbol.asyncDispose]() {
await this.close();
}

async close(options: { reason?: string } = {}): Promise<void> {
this._closeReason = options.reason;
try {
Expand Down
4 changes: 4 additions & 0 deletions packages/playwright-core/src/client/browserContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,10 @@ export class BrowserContext extends ChannelOwner<channels.BrowserContextChannel>
this.emit(Events.BrowserContext.Close, this);
}

async [Symbol.asyncDispose]() {
await this.close();
}

async close(options: { reason?: string } = {}): Promise<void> {
if (this._closeWasCalled)
return;
Expand Down
4 changes: 4 additions & 0 deletions packages/playwright-core/src/client/electron.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,10 @@ export class ElectronApplication extends ChannelOwner<channels.ElectronApplicati
return this._context;
}

async [Symbol.asyncDispose]() {
await this.close();
}

async close() {
if (this._isClosed)
return;
Expand Down
8 changes: 8 additions & 0 deletions packages/playwright-core/src/client/fetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ export class APIRequestContext extends ChannelOwner<channels.APIRequestContextCh
this._tracing = Tracing.from(initializer.tracing);
}

async [Symbol.asyncDispose]() {
await this.dispose();
}

async dispose(): Promise<void> {
await this._instrumentation.onWillCloseRequestContext(this);
await this._channel.dispose();
Expand Down Expand Up @@ -302,6 +306,10 @@ export class APIResponse implements api.APIResponse {
return JSON.parse(content);
}

async [Symbol.asyncDispose]() {
await this.dispose();
}

async dispose(): Promise<void> {
await this._request._channel.disposeAPIResponse({ fetchUid: this._fetchUid() });
}
Expand Down
4 changes: 4 additions & 0 deletions packages/playwright-core/src/client/harRouter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@ export class HarRouter {
page.once(Events.Page.Close, () => this.dispose());
}

async [Symbol.asyncDispose]() {
await this.dispose();
}

dispose() {
this._localUtils._channel.harClose({ harId: this._harId }).catch(() => {});
}
Expand Down
4 changes: 4 additions & 0 deletions packages/playwright-core/src/client/jsHandle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ export class JSHandle<T = any> extends ChannelOwner<channels.JSHandleChannel> im
return null as any;
}

async [Symbol.asyncDispose]() {
await this.dispose();
}

async dispose() {
return await this._channel.dispose();
}
Expand Down
4 changes: 4 additions & 0 deletions packages/playwright-core/src/client/page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,10 @@ export class Page extends ChannelOwner<channels.PageChannel> implements api.Page
await this._channel.bringToFront();
}

async [Symbol.asyncDispose]() {
await this.close();
}

async close(options: { runBeforeUnload?: boolean, reason?: string } = {}) {
this._closeReason = options.reason;
try {
Expand Down
98 changes: 59 additions & 39 deletions packages/playwright-core/types/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4707,6 +4707,8 @@ export interface Page {
request: APIRequestContext;

touchscreen: Touchscreen;

[Symbol.asyncDispose](): Promise<void>;
}

/**
Expand Down Expand Up @@ -7632,12 +7634,6 @@ export interface BrowserContext {
*/
on(event: 'page', listener: (page: Page) => void): this;

/**
* Emitted when exception is unhandled in any of the pages in this context. To listen for errors from a particular
* page, use [page.on('pageerror')](https://playwright.dev/docs/api/class-page#page-event-page-error) instead.
*/
on(event: 'weberror', listener: (webError: WebError) => void): this;

/**
* Emitted when a request is issued from any pages created through this context. The [request] object is read-only. To
* only listen for requests from a particular page, use
Expand Down Expand Up @@ -7683,6 +7679,12 @@ export interface BrowserContext {
*/
on(event: 'serviceworker', listener: (worker: Worker) => void): this;

/**
* Emitted when exception is unhandled in any of the pages in this context. To listen for errors from a particular
* page, use [page.on('pageerror')](https://playwright.dev/docs/api/class-page#page-event-page-error) instead.
*/
on(event: 'weberror', listener: (webError: WebError) => void): this;

/**
* Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event.
*/
Expand All @@ -7708,11 +7710,6 @@ export interface BrowserContext {
*/
once(event: 'page', listener: (page: Page) => void): this;

/**
* Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event.
*/
once(event: 'weberror', listener: (webError: WebError) => void): this;

/**
* Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event.
*/
Expand All @@ -7738,6 +7735,11 @@ export interface BrowserContext {
*/
once(event: 'serviceworker', listener: (worker: Worker) => void): this;

/**
* Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event.
*/
once(event: 'weberror', listener: (webError: WebError) => void): this;

/**
* **NOTE** Only works with Chromium browser's persistent context.
*
Expand Down Expand Up @@ -7824,12 +7826,6 @@ export interface BrowserContext {
*/
addListener(event: 'page', listener: (page: Page) => void): this;

/**
* Emitted when exception is unhandled in any of the pages in this context. To listen for errors from a particular
* page, use [page.on('pageerror')](https://playwright.dev/docs/api/class-page#page-event-page-error) instead.
*/
addListener(event: 'weberror', listener: (webError: WebError) => void): this;

/**
* Emitted when a request is issued from any pages created through this context. The [request] object is read-only. To
* only listen for requests from a particular page, use
Expand Down Expand Up @@ -7875,6 +7871,12 @@ export interface BrowserContext {
*/
addListener(event: 'serviceworker', listener: (worker: Worker) => void): this;

/**
* Emitted when exception is unhandled in any of the pages in this context. To listen for errors from a particular
* page, use [page.on('pageerror')](https://playwright.dev/docs/api/class-page#page-event-page-error) instead.
*/
addListener(event: 'weberror', listener: (webError: WebError) => void): this;

/**
* Removes an event listener added by `on` or `addListener`.
*/
Expand All @@ -7900,11 +7902,6 @@ export interface BrowserContext {
*/
removeListener(event: 'page', listener: (page: Page) => void): this;

/**
* Removes an event listener added by `on` or `addListener`.
*/
removeListener(event: 'weberror', listener: (webError: WebError) => void): this;

/**
* Removes an event listener added by `on` or `addListener`.
*/
Expand All @@ -7930,6 +7927,11 @@ export interface BrowserContext {
*/
removeListener(event: 'serviceworker', listener: (worker: Worker) => void): this;

/**
* Removes an event listener added by `on` or `addListener`.
*/
removeListener(event: 'weberror', listener: (webError: WebError) => void): this;

/**
* Removes an event listener added by `on` or `addListener`.
*/
Expand All @@ -7955,11 +7957,6 @@ export interface BrowserContext {
*/
off(event: 'page', listener: (page: Page) => void): this;

/**
* Removes an event listener added by `on` or `addListener`.
*/
off(event: 'weberror', listener: (webError: WebError) => void): this;

/**
* Removes an event listener added by `on` or `addListener`.
*/
Expand All @@ -7985,6 +7982,11 @@ export interface BrowserContext {
*/
off(event: 'serviceworker', listener: (worker: Worker) => void): this;

/**
* Removes an event listener added by `on` or `addListener`.
*/
off(event: 'weberror', listener: (webError: WebError) => void): this;

/**
* **NOTE** Only works with Chromium browser's persistent context.
*
Expand Down Expand Up @@ -8071,12 +8073,6 @@ export interface BrowserContext {
*/
prependListener(event: 'page', listener: (page: Page) => void): this;

/**
* Emitted when exception is unhandled in any of the pages in this context. To listen for errors from a particular
* page, use [page.on('pageerror')](https://playwright.dev/docs/api/class-page#page-event-page-error) instead.
*/
prependListener(event: 'weberror', listener: (webError: WebError) => void): this;

/**
* Emitted when a request is issued from any pages created through this context. The [request] object is read-only. To
* only listen for requests from a particular page, use
Expand Down Expand Up @@ -8122,6 +8118,12 @@ export interface BrowserContext {
*/
prependListener(event: 'serviceworker', listener: (worker: Worker) => void): this;

/**
* Emitted when exception is unhandled in any of the pages in this context. To listen for errors from a particular
* page, use [page.on('pageerror')](https://playwright.dev/docs/api/class-page#page-event-page-error) instead.
*/
prependListener(event: 'weberror', listener: (webError: WebError) => void): this;

/**
* Adds cookies into this browser context. All pages within this context will have these cookies installed. Cookies
* can be obtained via
Expand Down Expand Up @@ -8670,12 +8672,6 @@ export interface BrowserContext {
*/
waitForEvent(event: 'page', optionsOrPredicate?: { predicate?: (page: Page) => boolean | Promise<boolean>, timeout?: number } | ((page: Page) => boolean | Promise<boolean>)): Promise<Page>;

/**
* Emitted when exception is unhandled in any of the pages in this context. To listen for errors from a particular
* page, use [page.on('pageerror')](https://playwright.dev/docs/api/class-page#page-event-page-error) instead.
*/
waitForEvent(event: 'weberror', optionsOrPredicate?: { predicate?: (webError: WebError) => boolean | Promise<boolean>, timeout?: number } | ((webError: WebError) => boolean | Promise<boolean>)): Promise<WebError>;

/**
* Emitted when a request is issued from any pages created through this context. The [request] object is read-only. To
* only listen for requests from a particular page, use
Expand Down Expand Up @@ -8721,13 +8717,21 @@ export interface BrowserContext {
*/
waitForEvent(event: 'serviceworker', optionsOrPredicate?: { predicate?: (worker: Worker) => boolean | Promise<boolean>, timeout?: number } | ((worker: Worker) => boolean | Promise<boolean>)): Promise<Worker>;

/**
* Emitted when exception is unhandled in any of the pages in this context. To listen for errors from a particular
* page, use [page.on('pageerror')](https://playwright.dev/docs/api/class-page#page-event-page-error) instead.
*/
waitForEvent(event: 'weberror', optionsOrPredicate?: { predicate?: (webError: WebError) => boolean | Promise<boolean>, timeout?: number } | ((webError: WebError) => boolean | Promise<boolean>)): Promise<WebError>;


/**
* API testing helper associated with this context. Requests made with this API will use context cookies.
*/
request: APIRequestContext;

tracing: Tracing;

[Symbol.asyncDispose](): Promise<void>;
}

/**
Expand Down Expand Up @@ -8992,6 +8996,8 @@ export interface JSHandle<T = any> {
* @param propertyName property to get
*/
getProperty(propertyName: string): Promise<JSHandle>;

[Symbol.asyncDispose](): Promise<void>;
}

/**
Expand Down Expand Up @@ -13747,6 +13753,8 @@ export interface ElectronApplication {
* Convenience method that returns all the opened windows.
*/
windows(): Array<Page>;

[Symbol.asyncDispose](): Promise<void>;
}

export type AndroidElementInfo = {
Expand Down Expand Up @@ -14806,6 +14814,8 @@ export interface AndroidDevice {
webViews(): Array<AndroidWebView>;

input: AndroidInput;

[Symbol.asyncDispose](): Promise<void>;
}

export interface AndroidInput {
Expand Down Expand Up @@ -14941,6 +14951,8 @@ export interface AndroidSocket {
* @param data Data to write.
*/
write(data: Buffer): Promise<void>;

[Symbol.asyncDispose](): Promise<void>;
}

/**
Expand Down Expand Up @@ -15880,6 +15892,8 @@ export interface APIRequestContext {
}>;
}>;
}>;

[Symbol.asyncDispose](): Promise<void>;
}

/**
Expand Down Expand Up @@ -15950,6 +15964,8 @@ export interface APIResponse {
* Contains the URL of the response.
*/
url(): string;

[Symbol.asyncDispose](): Promise<void>;
}

/**
Expand Down Expand Up @@ -16545,6 +16561,8 @@ export interface Browser extends EventEmitter {
* Returns the browser version.
*/
version(): string;

[Symbol.asyncDispose](): Promise<void>;
}

export interface BrowserServer {
Expand Down Expand Up @@ -16601,6 +16619,8 @@ export interface BrowserServer {
* to establish connection to the browser.
*/
wsEndpoint(): string;

[Symbol.asyncDispose](): Promise<void>;
}

/**
Expand Down

0 comments on commit 7de0ccd

Please sign in to comment.