Skip to content

Commit bf1f743

Browse files
authored
fix(api): migrate Screencast from events to onFrame callback (#39714)
1 parent 1f71066 commit bf1f743

File tree

6 files changed

+64
-295
lines changed

6 files changed

+64
-295
lines changed

docs/src/api/class-screencast.md

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,28 @@
44

55
Interface for capturing screencast frames from a page.
66

7-
## event: Screencast.screencastFrame
7+
## async method: Screencast.start
88
* since: v1.59
9-
- argument: <[Object]>
10-
- `data` <[Buffer]> JPEG-encoded frame data.
9+
- returns: <[Disposable]>
1110

12-
Emitted for each captured JPEG screencast frame while the screencast is running.
11+
Starts capturing screencast frames.
1312

1413
**Usage**
1514

1615
```js
17-
const screencast = page.screencast;
18-
screencast.on('screencastframe', ({ data, width, height }) => {
19-
console.log(`frame ${width}x${height}, jpeg size: ${data.length}`);
20-
require('fs').writeFileSync('frame.jpg', data);
21-
});
22-
await screencast.start({ maxSize: { width: 1200, height: 800 } });
16+
await page.screencast.start(buffer => {
17+
console.log(`frame size: ${buffer.length}`);
18+
}, { maxSize: { width: 800, height: 600 } });
2319
// ... perform actions ...
24-
await screencast.stop();
20+
await page.screencast.stop();
2521
```
2622

27-
## async method: Screencast.start
23+
### param: Screencast.start.onFrame
2824
* since: v1.59
29-
- returns: <[Disposable]>
30-
31-
Starts capturing screencast frames. Frames are emitted as [`event: Screencast.screencastFrame`] events.
32-
33-
**Usage**
25+
* langs: js
26+
- `onFrame` <[function]\([Buffer]\): [Promise<any>|any]>
3427

35-
```js
36-
const screencast = page.screencast;
37-
screencast.on('screencastframe', ({ data, width, height }) => {
38-
console.log(`frame ${width}x${height}, size: ${data.length}`);
39-
});
40-
await screencast.start({ maxSize: { width: 800, height: 600 } });
41-
// ... perform actions ...
42-
await screencast.stop();
43-
```
28+
Callback that receives JPEG-encoded frame data.
4429

4530
### option: Screencast.start.maxSize
4631
* since: v1.59
@@ -50,6 +35,7 @@ await screencast.stop();
5035

5136
Maximum screencast frame dimensions. The output frame may be smaller to preserve the page aspect ratio. Defaults to 800×800.
5237

38+
5339
## async method: Screencast.stop
5440
* since: v1.59
5541

@@ -58,7 +44,7 @@ Stops the screencast started with [`method: Screencast.start`].
5844
**Usage**
5945

6046
```js
61-
await screencast.start();
47+
await screencast.start(buffer => { /* handle frame */ });
6248
// ... perform actions ...
6349
await screencast.stop();
6450
```

packages/playwright-client/types/types.d.ts

Lines changed: 9 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -21644,127 +21644,22 @@ export interface Route {
2164421644
*/
2164521645
export interface Screencast {
2164621646
/**
21647-
* Emitted for each captured JPEG screencast frame while the screencast is running.
21647+
* Starts capturing screencast frames.
2164821648
*
2164921649
* **Usage**
2165021650
*
2165121651
* ```js
21652-
* const screencast = page.screencast;
21653-
* screencast.on('screencastframe', ({ data, width, height }) => {
21654-
* console.log(`frame ${width}x${height}, jpeg size: ${data.length}`);
21655-
* require('fs').writeFileSync('frame.jpg', data);
21656-
* });
21657-
* await screencast.start({ maxSize: { width: 1200, height: 800 } });
21658-
* // ... perform actions ...
21659-
* await screencast.stop();
21660-
* ```
21661-
*
21662-
*/
21663-
on(event: 'screencastframe', listener: (data: {
21664-
/**
21665-
* JPEG-encoded frame data.
21666-
*/
21667-
data: Buffer;
21668-
}) => any): this;
21669-
21670-
/**
21671-
* Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event.
21672-
*/
21673-
once(event: 'screencastframe', listener: (data: {
21674-
/**
21675-
* JPEG-encoded frame data.
21676-
*/
21677-
data: Buffer;
21678-
}) => any): this;
21679-
21680-
/**
21681-
* Emitted for each captured JPEG screencast frame while the screencast is running.
21682-
*
21683-
* **Usage**
21684-
*
21685-
* ```js
21686-
* const screencast = page.screencast;
21687-
* screencast.on('screencastframe', ({ data, width, height }) => {
21688-
* console.log(`frame ${width}x${height}, jpeg size: ${data.length}`);
21689-
* require('fs').writeFileSync('frame.jpg', data);
21690-
* });
21691-
* await screencast.start({ maxSize: { width: 1200, height: 800 } });
21652+
* await page.screencast.start(buffer => {
21653+
* console.log(`frame size: ${buffer.length}`);
21654+
* }, { maxSize: { width: 800, height: 600 } });
2169221655
* // ... perform actions ...
21693-
* await screencast.stop();
21694-
* ```
21695-
*
21696-
*/
21697-
addListener(event: 'screencastframe', listener: (data: {
21698-
/**
21699-
* JPEG-encoded frame data.
21700-
*/
21701-
data: Buffer;
21702-
}) => any): this;
21703-
21704-
/**
21705-
* Removes an event listener added by `on` or `addListener`.
21706-
*/
21707-
removeListener(event: 'screencastframe', listener: (data: {
21708-
/**
21709-
* JPEG-encoded frame data.
21710-
*/
21711-
data: Buffer;
21712-
}) => any): this;
21713-
21714-
/**
21715-
* Removes an event listener added by `on` or `addListener`.
21716-
*/
21717-
off(event: 'screencastframe', listener: (data: {
21718-
/**
21719-
* JPEG-encoded frame data.
21720-
*/
21721-
data: Buffer;
21722-
}) => any): this;
21723-
21724-
/**
21725-
* Emitted for each captured JPEG screencast frame while the screencast is running.
21726-
*
21727-
* **Usage**
21728-
*
21729-
* ```js
21730-
* const screencast = page.screencast;
21731-
* screencast.on('screencastframe', ({ data, width, height }) => {
21732-
* console.log(`frame ${width}x${height}, jpeg size: ${data.length}`);
21733-
* require('fs').writeFileSync('frame.jpg', data);
21734-
* });
21735-
* await screencast.start({ maxSize: { width: 1200, height: 800 } });
21736-
* // ... perform actions ...
21737-
* await screencast.stop();
21738-
* ```
21739-
*
21740-
*/
21741-
prependListener(event: 'screencastframe', listener: (data: {
21742-
/**
21743-
* JPEG-encoded frame data.
21744-
*/
21745-
data: Buffer;
21746-
}) => any): this;
21747-
21748-
/**
21749-
* Starts capturing screencast frames. Frames are emitted as
21750-
* [screencast.on('screencastframe')](https://playwright.dev/docs/api/class-screencast#screencast-event-screencast-frame)
21751-
* events.
21752-
*
21753-
* **Usage**
21754-
*
21755-
* ```js
21756-
* const screencast = page.screencast;
21757-
* screencast.on('screencastframe', ({ data, width, height }) => {
21758-
* console.log(`frame ${width}x${height}, size: ${data.length}`);
21759-
* });
21760-
* await screencast.start({ maxSize: { width: 800, height: 600 } });
21761-
* // ... perform actions ...
21762-
* await screencast.stop();
21656+
* await page.screencast.stop();
2176321657
* ```
2176421658
*
21659+
* @param onFrame Callback that receives JPEG-encoded frame data.
2176521660
* @param options
2176621661
*/
21767-
start(options?: {
21662+
start(onFrame: ((buffer: Buffer) => Promise<any>|any), options?: {
2176821663
/**
2176921664
* Maximum screencast frame dimensions. The output frame may be smaller to preserve the page aspect ratio. Defaults to
2177021665
* 800×800.
@@ -21784,12 +21679,12 @@ export interface Screencast {
2178421679

2178521680
/**
2178621681
* Stops the screencast started with
21787-
* [screencast.start([options])](https://playwright.dev/docs/api/class-screencast#screencast-start).
21682+
* [screencast.start(onFrame[, options])](https://playwright.dev/docs/api/class-screencast#screencast-start).
2178821683
*
2178921684
* **Usage**
2179021685
*
2179121686
* ```js
21792-
* await screencast.start();
21687+
* await screencast.start(buffer => { /* handle frame *\/ });
2179321688
* // ... perform actions ...
2179421689
* await screencast.stop();
2179521690
* ```

packages/playwright-core/src/client/screencast.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,29 @@
1515
*/
1616

1717
import { DisposableStub } from './disposable';
18-
import { EventEmitter } from './eventEmitter';
1918

2019
import type * as api from '../../types/types';
2120
import type { Page } from './page';
2221

23-
export class Screencast extends EventEmitter implements api.Screencast {
22+
export class Screencast implements api.Screencast {
2423
private readonly _page: Page;
24+
private _onFrame: ((buffer: Buffer) => any) | null = null;
2525

2626
constructor(page: Page) {
27-
super(page._platform);
2827
this._page = page;
29-
this._page._channel.on('screencastFrame', ({ data }) => this.emit('screencastframe', { data }));
28+
this._page._channel.on('screencastFrame', ({ data }) => {
29+
this._onFrame?.(data);
30+
});
3031
}
3132

32-
async start(options: { maxSize?: { width: number, height: number } } = {}) {
33+
async start(onFrame: (buffer: Buffer) => any, options: { maxSize?: { width: number, height: number } } = {}): Promise<DisposableStub> {
34+
this._onFrame = onFrame;
3335
await this._page._channel.startScreencast(options);
3436
return new DisposableStub(() => this.stop());
3537
}
3638

3739
async stop(): Promise<void> {
40+
this._onFrame = null;
3841
await this._page._channel.stopScreencast();
3942
}
4043
}

packages/playwright-core/src/tools/dashboard/dashboardController.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,13 @@ export class DashboardConnection implements Transport, DashboardChannel {
199199
if (frame === page.mainFrame())
200200
this._sendTabList();
201201
}),
202-
eventsHelper.addEventListener(page.screencast, 'screencastframe', ({ data }) => this._writeFrame(data, page.viewportSize()?.width ?? 0, page.viewportSize()?.height ?? 0))
203202
);
204203

205204
const maxSize = { width: 1280, height: 800 };
206-
await page.screencast.start({ maxSize });
205+
await page.screencast.start(
206+
data => this._writeFrame(data, page.viewportSize()?.width ?? 0, page.viewportSize()?.height ?? 0),
207+
{ maxSize },
208+
);
207209
}
208210

209211
private _deselectPage() {

0 commit comments

Comments
 (0)