Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 4 additions & 36 deletions docs/src/api/class-browsercontext.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,39 +63,10 @@ await context.CloseAsync();

## event: BrowserContext.backgroundPage
* since: v1.11
* deprecated: Background pages have been removed from Chromium together with Manifest V2 extensions.
- argument: <[Page]>

:::note
Only works with Chromium browser's persistent context.
:::

Emitted when new background page is created in the context.

```java
context.onBackgroundPage(backgroundPage -> {
System.out.println(backgroundPage.url());
});
```

```js
const backgroundPage = await context.waitForEvent('backgroundpage');
```

```python async
background_page = await context.wait_for_event("backgroundpage")
```

```python sync
background_page = context.wait_for_event("backgroundpage")
```

```csharp
context.BackgroundPage += (_, backgroundPage) =>
{
Console.WriteLine(backgroundPage.Url);
};

```
This event is not emitted.

## property: BrowserContext.clock
* since: v1.45
Expand Down Expand Up @@ -456,13 +427,10 @@ Script to be evaluated in all pages in the browser context. Optional.

## method: BrowserContext.backgroundPages
* since: v1.11
* deprecated: Background pages have been removed from Chromium together with Manifest V2 extensions.
- returns: <[Array]<[Page]>>

:::note
Background pages are only supported on Chromium-based browsers.
:::

All existing background pages in the context.
Returns an empty list.

## method: BrowserContext.browser
* since: v1.8
Expand Down
41 changes: 6 additions & 35 deletions packages/playwright-client/types/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8199,14 +8199,7 @@ export interface BrowserContext {
behavior?: 'wait'|'ignoreErrors'|'default'
}): Promise<void>;
/**
* **NOTE** Only works with Chromium browser's persistent context.
*
* Emitted when new background page is created in the context.
*
* ```js
* const backgroundPage = await context.waitForEvent('backgroundpage');
* ```
*
* This event is not emitted.
*/
on(event: 'backgroundpage', listener: (page: Page) => any): this;

Expand Down Expand Up @@ -8398,14 +8391,7 @@ export interface BrowserContext {
once(event: 'weberror', listener: (webError: WebError) => any): this;

/**
* **NOTE** Only works with Chromium browser's persistent context.
*
* Emitted when new background page is created in the context.
*
* ```js
* const backgroundPage = await context.waitForEvent('backgroundpage');
* ```
*
* This event is not emitted.
*/
addListener(event: 'backgroundpage', listener: (page: Page) => any): this;

Expand Down Expand Up @@ -8652,14 +8638,7 @@ export interface BrowserContext {
off(event: 'weberror', listener: (webError: WebError) => any): this;

/**
* **NOTE** Only works with Chromium browser's persistent context.
*
* Emitted when new background page is created in the context.
*
* ```js
* const backgroundPage = await context.waitForEvent('backgroundpage');
* ```
*
* This event is not emitted.
*/
prependListener(event: 'backgroundpage', listener: (page: Page) => any): this;

Expand Down Expand Up @@ -8858,9 +8837,8 @@ export interface BrowserContext {
}>): Promise<void>;

/**
* **NOTE** Background pages are only supported on Chromium-based browsers.
*
* All existing background pages in the context.
* Returns an empty list.
* @deprecated Background pages have been removed from Chromium together with Manifest V2 extensions.
*/
backgroundPages(): Array<Page>;

Expand Down Expand Up @@ -9377,14 +9355,7 @@ export interface BrowserContext {
}): Promise<void>;

/**
* **NOTE** Only works with Chromium browser's persistent context.
*
* Emitted when new background page is created in the context.
*
* ```js
* const backgroundPage = await context.waitForEvent('backgroundpage');
* ```
*
* This event is not emitted.
*/
waitForEvent(event: 'backgroundpage', optionsOrPredicate?: { predicate?: (page: Page) => boolean | Promise<boolean>, timeout?: number } | ((page: Page) => boolean | Promise<boolean>)): Promise<Page>;

