chore: use generic implementation for BrowserContext.waitForTarget (#11848)

Co-authored-by: Alex Rudenko <OrKoN@users.noreply.github.com>
This commit is contained in:
jrandolf 2024-02-06 17:42:05 +01:00 committed by GitHub
parent f62380d373
commit 27c71a9cf6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 21 additions and 25 deletions

View File

@ -12,7 +12,7 @@ This will look all open [browser contexts](./puppeteer.browsercontext.md).
```typescript
class BrowserContext {
abstract waitForTarget(
waitForTarget(
predicate: (x: Target) => boolean | Promise<boolean>,
options?: WaitForTargetOptions
): Promise<Target>;

View File

@ -4,8 +4,15 @@
* SPDX-License-Identifier: Apache-2.0
*/
import {
filterAsync,
firstValueFrom,
from,
merge,
raceWith,
} from '../../third_party/rxjs/rxjs.js';
import {EventEmitter, type EventType} from '../common/EventEmitter.js';
import {debugError} from '../common/util.js';
import {debugError, fromEmitterEvent, timeout} from '../common/util.js';
import {asyncDisposeSymbol, disposeSymbol} from '../util/disposable.js';
import type {Browser, Permission, WaitForTargetOptions} from './Browser.js';
@ -108,10 +115,19 @@ export abstract class BrowserContext extends EventEmitter<BrowserContextEvents>
* );
* ```
*/
abstract waitForTarget(
async waitForTarget(
predicate: (x: Target) => boolean | Promise<boolean>,
options?: WaitForTargetOptions
): Promise<Target>;
options: WaitForTargetOptions = {}
): Promise<Target> {
const {timeout: ms = 30000} = options;
return await firstValueFrom(
merge(
fromEmitterEvent(this, BrowserContextEvent.TargetCreated),
fromEmitterEvent(this, BrowserContextEvent.TargetChanged),
from(this.targets())
).pipe(filterAsync(predicate), raceWith(timeout(ms)))
);
}
/**
* Gets a list of all open {@link Page | pages} inside this

View File

@ -6,7 +6,6 @@
import * as Bidi from 'chromium-bidi/lib/cjs/protocol/protocol.js';
import type {WaitForTargetOptions} from '../api/Browser.js';
import {BrowserContext} from '../api/BrowserContext.js';
import type {Page} from '../api/Page.js';
import type {Target} from '../api/Target.js';
@ -53,15 +52,6 @@ export class BidiBrowserContext extends BrowserContext {
});
}
override waitForTarget(
predicate: (x: Target) => boolean | Promise<boolean>,
options: WaitForTargetOptions = {}
): Promise<Target> {
return this.#browser.waitForTarget(target => {
return target.browserContext() === this && predicate(target);
}, options);
}
get connection(): BidiConnection {
return this.#connection;
}

View File

@ -18,7 +18,6 @@ import {
type IsPageTargetCallback,
type Permission,
type TargetFilterCallback,
type WaitForTargetOptions,
} from '../api/Browser.js';
import {BrowserContext, BrowserContextEvent} from '../api/BrowserContext.js';
import {CDPSessionEvent, type CDPSession} from '../api/CDPSession.js';
@ -451,15 +450,6 @@ export class CdpBrowserContext extends BrowserContext {
});
}
override waitForTarget(
predicate: (x: Target) => boolean | Promise<boolean>,
options: WaitForTargetOptions = {}
): Promise<Target> {
return this.#browser.waitForTarget(target => {
return target.browserContext() === this && predicate(target);
}, options);
}
override async pages(): Promise<Page[]> {
const pages = await Promise.all(
this.targets()