mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
fix(bidi): do not report internal pages (#35865)
This commit is contained in:
parent
74aa1f0385
commit
83c5ee74da
@ -207,6 +207,7 @@ export class BidiBrowserContext extends BrowserContext {
|
||||
declare readonly _browser: BidiBrowser;
|
||||
private _initScriptIds: bidi.Script.PreloadScript[] = [];
|
||||
private _originToPermissions = new Map<string, string[]>();
|
||||
private _blockingPageCreations: Set<Promise<unknown>> = new Set();
|
||||
|
||||
constructor(browser: BidiBrowser, browserContextId: string | undefined, options: types.BrowserContextOptions) {
|
||||
super(browser, options, browserContextId);
|
||||
@ -265,12 +266,30 @@ export class BidiBrowserContext extends BrowserContext {
|
||||
return this._bidiPages().map(bidiPage => bidiPage._page);
|
||||
}
|
||||
|
||||
override async doCreateNewPage(): Promise<Page> {
|
||||
override async doCreateNewPage(markAsServerSideOnly?: boolean): Promise<Page> {
|
||||
const promise = this._createNewPageImpl(markAsServerSideOnly);
|
||||
if (markAsServerSideOnly)
|
||||
this._blockingPageCreations.add(promise);
|
||||
try {
|
||||
return await promise;
|
||||
} finally {
|
||||
this._blockingPageCreations.delete(promise);
|
||||
}
|
||||
}
|
||||
|
||||
private async _createNewPageImpl(markAsServerSideOnly?: boolean): Promise<Page> {
|
||||
const { context } = await this._browser._browserSession.send('browsingContext.create', {
|
||||
type: bidi.BrowsingContext.CreateType.Window,
|
||||
userContext: this._browserContextId,
|
||||
});
|
||||
return this._browser._bidiPages.get(context)!._page;
|
||||
const page = this._browser._bidiPages.get(context)!._page;
|
||||
if (markAsServerSideOnly)
|
||||
page.markAsServerSideOnly();
|
||||
return page;
|
||||
}
|
||||
|
||||
async waitForBlockingPageCreations() {
|
||||
await Promise.all([...this._blockingPageCreations].map(command => command.catch(() => {})));
|
||||
}
|
||||
|
||||
async doGetCookies(urls: string[]): Promise<channels.NetworkCookie[]> {
|
||||
|
||||
@ -93,6 +93,12 @@ export class BidiPage implements PageDelegate {
|
||||
await Promise.all([
|
||||
this.updateHttpCredentials(),
|
||||
this.updateRequestInterception(),
|
||||
// If the page is created by the Playwright client's call, some initialization
|
||||
// may be pending. Wait for it to complete before reporting the page as new.
|
||||
//
|
||||
// TODO: ideally we'd wait only for the commands that created this page, but currently
|
||||
// there is no way in Bidi to track which command created this page.
|
||||
this._browserContext.waitForBlockingPageCreations(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@ -267,7 +267,7 @@ export abstract class BrowserContext extends SdkObject {
|
||||
|
||||
// BrowserContext methods.
|
||||
abstract possiblyUninitializedPages(): Page[];
|
||||
abstract doCreateNewPage(): Promise<Page>;
|
||||
abstract doCreateNewPage(markAsServerSideOnly?: boolean): Promise<Page>;
|
||||
abstract addCookies(cookies: channels.SetNetworkCookie[]): Promise<void>;
|
||||
abstract setGeolocation(geolocation?: types.Geolocation): Promise<void>;
|
||||
abstract setExtraHTTPHeaders(headers: types.HeadersArray): Promise<void>;
|
||||
@ -495,9 +495,7 @@ export abstract class BrowserContext extends SdkObject {
|
||||
}
|
||||
|
||||
async newPage(metadata: CallMetadata): Promise<Page> {
|
||||
const page = await this.doCreateNewPage();
|
||||
if (metadata.isServerSide)
|
||||
page.markAsServerSideOnly();
|
||||
const page = await this.doCreateNewPage(metadata.isServerSide);
|
||||
const pageOrError = await page.waitForInitializedOrError();
|
||||
if (pageOrError instanceof Page) {
|
||||
if (pageOrError.isClosed())
|
||||
|
||||
@ -371,9 +371,12 @@ export class CRBrowserContext extends BrowserContext {
|
||||
return this._crPages().map(crPage => crPage._page);
|
||||
}
|
||||
|
||||
override async doCreateNewPage(): Promise<Page> {
|
||||
override async doCreateNewPage(markAsServerSideOnly?: boolean): Promise<Page> {
|
||||
const { targetId } = await this._browser._session.send('Target.createTarget', { url: 'about:blank', browserContextId: this._browserContextId });
|
||||
return this._browser._crPages.get(targetId)!._page;
|
||||
const page = this._browser._crPages.get(targetId)!._page;
|
||||
if (markAsServerSideOnly)
|
||||
page.markAsServerSideOnly();
|
||||
return page;
|
||||
}
|
||||
|
||||
async doGetCookies(urls: string[]): Promise<channels.NetworkCookie[]> {
|
||||
|
||||
@ -281,7 +281,7 @@ export class FFBrowserContext extends BrowserContext {
|
||||
return this._ffPages().map(ffPage => ffPage._page);
|
||||
}
|
||||
|
||||
override async doCreateNewPage(): Promise<Page> {
|
||||
override async doCreateNewPage(markAsServerSideOnly?: boolean): Promise<Page> {
|
||||
const { targetId } = await this._browser.session.send('Browser.newPage', {
|
||||
browserContextId: this._browserContextId
|
||||
}).catch(e => {
|
||||
@ -289,7 +289,11 @@ export class FFBrowserContext extends BrowserContext {
|
||||
throw new Error(`Invalid timezone ID: ${this._options.timezoneId}`);
|
||||
throw e;
|
||||
});
|
||||
return this._browser._ffPages.get(targetId)!._page;
|
||||
const page = this._browser._ffPages.get(targetId)!._page;
|
||||
if (markAsServerSideOnly)
|
||||
page.markAsServerSideOnly();
|
||||
return page;
|
||||
|
||||
}
|
||||
|
||||
async doGetCookies(urls: string[]): Promise<channels.NetworkCookie[]> {
|
||||
|
||||
@ -244,9 +244,12 @@ export class WKBrowserContext extends BrowserContext {
|
||||
return this._wkPages().map(wkPage => wkPage._page);
|
||||
}
|
||||
|
||||
override async doCreateNewPage(): Promise<Page> {
|
||||
override async doCreateNewPage(markAsServerSideOnly?: boolean): Promise<Page> {
|
||||
const { pageProxyId } = await this._browser._browserSession.send('Playwright.createPage', { browserContextId: this._browserContextId });
|
||||
return this._browser._wkPages.get(pageProxyId)!._page;
|
||||
const page = this._browser._wkPages.get(pageProxyId)!._page;
|
||||
if (markAsServerSideOnly)
|
||||
page.markAsServerSideOnly();
|
||||
return page;
|
||||
}
|
||||
|
||||
async doGetCookies(urls: string[]): Promise<channels.NetworkCookie[]> {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user