Expand Down
8 changes: 1 addition & 7 deletions packages/playwright-core/src/client/browserContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ export class BrowserContext extends ChannelOwner<channels.BrowserContextChannel>
readonly tracing: Tracing;
readonly clock: Clock;

readonly _backgroundPages = new Set<Page>();
readonly _serviceWorkers = new Set<Worker>();
private _harRecorders = new Map<string, { path: string, content: 'embed' | 'attach' | 'omit' | undefined }>();
_closingStatus: 'none' | 'closing' | 'closed' = 'none';
Expand Down Expand Up @@ -102,11 +101,6 @@ export class BrowserContext extends ChannelOwner<channels.BrowserContextChannel>
this._channel.on('page', ({ page }) => this._onPage(Page.from(page)));
this._channel.on('route', ({ route }) => this._onRoute(network.Route.from(route)));
this._channel.on('webSocketRoute', ({ webSocketRoute }) => this._onWebSocketRoute(network.WebSocketRoute.from(webSocketRoute)));
this._channel.on('backgroundPage', ({ page }) => {
const backgroundPage = Page.from(page);
this._backgroundPages.add(backgroundPage);
this.emit(Events.BrowserContext.BackgroundPage, backgroundPage);
});
this._channel.on('serviceWorker', ({ worker }) => {
const serviceWorker = Worker.from(worker);
serviceWorker._context = this;
Expand Down Expand Up @@ -456,7 +450,7 @@ export class BrowserContext extends ChannelOwner<channels.BrowserContextChannel>
}

backgroundPages(): Page[] {
return [...this._backgroundPages];
return [];
}

serviceWorkers(): Worker[] {
Expand Down
2 changes: 1 addition & 1 deletion packages/playwright-core/src/client/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export const Events = {
// Can't use just 'error' due to node.js special treatment of error events.
// @see https://nodejs.org/api/events.html#events_error_events
WebError: 'weberror',
BackgroundPage: 'backgroundpage',
BackgroundPage: 'backgroundpage', // Deprecated in v1.56, never emitted anymore.
ServiceWorker: 'serviceworker',
Request: 'request',
Response: 'response',
Expand Down
1 change: 0 additions & 1 deletion packages/playwright-core/src/client/page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,6 @@ export class Page extends ChannelOwner<channels.PageChannel> implements api.Page
_onClose() {
this._closed = true;
this._browserContext._pages.delete(this);
this._browserContext._backgroundPages.delete(this);
this._disposeHarRouters();
this.emit(Events.Page.Close, this);
}
Expand Down
3 changes: 0 additions & 3 deletions packages/playwright-core/src/protocol/validator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -963,9 +963,6 @@ scheme.BrowserContextWebSocketRouteEvent = tObject({
scheme.BrowserContextVideoEvent = tObject({
artifact: tChannel(['Artifact']),
});
scheme.BrowserContextBackgroundPageEvent = tObject({
page: tChannel(['Page']),
});
scheme.BrowserContextServiceWorkerEvent = tObject({
worker: tChannel(['Worker']),
});
Expand Down
37 changes: 1 addition & 36 deletions packages/playwright-core/src/server/chromium/crBrowser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ export class CRBrowser extends Browser {
private _clientRootSessionPromise: Promise<CDPSession> | null = null;
readonly _contexts = new Map<string, CRBrowserContext>();
_crPages = new Map<string, CRPage>();
_backgroundPages = new Map<string, CRPage>();
_serviceWorkers = new Map<string, CRServiceWorker>();
_devtools?: CRDevTools;
private _version = '';
Expand Down Expand Up @@ -176,18 +175,11 @@ export class CRBrowser extends Browser {
}

assert(!this._crPages.has(targetInfo.targetId), 'Duplicate target ' + targetInfo.targetId);
assert(!this._backgroundPages.has(targetInfo.targetId), 'Duplicate target ' + targetInfo.targetId);
assert(!this._serviceWorkers.has(targetInfo.targetId), 'Duplicate target ' + targetInfo.targetId);

if (targetInfo.type === 'background_page') {
const backgroundPage = new CRPage(session, targetInfo.targetId, context, null, { hasUIWindow: false, isBackgroundPage: true });
this._backgroundPages.set(targetInfo.targetId, backgroundPage);
return;
}

if (targetInfo.type === 'page' || treatOtherAsPage) {
const opener = targetInfo.openerId ? this._crPages.get(targetInfo.openerId) || null : null;
const crPage = new CRPage(session, targetInfo.targetId, context, opener, { hasUIWindow: targetInfo.type === 'page', isBackgroundPage: false });
const crPage = new CRPage(session, targetInfo.targetId, context, opener, { hasUIWindow: targetInfo.type === 'page' });
this._crPages.set(targetInfo.targetId, crPage);
return;
}
Expand Down Expand Up @@ -215,12 +207,6 @@ export class CRBrowser extends Browser {
crPage.didClose();
return;
}
const backgroundPage = this._backgroundPages.get(targetId);
if (backgroundPage) {
this._backgroundPages.delete(targetId);
backgroundPage.didClose();
return;
}
const serviceWorker = this._serviceWorkers.get(targetId);
if (serviceWorker) {
this._serviceWorkers.delete(targetId);
Expand All @@ -233,9 +219,6 @@ export class CRBrowser extends Browser {
for (const crPage of this._crPages.values())
crPage.didClose();
this._crPages.clear();
for (const backgroundPage of this._backgroundPages.values())
backgroundPage.didClose();
this._backgroundPages.clear();
for (const serviceWorker of this._serviceWorkers.values())
serviceWorker.didClose();
this._serviceWorkers.clear();
Expand Down Expand Up @@ -337,7 +320,6 @@ export class CRBrowser extends Browser {

export class CRBrowserContext extends BrowserContext {
static CREvents = {
BackgroundPage: 'backgroundpage',
ServiceWorker: 'serviceworker',
};

Expand Down Expand Up @@ -566,14 +548,6 @@ export class CRBrowserContext extends BrowserContext {
}

onClosePersistent() {
// When persistent context is closed, we do not necessary get Target.detachedFromTarget
// for all the background pages.
for (const [targetId, backgroundPage] of this._browser._backgroundPages.entries()) {
if (backgroundPage._browserContext === this && backgroundPage._page.initializedOrUndefined()) {
backgroundPage.didClose();
this._browser._backgroundPages.delete(targetId);
}
}
}

override async clearCache(): Promise<void> {
Expand All @@ -591,15 +565,6 @@ export class CRBrowserContext extends BrowserContext {
});
}

backgroundPages(): Page[] {
const result: Page[] = [];
for (const backgroundPage of this._browser._backgroundPages.values()) {
if (backgroundPage._browserContext === this && backgroundPage._page.initializedOrUndefined())
result.push(backgroundPage._page);
}
return result;
}

serviceWorkers(): Worker[] {
return Array.from(this._browser._serviceWorkers.values()).filter(serviceWorker => serviceWorker.browserContext === this);
}
Expand Down
10 changes: 3 additions & 7 deletions packages/playwright-core/src/server/chromium/crPage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ import { CRPDF } from './crPdf';
import { exceptionToError, releaseObject, toConsoleMessageLocation } from './crProtocolHelper';
import { platformToFontFamilies } from './defaultFontFamilies';
import { VideoRecorder } from './videoRecorder';
import { BrowserContext } from '../browserContext';
import { TargetClosedError } from '../errors';
import { isSessionClosedError } from '../protocolError';

Expand Down Expand Up @@ -68,7 +67,6 @@ export class CRPage implements PageDelegate {
private readonly _pdf: CRPDF;
private readonly _coverage: CRCoverage;
readonly _browserContext: CRBrowserContext;
private _isBackgroundPage: boolean;

// Holds window features for the next popup being opened via window.open,
// until the popup target arrives. This could be racy if two oopifs
Expand All @@ -82,10 +80,9 @@ export class CRPage implements PageDelegate {
return crPage._mainFrameSession;
}

constructor(client: CRSession, targetId: string, browserContext: CRBrowserContext, opener: CRPage | null, bits: { hasUIWindow: boolean, isBackgroundPage: boolean }) {
constructor(client: CRSession, targetId: string, browserContext: CRBrowserContext, opener: CRPage | null, bits: { hasUIWindow: boolean }) {
this._targetId = targetId;
this._opener = opener;
this._isBackgroundPage = bits.isBackgroundPage;
const dragManager = new DragManager(this);
this.rawKeyboard = new RawKeyboardImpl(client, browserContext._browser._platform() === 'mac', dragManager);
this.rawMouse = new RawMouseImpl(this, client, dragManager);
Expand Down Expand Up @@ -113,10 +110,9 @@ export class CRPage implements PageDelegate {
this._page.setEmulatedSizeFromWindowOpen({ viewport: viewportSize, screen: viewportSize });
}

const createdEvent = this._isBackgroundPage ? CRBrowserContext.CREvents.BackgroundPage : BrowserContext.Events.Page;
this._mainFrameSession._initialize(bits.hasUIWindow).then(
() => this._page.reportAsNew(this._opener?._page, undefined, createdEvent),
error => this._page.reportAsNew(this._opener?._page, error, createdEvent));
() => this._page.reportAsNew(this._opener?._page, undefined),
error => this._page.reportAsNew(this._opener?._page, error));
}

private async _forAllFrameSessions(cb: (frame: FrameSession) => Promise<any>) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,9 +137,6 @@ export class BrowserContextDispatcher extends Dispatcher<BrowserContext, channel
context.dialogManager.addDialogHandler(this._dialogHandler);

if (context._browser.options.name === 'chromium') {
for (const page of (context as CRBrowserContext).backgroundPages())
this._dispatchEvent('backgroundPage', { page: PageDispatcher.from(this, page) });
this.addObjectListener(CRBrowserContext.CREvents.BackgroundPage, page => this._dispatchEvent('backgroundPage', { page: PageDispatcher.from(this, page) }));
for (const serviceWorker of (context as CRBrowserContext).serviceWorkers())
this._dispatchEvent('serviceWorker', { worker: new WorkerDispatcher(this, serviceWorker) });
this.addObjectListener(CRBrowserContext.CREvents.ServiceWorker, serviceWorker => this._dispatchEvent('serviceWorker', { worker: new WorkerDispatcher(this, serviceWorker) }));
Expand Down
8 changes: 4 additions & 4 deletions packages/playwright-core/src/server/page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -191,16 +191,16 @@ export class Page extends SdkObject {
this.isStorageStatePage = browserContext.isCreatingStorageStatePage();
}

async reportAsNew(opener: Page | undefined, error: Error | undefined = undefined, contextEvent: string = BrowserContext.Events.Page) {
async reportAsNew(opener: Page | undefined, error?: Error) {
if (opener) {
const openerPageOrError = await opener.waitForInitializedOrError();
if (openerPageOrError instanceof Page && !openerPageOrError.isClosed())
this._opener = openerPageOrError;
}
this._markInitialized(error, contextEvent);
this._markInitialized(error);
}

private _markInitialized(error: Error | undefined = undefined, contextEvent: string = BrowserContext.Events.Page) {
private _markInitialized(error: Error | undefined = undefined) {
if (error) {
// Initialization error could have happened because of
// context/browser closure. Just ignore the page.
Expand All @@ -209,7 +209,7 @@ export class Page extends SdkObject {
this.frameManager.createDummyMainFrameIfNeeded();
}
this._initialized = error || this;
this.emitOnContext(contextEvent, this);
this.emitOnContext(BrowserContext.Events.Page, this);

for (const pageError of this._pageErrors)
this.emitOnContext(BrowserContext.Events.PageError, pageError, this);
Expand Down
Loading
Loading