summaryrefslogtreecommitdiffstats
path: root/remote/test/puppeteer/packages/puppeteer-core/src/bidi/Browser.ts
diff options
context:
space:
mode:
Diffstat (limited to 'remote/test/puppeteer/packages/puppeteer-core/src/bidi/Browser.ts')
-rw-r--r--remote/test/puppeteer/packages/puppeteer-core/src/bidi/Browser.ts158
1 files changed, 48 insertions, 110 deletions
diff --git a/remote/test/puppeteer/packages/puppeteer-core/src/bidi/Browser.ts b/remote/test/puppeteer/packages/puppeteer-core/src/bidi/Browser.ts
index 42979790c9..8798d8325d 100644
--- a/remote/test/puppeteer/packages/puppeteer-core/src/bidi/Browser.ts
+++ b/remote/test/puppeteer/packages/puppeteer-core/src/bidi/Browser.ts
@@ -8,6 +8,7 @@ import type {ChildProcess} from 'child_process';
import type * as Bidi from 'chromium-bidi/lib/cjs/protocol/protocol.js';
+import type {BrowserEvents} from '../api/Browser.js';
import {
Browser,
BrowserEvent,
@@ -19,22 +20,17 @@ import {BrowserContextEvent} from '../api/BrowserContext.js';
import type {Page} from '../api/Page.js';
import type {Target} from '../api/Target.js';
import {UnsupportedOperation} from '../common/Errors.js';
-import type {Handler} from '../common/EventEmitter.js';
+import {EventEmitter} from '../common/EventEmitter.js';
import {debugError} from '../common/util.js';
import type {Viewport} from '../common/Viewport.js';
+import {bubble} from '../util/decorators.js';
import {BidiBrowserContext} from './BrowserContext.js';
-import {BrowsingContext, BrowsingContextEvent} from './BrowsingContext.js';
import type {BidiConnection} from './Connection.js';
import type {Browser as BrowserCore} from './core/Browser.js';
import {Session} from './core/Session.js';
import type {UserContext} from './core/UserContext.js';
-import {
- BiDiBrowserTarget,
- BiDiBrowsingContextTarget,
- BiDiPageTarget,
- type BidiTarget,
-} from './Target.js';
+import {BidiBrowserTarget} from './Target.js';
/**
* @internal
@@ -89,28 +85,18 @@ export class BidiBrowser extends Browser {
const browser = new BidiBrowser(session.browser, opts);
browser.#initialize();
- await browser.#getTree();
return browser;
}
+ @bubble()
+ accessor #trustedEmitter = new EventEmitter<BrowserEvents>();
+
#process?: ChildProcess;
#closeCallback?: BrowserCloseCallback;
#browserCore: BrowserCore;
#defaultViewport: Viewport | null;
- #targets = new Map<string, BidiTarget>();
#browserContexts = new WeakMap<UserContext, BidiBrowserContext>();
- #browserTarget: BiDiBrowserTarget;
-
- #connectionEventHandlers = new Map<
- Bidi.BrowsingContextEvent['method'],
- Handler<any>
- >([
- ['browsingContext.contextCreated', this.#onContextCreated.bind(this)],
- ['browsingContext.contextDestroyed', this.#onContextDestroyed.bind(this)],
- ['browsingContext.domContentLoaded', this.#onContextDomLoaded.bind(this)],
- ['browsingContext.fragmentNavigated', this.#onContextNavigation.bind(this)],
- ['browsingContext.navigationStarted', this.#onContextNavigation.bind(this)],
- ]);
+ #target = new BidiBrowserTarget(this);
private constructor(browserCore: BrowserCore, opts: BidiBrowserOptions) {
super();
@@ -118,22 +104,22 @@ export class BidiBrowser extends Browser {
this.#closeCallback = opts.closeCallback;
this.#browserCore = browserCore;
this.#defaultViewport = opts.defaultViewport;
- this.#browserTarget = new BiDiBrowserTarget(this);
- this.#createBrowserContext(this.#browserCore.defaultUserContext);
}
#initialize() {
+ // Initializing existing contexts.
+ for (const userContext of this.#browserCore.userContexts) {
+ this.#createBrowserContext(userContext);
+ }
+
this.#browserCore.once('disconnected', () => {
- this.emit(BrowserEvent.Disconnected, undefined);
+ this.#trustedEmitter.emit(BrowserEvent.Disconnected, undefined);
+ this.#trustedEmitter.removeAllListeners();
});
this.#process?.once('close', () => {
this.#browserCore.dispose('Browser process exited.', true);
this.connection.dispose();
});
-
- for (const [eventName, handler] of this.#connectionEventHandlers) {
- this.connection.on(eventName, handler);
- }
}
get #browserName() {
@@ -143,82 +129,40 @@ export class BidiBrowser extends Browser {
return this.#browserCore.session.capabilities.browserVersion;
}
+ get cdpSupported(): boolean {
+ return !this.#browserName.toLocaleLowerCase().includes('firefox');
+ }
+
override userAgent(): never {
throw new UnsupportedOperation();
}
#createBrowserContext(userContext: UserContext) {
- const browserContext = new BidiBrowserContext(this, userContext, {
+ const browserContext = BidiBrowserContext.from(this, userContext, {
defaultViewport: this.#defaultViewport,
});
this.#browserContexts.set(userContext, browserContext);
- return browserContext;
- }
-
- #onContextDomLoaded(event: Bidi.BrowsingContext.Info) {
- const target = this.#targets.get(event.context);
- if (target) {
- this.emit(BrowserEvent.TargetChanged, target);
- }
- }
-
- #onContextNavigation(event: Bidi.BrowsingContext.NavigationInfo) {
- const target = this.#targets.get(event.context);
- if (target) {
- this.emit(BrowserEvent.TargetChanged, target);
- target.browserContext().emit(BrowserContextEvent.TargetChanged, target);
- }
- }
- #onContextCreated(event: Bidi.BrowsingContext.ContextCreated['params']) {
- const context = new BrowsingContext(
- this.connection,
- event,
- this.#browserName
+ browserContext.trustedEmitter.on(
+ BrowserContextEvent.TargetCreated,
+ target => {
+ this.#trustedEmitter.emit(BrowserEvent.TargetCreated, target);
+ }
+ );
+ browserContext.trustedEmitter.on(
+ BrowserContextEvent.TargetChanged,
+ target => {
+ this.#trustedEmitter.emit(BrowserEvent.TargetChanged, target);
+ }
+ );
+ browserContext.trustedEmitter.on(
+ BrowserContextEvent.TargetDestroyed,
+ target => {
+ this.#trustedEmitter.emit(BrowserEvent.TargetDestroyed, target);
+ }
);
- this.connection.registerBrowsingContexts(context);
- // TODO: once more browsing context types are supported, this should be
- // updated to support those. Currently, all top-level contexts are treated
- // as pages.
- const browserContext = this.browserContexts().at(-1);
- if (!browserContext) {
- throw new Error('Missing browser contexts');
- }
- const target = !context.parent
- ? new BiDiPageTarget(browserContext, context)
- : new BiDiBrowsingContextTarget(browserContext, context);
- this.#targets.set(event.context, target);
-
- this.emit(BrowserEvent.TargetCreated, target);
- target.browserContext().emit(BrowserContextEvent.TargetCreated, target);
-
- if (context.parent) {
- const topLevel = this.connection.getTopLevelContext(context.parent);
- topLevel.emit(BrowsingContextEvent.Created, context);
- }
- }
-
- async #getTree(): Promise<void> {
- const {result} = await this.connection.send('browsingContext.getTree', {});
- for (const context of result.contexts) {
- this.#onContextCreated(context);
- }
- }
- async #onContextDestroyed(
- event: Bidi.BrowsingContext.ContextDestroyed['params']
- ) {
- const context = this.connection.getBrowsingContext(event.context);
- const topLevelContext = this.connection.getTopLevelContext(event.context);
- topLevelContext.emit(BrowsingContextEvent.Destroyed, context);
- const target = this.#targets.get(event.context);
- const page = await target?.page();
- await page?.close().catch(debugError);
- this.#targets.delete(event.context);
- if (target) {
- this.emit(BrowserEvent.TargetDestroyed, target);
- target.browserContext().emit(BrowserContextEvent.TargetDestroyed, target);
- }
+ return browserContext;
}
get connection(): BidiConnection {
@@ -231,9 +175,6 @@ export class BidiBrowser extends Browser {
}
override async close(): Promise<void> {
- for (const [eventName, handler] of this.#connectionEventHandlers) {
- this.connection.off(eventName, handler);
- }
if (this.connection.closed) {
return;
}
@@ -250,14 +191,14 @@ export class BidiBrowser extends Browser {
}
override get connected(): boolean {
- return !this.#browserCore.disposed;
+ return !this.#browserCore.disconnected;
}
override process(): ChildProcess | null {
return this.#process ?? null;
}
- override async createIncognitoBrowserContext(
+ override async createBrowserContext(
_options?: BrowserContextOptions
): Promise<BidiBrowserContext> {
const userContext = await this.#browserCore.createUserContext();
@@ -283,19 +224,16 @@ export class BidiBrowser extends Browser {
}
override targets(): Target[] {
- return [this.#browserTarget, ...Array.from(this.#targets.values())];
- }
-
- _getTargetById(id: string): BidiTarget {
- const target = this.#targets.get(id);
- if (!target) {
- throw new Error('Target not found');
- }
- return target;
+ return [
+ this.#target,
+ ...this.browserContexts().flatMap(context => {
+ return context.targets();
+ }),
+ ];
}
- override target(): Target {
- return this.#browserTarget;
+ override target(): BidiBrowserTarget {
+ return this.#target;
}
override async disconnect(): Promise<void> {