From 5d997ed28b41b86303010b6f95a2f868037b88bb Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Mon, 19 Oct 2020 14:35:18 -0700 Subject: [PATCH] fix(video): make video path available in persistent profiles (#4182) --- src/client/page.ts | 3 +++ src/dispatchers/pageDispatcher.ts | 1 + src/protocol/channels.ts | 1 + src/protocol/protocol.yml | 1 + src/server/browser.ts | 2 +- src/server/page.ts | 8 +++++++- test/screencast.spec.ts | 33 ++++++++++++------------------- 7 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/client/page.ts b/src/client/page.ts index a0e9b70dce..d35c20840b 100644 --- a/src/client/page.ts +++ b/src/client/page.ts @@ -237,6 +237,9 @@ export class Page extends ChannelOwner i // If we split pageCreated and pageReady, there should be no main frame during pageCreated. super(scope, page, 'Page', { mainFrame: FrameDispatcher.from(scope, page.mainFrame()), + videoRelativePath: page._video ? page._video._relativePath : undefined, viewportSize: page.viewportSize() || undefined, isClosed: page.isClosed() }); diff --git a/src/protocol/channels.ts b/src/protocol/channels.ts index 116963d11f..ce79d5171d 100644 --- a/src/protocol/channels.ts +++ b/src/protocol/channels.ts @@ -664,6 +664,7 @@ export type PageInitializer = { height: number, }, isClosed: boolean, + videoRelativePath?: string, }; export interface PageChannel extends Channel { on(event: 'bindingCall', callback: (params: PageBindingCallEvent) => void): this; diff --git a/src/protocol/protocol.yml b/src/protocol/protocol.yml index 7cb6ab2b0a..4e306bd725 100644 --- a/src/protocol/protocol.yml +++ b/src/protocol/protocol.yml @@ -585,6 +585,7 @@ Page: width: number height: number isClosed: boolean + videoRelativePath: string? commands: diff --git a/src/server/browser.ts b/src/server/browser.ts index 783e115982..76f4e1fc3d 100644 --- a/src/server/browser.ts +++ b/src/server/browser.ts @@ -92,7 +92,7 @@ export abstract class Browser extends EventEmitter { context.emit(BrowserContext.Events.VideoStarted, video); pageOrError.then(pageOrError => { if (pageOrError instanceof Page) - pageOrError.emit(Page.Events.VideoStarted, video); + pageOrError.videoStarted(video); }); } diff --git a/src/server/page.ts b/src/server/page.ts index 64f831d773..42a95c8fcd 100644 --- a/src/server/page.ts +++ b/src/server/page.ts @@ -23,7 +23,7 @@ import * as network from './network'; import { Screenshotter } from './screenshotter'; import { TimeoutSettings } from '../utils/timeoutSettings'; import * as types from './types'; -import { BrowserContext } from './browserContext'; +import { BrowserContext, Video } from './browserContext'; import { ConsoleMessage } from './console'; import * as accessibility from './accessibility'; import { EventEmitter } from 'events'; @@ -143,6 +143,7 @@ export class Page extends EventEmitter { private _requestInterceptor?: network.RouteHandler; _ownedContext: BrowserContext | undefined; readonly selectors: Selectors; + _video: Video | null = null; constructor(delegate: PageDelegate, browserContext: BrowserContext) { super(); @@ -416,6 +417,11 @@ export class Page extends EventEmitter { async _setFileChooserIntercepted(enabled: boolean): Promise { await this._delegate.setFileChooserIntercepted(enabled); } + + videoStarted(video: Video) { + this._video = video; + this.emit(Page.Events.VideoStarted, video); + } } export class Worker extends EventEmitter { diff --git a/test/screencast.spec.ts b/test/screencast.spec.ts index 98b3a4c749..09cf1cde62 100644 --- a/test/screencast.spec.ts +++ b/test/screencast.spec.ts @@ -128,11 +128,6 @@ function expectAll(pixels: Buffer, rgbaPredicate) { } } -function findVideo(videoDir: string) { - const files = fs.readdirSync(videoDir); - return path.join(videoDir, files.find(file => file.endsWith('webm'))); -} - function findVideos(videoDir: string) { const files = fs.readdirSync(videoDir); return files.filter(file => file.endsWith('webm')).map(file => path.join(videoDir, file)); @@ -146,11 +141,9 @@ describe('screencast', suite => { expect(error.message).toContain('"videoSize" option requires "videosPath" to be specified'); }); - it('should capture static page', (test, { browserName }) => { - test.fixme(browserName === 'firefox', 'Always clips to square'); - }, async ({browser, testInfo}) => { + it('should capture static page', async ({browser, testInfo}) => { const videosPath = testInfo.outputPath(''); - const size = { width: 320, height: 240 }; + const size = { width: 450, height: 240 }; const context = await browser.newContext({ videosPath, viewport: size, @@ -162,12 +155,12 @@ describe('screencast', suite => { await new Promise(r => setTimeout(r, 1000)); await context.close(); - const videoFile = findVideo(videosPath); + const videoFile = await page.video().path(); const videoPlayer = new VideoPlayer(videoFile); const duration = videoPlayer.duration; expect(duration).toBeGreaterThan(0); - expect(videoPlayer.videoWidth).toBe(320); + expect(videoPlayer.videoWidth).toBe(450); expect(videoPlayer.videoHeight).toBe(240); { @@ -175,7 +168,7 @@ describe('screencast', suite => { expectAll(pixels, almostRed); } { - const pixels = videoPlayer.seekLastFrame({ x: 300, y: 0}).data; + const pixels = videoPlayer.seekLastFrame({ x: 430, y: 0}).data; expectAll(pixels, almostRed); } }); @@ -244,7 +237,7 @@ describe('screencast', suite => { await new Promise(r => setTimeout(r, 1000)); await context.close(); - const videoFile = findVideo(videosPath); + const videoFile = await page.video().path(); const videoPlayer = new VideoPlayer(videoFile); const duration = videoPlayer.duration; expect(duration).toBeGreaterThan(0); @@ -277,7 +270,7 @@ describe('screencast', suite => { await new Promise(r => setTimeout(r, 1000)); await context.close(); - const videoFile = findVideo(videosPath); + const videoFile = await page.video().path(); const videoPlayer = new VideoPlayer(videoFile); const duration = videoPlayer.duration; expect(duration).toBeGreaterThan(0); @@ -332,7 +325,7 @@ describe('screencast', suite => { await new Promise(r => setTimeout(r, 1000)); await context.close(); - const videoFile = findVideo(videosPath); + const videoFile = await page.video().path(); const videoPlayer = new VideoPlayer(videoFile); const duration = videoPlayer.duration; expect(duration).toBeGreaterThan(0); @@ -363,11 +356,11 @@ describe('screencast', suite => { viewport: size, }); - await context.newPage(); + const page = await context.newPage(); await new Promise(r => setTimeout(r, 1000)); await context.close(); - const videoFile = findVideo(videosPath); + const videoFile = await page.video().path(); const videoPlayer = new VideoPlayer(videoFile); expect(await videoPlayer.videoWidth).toBe(size.width); expect(await videoPlayer.videoHeight).toBe(size.height); @@ -379,11 +372,11 @@ describe('screencast', suite => { videosPath, }); - await context.newPage(); + const page = await context.newPage(); await new Promise(r => setTimeout(r, 1000)); await context.close(); - const videoFile = findVideo(videosPath); + const videoFile = await page.video().path(); const videoPlayer = new VideoPlayer(videoFile); expect(await videoPlayer.videoWidth).toBe(1280); expect(await videoPlayer.videoHeight).toBe(720); @@ -402,7 +395,7 @@ describe('screencast', suite => { await new Promise(r => setTimeout(r, 1000)); await context.close(); - const videoFile = findVideo(videosPath); + const videoFile = await page.video().path(); const videoPlayer = new VideoPlayer(videoFile); const duration = videoPlayer.duration; expect(duration).toBeGreaterThan(0);