summaryrefslogtreecommitdiffstats
path: root/remote/test/puppeteer/packages/puppeteer-core/src/bidi/core/BrowsingContext.ts
diff options
context:
space:
mode:
Diffstat (limited to 'remote/test/puppeteer/packages/puppeteer-core/src/bidi/core/BrowsingContext.ts')
-rw-r--r--remote/test/puppeteer/packages/puppeteer-core/src/bidi/core/BrowsingContext.ts129
1 files changed, 112 insertions, 17 deletions
diff --git a/remote/test/puppeteer/packages/puppeteer-core/src/bidi/core/BrowsingContext.ts b/remote/test/puppeteer/packages/puppeteer-core/src/bidi/core/BrowsingContext.ts
index 9bec2a506c..07309576a3 100644
--- a/remote/test/puppeteer/packages/puppeteer-core/src/bidi/core/BrowsingContext.ts
+++ b/remote/test/puppeteer/packages/puppeteer-core/src/bidi/core/BrowsingContext.ts
@@ -12,6 +12,7 @@ import {DisposableStack, disposeSymbol} from '../../util/disposable.js';
import type {AddPreloadScriptOptions} from './Browser.js';
import {Navigation} from './Navigation.js';
+import type {DedicatedWorkerRealm} from './Realm.js';
import {WindowRealm} from './Realm.js';
import {Request} from './Request.js';
import type {UserContext} from './UserContext.js';
@@ -60,6 +61,14 @@ export type SetViewportOptions = Omit<
/**
* @internal
*/
+export type GetCookiesOptions = Omit<
+ Bidi.Storage.GetCookiesParameters,
+ 'partition'
+>;
+
+/**
+ * @internal
+ */
export class BrowsingContext extends EventEmitter<{
/** Emitted when this context is closed. */
closed: {
@@ -95,6 +104,11 @@ export class BrowsingContext extends EventEmitter<{
DOMContentLoaded: void;
/** Emitted whenever the frame emits `load` */
load: void;
+ /** Emitted whenever a dedicated worker is created */
+ worker: {
+ /** The realm for the new dedicated worker */
+ realm: DedicatedWorkerRealm;
+ };
}> {
static from(
userContext: UserContext,
@@ -135,7 +149,7 @@ export class BrowsingContext extends EventEmitter<{
this.userContext = context;
// keep-sorted end
- this.defaultRealm = WindowRealm.from(this);
+ this.defaultRealm = this.#createWindowRealm();
}
#initialize() {
@@ -202,7 +216,16 @@ export class BrowsingContext extends EventEmitter<{
}
this.#url = info.url;
- this.#requests.clear();
+ for (const [id, request] of this.#requests) {
+ if (request.disposed) {
+ this.#requests.delete(id);
+ }
+ }
+ // If the navigation hasn't finished, then this is nested navigation. The
+ // current navigation will handle this.
+ if (this.#navigation !== undefined && !this.#navigation.disposed) {
+ return;
+ }
// Note the navigation ID is null for this event.
this.#navigation = Navigation.from(this);
@@ -224,7 +247,8 @@ export class BrowsingContext extends EventEmitter<{
if (event.context !== this.id) {
return;
}
- if (this.#requests.has(event.request.request)) {
+ if (event.redirectCount !== 0) {
+ // Means the request is a redirect. This is handled in Request.
return;
}
@@ -265,7 +289,12 @@ export class BrowsingContext extends EventEmitter<{
return this.closed;
}
get realms(): Iterable<WindowRealm> {
- return this.#realms.values();
+ // eslint-disable-next-line @typescript-eslint/no-this-alias -- Required
+ const self = this;
+ return (function* () {
+ yield self.defaultRealm;
+ yield* self.#realms.values();
+ })();
}
get top(): BrowsingContext {
let context = this as BrowsingContext;
@@ -279,6 +308,14 @@ export class BrowsingContext extends EventEmitter<{
}
// keep-sorted end
+ #createWindowRealm(sandbox?: string) {
+ const realm = WindowRealm.from(this, sandbox);
+ realm.on('worker', realm => {
+ this.emit('worker', {realm});
+ });
+ return realm;
+ }
+
@inertIfDisposed
private dispose(reason?: string): void {
this.#reason = reason;
@@ -345,33 +382,23 @@ export class BrowsingContext extends EventEmitter<{
async navigate(
url: string,
wait?: Bidi.BrowsingContext.ReadinessState
- ): Promise<Navigation> {
+ ): Promise<void> {
await this.#session.send('browsingContext.navigate', {
context: this.id,
url,
wait,
});
- return await new Promise(resolve => {
- this.once('navigation', ({navigation}) => {
- resolve(navigation);
- });
- });
}
@throwIfDisposed<BrowsingContext>(context => {
// SAFETY: Disposal implies this exists.
return context.#reason!;
})
- async reload(options: ReloadOptions = {}): Promise<Navigation> {
+ async reload(options: ReloadOptions = {}): Promise<void> {
await this.#session.send('browsingContext.reload', {
context: this.id,
...options,
});
- return await new Promise(resolve => {
- this.once('navigation', ({navigation}) => {
- resolve(navigation);
- });
- });
}
@throwIfDisposed<BrowsingContext>(context => {
@@ -436,7 +463,7 @@ export class BrowsingContext extends EventEmitter<{
return context.#reason!;
})
createWindowRealm(sandbox: string): WindowRealm {
- return WindowRealm.from(this, sandbox);
+ return this.#createWindowRealm(sandbox);
}
@throwIfDisposed<BrowsingContext>(context => {
@@ -464,6 +491,54 @@ export class BrowsingContext extends EventEmitter<{
await this.userContext.browser.removePreloadScript(script);
}
+ @throwIfDisposed<BrowsingContext>(context => {
+ // SAFETY: Disposal implies this exists.
+ return context.#reason!;
+ })
+ async getCookies(
+ options: GetCookiesOptions = {}
+ ): Promise<Bidi.Network.Cookie[]> {
+ const {
+ result: {cookies},
+ } = await this.#session.send('storage.getCookies', {
+ ...options,
+ partition: {
+ type: 'context',
+ context: this.id,
+ },
+ });
+ return cookies;
+ }
+
+ @throwIfDisposed<BrowsingContext>(context => {
+ // SAFETY: Disposal implies this exists.
+ return context.#reason!;
+ })
+ async setCookie(cookie: Bidi.Storage.PartialCookie): Promise<void> {
+ await this.#session.send('storage.setCookie', {
+ cookie,
+ partition: {
+ type: 'context',
+ context: this.id,
+ },
+ });
+ }
+
+ @throwIfDisposed<BrowsingContext>(context => {
+ // SAFETY: Disposal implies this exists.
+ return context.#reason!;
+ })
+ async setFiles(
+ element: Bidi.Script.SharedReference,
+ files: string[]
+ ): Promise<void> {
+ await this.#session.send('input.setFiles', {
+ context: this.id,
+ element,
+ files,
+ });
+ }
+
[disposeSymbol](): void {
this.#reason ??=
'Browsing context already closed, probably because the user context closed.';
@@ -472,4 +547,24 @@ export class BrowsingContext extends EventEmitter<{
this.#disposables.dispose();
super[disposeSymbol]();
}
+
+ @throwIfDisposed<BrowsingContext>(context => {
+ // SAFETY: Disposal implies this exists.
+ return context.#reason!;
+ })
+ async deleteCookie(
+ ...cookieFilters: Bidi.Storage.CookieFilter[]
+ ): Promise<void> {
+ await Promise.all(
+ cookieFilters.map(async filter => {
+ await this.#session.send('storage.deleteCookies', {
+ filter: filter,
+ partition: {
+ type: 'context',
+ context: this.id,
+ },
+ });
+ })
+ );
+ }
}