Date: Tue, 17 Sep 2024 11:14:15 -0700
Subject: [PATCH 03/10] fix(trace-viewer): time delta between local and remote
actions (#32661)
---
packages/trace-viewer/src/ui/modelUtil.ts | 2 +-
tests/assets/trace-remote-time-diff.zip | Bin 0 -> 9102 bytes
tests/library/trace-viewer.spec.ts | 6 ++++++
3 files changed, 7 insertions(+), 1 deletion(-)
create mode 100644 tests/assets/trace-remote-time-diff.zip
diff --git a/packages/trace-viewer/src/ui/modelUtil.ts b/packages/trace-viewer/src/ui/modelUtil.ts
index a544d4dc3f..098b387c8f 100644
--- a/packages/trace-viewer/src/ui/modelUtil.ts
+++ b/packages/trace-viewer/src/ui/modelUtil.ts
@@ -312,7 +312,7 @@ function monotonicTimeDeltaBetweenLibraryAndRunner(nonPrimaryContexts: ContextEn
for (const action of context.actions) {
if (!action.startTime)
continue;
- const key = matchByStepId ? action.stepId! : `${action.apiName}@${(action as any).wallTime}`;
+ const key = matchByStepId ? action.callId! : `${action.apiName}@${(action as any).wallTime}`;
const libraryAction = libraryActions.get(key);
if (libraryAction)
return action.startTime - libraryAction.startTime;
diff --git a/tests/assets/trace-remote-time-diff.zip b/tests/assets/trace-remote-time-diff.zip
new file mode 100644
index 0000000000000000000000000000000000000000..e7d7c54c35c8cf883f7536464f1cebb52f110a06
GIT binary patch
literal 9102
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
U6!gD71o6*!`DYFw|JUw+0NpDkNdN!<
literal 0
HcmV?d00001
diff --git a/tests/library/trace-viewer.spec.ts b/tests/library/trace-viewer.spec.ts
index 2b00949b19..44c1258eb7 100644
--- a/tests/library/trace-viewer.spec.ts
+++ b/tests/library/trace-viewer.spec.ts
@@ -127,6 +127,12 @@ test('should complain about newer version of trace in old viewer', async ({ show
await expect(traceViewer.page.getByText('The trace was created by a newer version of Playwright and is not supported by this version of the viewer.')).toBeVisible();
});
+test('should properly synchronize local and remote time', async ({ showTraceViewer, asset }, testInfo) => {
+ const traceViewer = await showTraceViewer([asset('trace-remote-time-diff.zip')]);
+ // The total duration should be sub 10s, rather than 16h.
+ await expect(traceViewer.page.locator('.timeline-time').last()).toHaveText('8.5s');
+});
+
test('should contain action info', async ({ showTraceViewer }) => {
const traceViewer = await showTraceViewer([traceFile]);
await traceViewer.selectAction('locator.click');
From 375a1c49821bd47116d73baed0bf14fd757e684e Mon Sep 17 00:00:00 2001
From: Yury Semikhatsky
Date: Tue, 17 Sep 2024 15:37:42 -0700
Subject: [PATCH 04/10] chore: exposeBinding/exposeFunction in bidi (#32669)
---
.../src/server/bidi/bidiConnection.ts | 2 +-
.../src/server/bidi/bidiExecutionContext.ts | 2 +-
.../src/server/bidi/bidiPage.ts | 49 ++++++++++++++++++-
3 files changed, 50 insertions(+), 3 deletions(-)
diff --git a/packages/playwright-core/src/server/bidi/bidiConnection.ts b/packages/playwright-core/src/server/bidi/bidiConnection.ts
index 7138f2e06a..f348815940 100644
--- a/packages/playwright-core/src/server/bidi/bidiConnection.ts
+++ b/packages/playwright-core/src/server/bidi/bidiConnection.ts
@@ -72,7 +72,7 @@ export class BidiConnection {
let context;
if ('context' in object.params)
context = object.params.context;
- else if (object.method === 'log.entryAdded')
+ else if (object.method === 'log.entryAdded' || object.method === 'script.message')
context = object.params.source?.context;
if (context) {
const session = this._browsingContextToSession.get(context);
diff --git a/packages/playwright-core/src/server/bidi/bidiExecutionContext.ts b/packages/playwright-core/src/server/bidi/bidiExecutionContext.ts
index eaacb629e6..c037ba44b4 100644
--- a/packages/playwright-core/src/server/bidi/bidiExecutionContext.ts
+++ b/packages/playwright-core/src/server/bidi/bidiExecutionContext.ts
@@ -23,7 +23,7 @@ import { BidiSerializer } from './third_party/bidiSerializer';
export class BidiExecutionContext implements js.ExecutionContextDelegate {
private readonly _session: BidiSession;
- private readonly _target: bidi.Script.Target;
+ readonly _target: bidi.Script.Target;
constructor(session: BidiSession, realmInfo: bidi.Script.RealmInfo) {
this._session = session;
diff --git a/packages/playwright-core/src/server/bidi/bidiPage.ts b/packages/playwright-core/src/server/bidi/bidiPage.ts
index c2d499bd67..5ce5234185 100644
--- a/packages/playwright-core/src/server/bidi/bidiPage.ts
+++ b/packages/playwright-core/src/server/bidi/bidiPage.ts
@@ -21,7 +21,8 @@ import type * as accessibility from '../accessibility';
import * as dom from '../dom';
import * as dialog from '../dialog';
import type * as frames from '../frames';
-import { type InitScript, Page, type PageDelegate } from '../page';
+import { Page } from '../page';
+import type { InitScript, PageDelegate } from '../page';
import type { Progress } from '../progress';
import type * as types from '../types';
import type { BidiBrowserContext } from './bidiBrowser';
@@ -33,6 +34,7 @@ import { BidiNetworkManager } from './bidiNetworkManager';
import { BrowserContext } from '../browserContext';
const UTILITY_WORLD_NAME = '__playwright_utility_world__';
+const kPlaywrightBindingChannel = 'playwrightChannel';
export class BidiPage implements PageDelegate {
readonly rawMouse: RawMouseImpl;
@@ -62,6 +64,7 @@ export class BidiPage implements PageDelegate {
this._page.on(Page.Events.FrameDetached, (frame: frames.Frame) => this._removeContextsForFrame(frame, false));
this._sessionListeners = [
eventsHelper.addEventListener(bidiSession, 'script.realmCreated', this._onRealmCreated.bind(this)),
+ eventsHelper.addEventListener(bidiSession, 'script.message', this._onScriptMessage.bind(this)),
eventsHelper.addEventListener(bidiSession, 'browsingContext.contextDestroyed', this._onBrowsingContextDestroyed.bind(this)),
eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationStarted', this._onNavigationStarted.bind(this)),
eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationAborted', this._onNavigationAborted.bind(this)),
@@ -93,6 +96,7 @@ export class BidiPage implements PageDelegate {
this.updateHttpCredentials(),
this.updateRequestInterception(),
this._updateViewport(),
+ this._installMainBinding(),
this._addAllInitScripts(),
]);
}
@@ -327,6 +331,45 @@ export class BidiPage implements PageDelegate {
throw new Error('Method not implemented.');
}
+ // TODO: consider calling this only when bindings are added.
+ private async _installMainBinding() {
+ const functionDeclaration = addMainBinding.toString();
+ const args: bidi.Script.ChannelValue[] = [{
+ type: 'channel',
+ value: {
+ channel: kPlaywrightBindingChannel,
+ ownership: bidi.Script.ResultOwnership.Root,
+ }
+ }];
+ const promises = [];
+ promises.push(this._session.send('script.addPreloadScript', {
+ functionDeclaration,
+ arguments: args,
+ }));
+ promises.push(this._session.send('script.callFunction', {
+ functionDeclaration,
+ arguments: args,
+ target: toBidiExecutionContext(await this._page.mainFrame()._mainContext())._target,
+ awaitPromise: false,
+ userActivation: false,
+ }));
+ await Promise.all(promises);
+ }
+
+ private async _onScriptMessage(event: bidi.Script.MessageParameters) {
+ if (event.channel !== kPlaywrightBindingChannel)
+ return;
+ const pageOrError = await this.pageOrError();
+ if (pageOrError instanceof Error)
+ return;
+ const context = this._realmToContext.get(event.source.realm);
+ if (!context)
+ return;
+ if (event.data.type !== 'string')
+ return;
+ await this._page._onBindingCalled(event.data.value, context);
+ }
+
async addInitScript(initScript: InitScript): Promise {
const { script } = await this._session.send('script.addPreloadScript', {
// TODO: remove function call from the source.
@@ -522,6 +565,10 @@ export class BidiPage implements PageDelegate {
}
}
+function addMainBinding(callback: (arg: any) => void) {
+ (globalThis as any)['__playwright__binding__'] = callback;
+}
+
function toBidiExecutionContext(executionContext: dom.FrameExecutionContext): BidiExecutionContext {
return (executionContext as any)[contextDelegateSymbol] as BidiExecutionContext;
}
From 8b84b20dd03470318f0d623b280ed7ad9a90c966 Mon Sep 17 00:00:00 2001
From: Yury Semikhatsky
Date: Tue, 17 Sep 2024 16:02:13 -0700
Subject: [PATCH 05/10] chore: back-forward in bidi (#32670)
---
.../playwright-core/src/server/bidi/bidiPage.ts | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/packages/playwright-core/src/server/bidi/bidiPage.ts b/packages/playwright-core/src/server/bidi/bidiPage.ts
index 5ce5234185..2f2e09441f 100644
--- a/packages/playwright-core/src/server/bidi/bidiPage.ts
+++ b/packages/playwright-core/src/server/bidi/bidiPage.ts
@@ -319,12 +319,18 @@ export class BidiPage implements PageDelegate {
});
}
- goBack(): Promise {
- throw new Error('Method not implemented.');
+ async goBack(): Promise {
+ return await this._session.send('browsingContext.traverseHistory', {
+ context: this._session.sessionId,
+ delta: -1,
+ }).then(() => true).catch(() => false);
}
- goForward(): Promise {
- throw new Error('Method not implemented.');
+ async goForward(): Promise {
+ return await this._session.send('browsingContext.traverseHistory', {
+ context: this._session.sessionId,
+ delta: +1,
+ }).then(() => true).catch(() => false);
}
async forceGarbageCollection(): Promise {
From 4c4d74ca5b98462857282913744811906b800c71 Mon Sep 17 00:00:00 2001
From: Yury Semikhatsky
Date: Tue, 17 Sep 2024 16:51:56 -0700
Subject: [PATCH 06/10] chore: page.screenshot() in bidi (#32671)
The results are copied from the existing chromium expectations.
---
.../playwright-core/src/server/bidi/bidiPage.ts | 15 ++++++++++++++-
...nshot-element-bounding-box-bidi-chromium.png | Bin 0 -> 474 bytes
...eenshot-element-fractional-bidi-chromium.png | Bin 0 -> 138 bytes
...-element-fractional-offset-bidi-chromium.png | Bin 0 -> 143 bytes
...ement-larger-than-viewport-bidi-chromium.png | Bin 0 -> 2820 bytes
...hot-element-padding-border-bidi-chromium.png | Bin 0 -> 181 bytes
.../screenshot-element-rotate-bidi-chromium.png | Bin 0 -> 2377 bytes
...element-scrolled-into-view-bidi-chromium.png | Bin 0 -> 181 bytes
.../canvas-changes-0-bidi-chromium.png | Bin 0 -> 5342 bytes
.../canvas-changes-1-bidi-chromium.png | Bin 0 -> 5364 bytes
.../canvas-changes-2-bidi-chromium.png | Bin 0 -> 5384 bytes
.../grid-cell-1-bidi-chromium.png | Bin 0 -> 301 bytes
.../hide-should-work-bidi-chromium.png | Bin 0 -> 35985 bytes
.../mask-color-should-work-bidi-chromium.png | Bin 0 -> 36066 bytes
.../mask-should-work-bidi-chromium.png | Bin 0 -> 36066 bytes
...ld-work-with-elementhandle-bidi-chromium.png | Bin 0 -> 74798 bytes
...k-should-work-with-locator-bidi-chromium.png | Bin 0 -> 74798 bytes
...ld-capture-css-transform-1-bidi-chromium.png | Bin 0 -> 6013 bytes
.../remove-should-work-bidi-chromium.png | Bin 0 -> 36201 bytes
.../screenshot-canvas-bidi-chromium.png | Bin 0 -> 2265 bytes
.../screenshot-canvas-text-bidi-chromium.png | Bin 0 -> 7439 bytes
.../screenshot-clip-odd-size-bidi-chromium.png | Bin 0 -> 94 bytes
.../screenshot-clip-rect-bidi-chromium.png | Bin 0 -> 1985 bytes
.../screenshot-grid-fullpage-bidi-chromium.png | Bin 0 -> 75066 bytes
...page-mask-outside-viewport-bidi-chromium.png | Bin 0 -> 67247 bytes
.../screenshot-iframe-bidi-chromium.png | Bin 0 -> 14144 bytes
.../screenshot-offscreen-clip-bidi-chromium.png | Bin 0 -> 3719 bytes
.../screenshot-sanity-bidi-chromium.png | Bin 0 -> 36296 bytes
.../screenshot-translateZ-bidi-chromium.png | Bin 0 -> 2146 bytes
.../screenshot-web-font-bidi-chromium.png | Bin 0 -> 2898 bytes
.../screenshot-webgl-bidi-chromium.png | Bin 0 -> 4016 bytes
...d-capture-css-box-shadow-1-bidi-chromium.png | Bin 0 -> 7105 bytes
.../should-mask-in-parallel-1-bidi-chromium.png | Bin 0 -> 12471 bytes
.../should-mask-in-parallel-2-bidi-chromium.png | Bin 0 -> 12276 bytes
.../should-mask-inside-iframe-bidi-chromium.png | Bin 0 -> 36066 bytes
...uld-mask-multiple-elements-bidi-chromium.png | Bin 0 -> 35825 bytes
.../transparent-bidi-chromium.png | Bin 0 -> 874 bytes
.../white-bidi-chromium.jpg | Bin 0 -> 1379 bytes
38 files changed, 14 insertions(+), 1 deletion(-)
create mode 100644 tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-bounding-box-bidi-chromium.png
create mode 100644 tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-fractional-bidi-chromium.png
create mode 100644 tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-fractional-offset-bidi-chromium.png
create mode 100644 tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-larger-than-viewport-bidi-chromium.png
create mode 100644 tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-padding-border-bidi-chromium.png
create mode 100644 tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-rotate-bidi-chromium.png
create mode 100644 tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-scrolled-into-view-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/canvas-changes-0-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/canvas-changes-1-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/canvas-changes-2-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/grid-cell-1-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/hide-should-work-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/mask-color-should-work-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/mask-should-work-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/mask-should-work-with-elementhandle-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/mask-should-work-with-locator-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/page-screenshot-should-capture-css-transform-1-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/remove-should-work-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/screenshot-canvas-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/screenshot-canvas-text-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/screenshot-clip-odd-size-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/screenshot-clip-rect-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/screenshot-grid-fullpage-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/screenshot-grid-fullpage-mask-outside-viewport-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/screenshot-iframe-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/screenshot-offscreen-clip-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/screenshot-sanity-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/screenshot-translateZ-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/screenshot-web-font-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/screenshot-webgl-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/should-capture-css-box-shadow-1-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/should-mask-in-parallel-1-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/should-mask-in-parallel-2-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/should-mask-inside-iframe-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/should-mask-multiple-elements-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/transparent-bidi-chromium.png
create mode 100644 tests/page/page-screenshot.spec.ts-snapshots/white-bidi-chromium.jpg
diff --git a/packages/playwright-core/src/server/bidi/bidiPage.ts b/packages/playwright-core/src/server/bidi/bidiPage.ts
index 2f2e09441f..180e8a651e 100644
--- a/packages/playwright-core/src/server/bidi/bidiPage.ts
+++ b/packages/playwright-core/src/server/bidi/bidiPage.ts
@@ -404,7 +404,20 @@ export class BidiPage implements PageDelegate {
}
async takeScreenshot(progress: Progress, format: string, documentRect: types.Rect | undefined, viewportRect: types.Rect | undefined, quality: number | undefined, fitsViewport: boolean, scale: 'css' | 'device'): Promise {
- throw new Error('Method not implemented.');
+ const rect = (documentRect || viewportRect)!;
+ const { data } = await this._session.send('browsingContext.captureScreenshot', {
+ context: this._session.sessionId,
+ format: {
+ type: `image/${format === 'png' ? 'png' : 'jpeg'}`,
+ quality: quality || 80,
+ },
+ origin: documentRect ? 'document' : 'viewport',
+ clip: {
+ type: 'box',
+ ...rect,
+ }
+ });
+ return Buffer.from(data, 'base64');
}
async getContentFrame(handle: dom.ElementHandle): Promise {
diff --git a/tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-bounding-box-bidi-chromium.png b/tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-bounding-box-bidi-chromium.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2c3ddca298aba5c502f56e6656fd9330220b327
GIT binary patch
literal 474
zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^TK3NDj4wz}vwUf`e5)Ukjg=c4B?ZY6Q{gD+<_wP}}l
z6nSQ36>Zn#-f|$iNz7fE$&pKHm-_rCzvuN??>N7ATC?@xO>6j=CvYp+J%0ba_|K}-
z?e1;A{tEc13fvXy$m4X`&ax<)>7s7qi)jue-U{}mHHEE$Jc%sMXWq*OW$s-$i%G;W
zZF||t6r&}VGkq>ExtSx>>!xYDf7J|T5r=j2<5pbF65(PsvM%I1RJ=tim8p?oS*Dfk
z^|OT?x8ELn{&}OJ?ag94p-v0itCJs3c=3Z{t=G@fKZ902`4Zw^|LI!P4gZAOW-CLy
zZnhPjNK*3L8l^h>>?RwlH95zZzB$)Wuj{urPJRCQ;w>U!mP`4PSezL|x?Qg=R|`2?
z63iqS9eMQe#}9S&%O8Ea|IFgamuF(Pw=sImn|nEL`|j&|;`G&T&-U|Y;!@~!TUip(bP*}7q&3SPEgSM@h9ZZ`&x!)qR}^g{rtKT7+DOSu6{1-
HoD!M<45`mj
literal 0
HcmV?d00001
diff --git a/tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-fractional-bidi-chromium.png b/tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-fractional-bidi-chromium.png
new file mode 100644
index 0000000000000000000000000000000000000000..35c53377f942c843cab3060143ae94c6fd0dd213
GIT binary patch
literal 138
zcmeAS@N?(olHy`uVBq!ia0vp^#y~8_!3HFA4=h;^q!^2X+?^QKos)S9D6u`Nc+rW&s8
l$xQXpPL7hitfgaR5|>%Ts?Gg~>mblP22WQ%mvv4FO#tsSEqDL`
literal 0
HcmV?d00001
diff --git a/tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-fractional-offset-bidi-chromium.png b/tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-fractional-offset-bidi-chromium.png
new file mode 100644
index 0000000000000000000000000000000000000000..971561ba698ad8f16af116c371cb6d7a2a0cd940
GIT binary patch
literal 143
zcmeAS@N?(olHy`uVBq!ia0vp^ra&yt!3HE(H?jKyDaPU;cPEB*=VV?2Ii8*_jv*1P
zZ*OemJ>bA|*g@;Z-|%nYl8PJ|FVqC0StX`fG8k9yn)Kn1?IZ5qO&L>M7wbr+UexGz
qi!?d4C{V0-6NhyFbl>HtUo(Ap%%SsUe_#X9PzFy|KbLh*2~7Y}GZx^prw85p?sdAc};
zRLpsM?I7m?1Azk@ykGv)UhaK`rOBjmew=YNKLf-5>hv{Y3|>mU^ExdB^RWeeN$`2#PGmPUZ{j?Z#^NA%Cx&(BWL^R}`JOJ0AsLNt
zZy9nm7zi*Nbg8MRTi5!4TO@Mk%Ak9bwDbE4WgfS0ThCr`x^DlqKLtJPYqJ^aeS};s`jax+T2B}0-!UC6l3(jyZ5@*X)afq%4TFv0;>gTe~DWM4fsoOvN
literal 0
HcmV?d00001
diff --git a/tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-rotate-bidi-chromium.png b/tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-rotate-bidi-chromium.png
new file mode 100644
index 0000000000000000000000000000000000000000..5aab14c4b911d75804359a79699ccbd676fce212
GIT binary patch
literal 2377
zcmYLLc{r5o8&(YlgHcrWA+n?>O=KuziI5mGG#F84LJQfKoH@qWi5STe24ib1$(H5F
z7KzMMmLiRjY+1^FY`<@uKYo9F-*><7bwBrWKhO0(@Abu4S(*s)OYn1XaS2{EH9`Sj
z66XQ)0PomC&>i4&zz1bwz*YW1YKDu8@6c5vBswr_{u|CBb4Z$Jsq3+enq^g?z#%Ga
z)85APO(6^W1^-wCQ
zYRazpfSre2M5LAk!{;^cL|qrgv*_1`Z;(mgd_~20gn+slai?2YHcYIR!5j{o$Bc+A
z&~@F8kbho2fBVP#CzuMm2c;b^w-V(J$FeqdCyGbWCC&k~>v6F7zIf_*LZo2J;@IL?
z+*T=C8nCc67CL=z)+oS7YmG>3$$g$GJc;y@
z;te6T9IJcqU3EiTctDSAs!aM&X!&cnDSTp~C+ZK(@gG0C5$7lh^}9E|Ya>V+B#<
z-Oy8|2QiM>4nh=OYDlGI=!wwLoW^;?2*W>D(6+mcii={cyZhJ-CVzzWp6;Wr)zv)P
zBREa#_&LmZRsB|I$ZTY8gkPcFO*eCg-g}DBC22oKW&P)aMB;st79kaz_y^@7VVmq
z21m1pw~VmaN)+y}GK$}Lwi3NE!t2_NRsRC(qvTap{PWL?#Zh8afY`6mTANjWGU_mS
z!&gdp_c!v(`=h=JJAl;5rfrj!(z+%Gr5Q<6vl@ZI8~Ex=>kpD!3t|v2rR~
zue2^jYX%9$sLXYAP$f!`NdRgq;2)xbt28`lBqaRtEL!{@49#Iq8Y!X9qQEb(%jTsZJ
z#9H3$0LfjFF6tM90Fnpv8S0;66>rPSm}?6Rk(rJo5Pf~9R99>IsXKv}pMn|RMw_?q
zEFh0(9M1zHpi8`rFP~p;!`ER9IVQwpO$zB(8N7M79Qn*4qy5dmf$T&DQhk)su^|}5
zQ973sK?mo}>yN|^)$@cs5FofA7?Gz_9c-K4o(7j}ik?Zh$zIi#Pg<{Ku{l-rRc>W}
zbNez-HS6~PnL9!fA2mzwR0N|{GQ*os*Vlu>gklIwwmtN`aQ)P(i-S4}4Y5K8F+Bw5
zQ+Qh@GS@IqeAp}lik}nlv)kXnOH67%
zr4y}JRU7QHLbS?
z0roXL-wsSaz6@Y+?=yk{h8Twdl+6ZigrJ@0P5X&|pj2LY|Ce~Gmeq5SQi!npoVi9VRk@Pp@SR=yZShDTJN7j
zKqtuS_gg1?3L>)|EGNhjhH9{WkB`7MBS*v2m03XgN(QqB_ROk;H=QX$c}+J_V6d((IiK`p0F)
z=e&eTc7I+dj7fza*~#D8VBfqMZC_Y`+vbK^2`V@;qHUBG-%_j=$ypcLeRv`Q*^6Ul8!e9jU9i4(z
zlm)4O>pyZ17$YoqYwCxB->nY28sdWqGa7@iBfC8sxp|H4M*pf
zq6pSdZDm676%4I659WpLPAV@oOE*SBUC%a0FX!a+>!9B?o_|rC341T&$M&wxdFE4yH8V--zp~v87SDfivlUBG-1w
literal 0
HcmV?d00001
diff --git a/tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-scrolled-into-view-bidi-chromium.png b/tests/page/elementhandle-screenshot.spec.ts-snapshots/screenshot-element-scrolled-into-view-bidi-chromium.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc34319896c1dd550b7c34700502b6ff76f399d3
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^W+2SL1|)l2v+e>Z#^NA%Cx&(BWL^R}`JOJ0AsLNt
zZy9nm7zi*Nbg8MRTi5!4TO@Mk%Ak9bwDbE4WgfS0ThCr`x^DlqKLtJPYqJ^aeS};s`jax+T2B}0-!UC6l3(jyZ5@*X)afq%4TFv0;>gTe~DWM4fsoOvN
literal 0
HcmV?d00001
diff --git a/tests/page/page-screenshot.spec.ts-snapshots/canvas-changes-0-bidi-chromium.png b/tests/page/page-screenshot.spec.ts-snapshots/canvas-changes-0-bidi-chromium.png
new file mode 100644
index 0000000000000000000000000000000000000000..6fcce2cf531473ab7a8e4b7a1cbe7e8965d77f28
GIT binary patch
literal 5342
zcmeAS@N?(olHy`uVBq!ia0y~yUj+{FMWw@PXt$29UW9
zGZ?`9L?#80a0_Pxh!Rj^U;9jMWc;%IMqbjSc$5{?GKXdn!S5j64tf&w!`MVvx`(aGTH>gTe~
HDWM4fORfl=
literal 0
HcmV?d00001
diff --git a/tests/page/page-screenshot.spec.ts-snapshots/canvas-changes-1-bidi-chromium.png b/tests/page/page-screenshot.spec.ts-snapshots/canvas-changes-1-bidi-chromium.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6f130a44ab8acca5d3381d62b07b4d1a8dee6d6
GIT binary patch
literal 5364
zcmeAS@N?(olHy`uVBq!ia0y~yU{%gD3Xv9*%;H7qga?ebf@yzIpo08E&9H29GLxTM*5#qmO|D
zL?<#SfT$ME1`s8n#=r!m9A=0R
z9|jP=!GKW!Bz%a)0Yq^KGmJ`(2Et%Y2|2db1v1BFtr_aJ<=(z540P&)_jA||%-osG
z4oblVjj1AbAjXML>6-OG=?D9B)1JK*1Zg;6`-h1K
z#7JaP08uTR4IoNDje!YBIm}?-0C7hpM+0H7ri9-&4;IS!zhT&sv-ayZP?q>%wVbga
zZQc!Vez}t%-O3M2!khLmjwa>N{0vM9Lo^UZ)A?xCG+I9^fXedGM#^X)j5b$Co8_Yo
xx*^(@8O^+-nRhhvj%Hq9GiEdphI}CWWz2I`nfUOoNej>`44$rjF6*2UngE{BE1CcR
literal 0
HcmV?d00001
diff --git a/tests/page/page-screenshot.spec.ts-snapshots/grid-cell-1-bidi-chromium.png b/tests/page/page-screenshot.spec.ts-snapshots/grid-cell-1-bidi-chromium.png
new file mode 100644
index 0000000000000000000000000000000000000000..2eab11668d689ac8c3e35881fe4cfbb282b8f4d2
GIT binary patch
literal 301
zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^R}&pllnLoyoQ
z-rC4{$U)-hNAaD4OeLAMPBj0a7kIGi?c
zzHp!SsgC*1>G>_Ig{G!f9+xj*Fp%fnUDwyI!|(oOS6xSbAcu7822^6p*1h*8ED3%s
z`CH)q-mfeShbJ7(>(8*+X!Wl*(qrE96PtKk10#G*ELJzKUgb3FNW|Q89EuTV_srNk
z(WH}+p)@wy*W|^o)Wrg3T$!gWH%sq3Xp>_0;_;@)=<_cwF9HcCq7jc9p8xmT|Bi9X
Xas|637J9-!FEe<$`njxgN@xNAc$#)g
literal 0
HcmV?d00001
diff --git a/tests/page/page-screenshot.spec.ts-snapshots/hide-should-work-bidi-chromium.png b/tests/page/page-screenshot.spec.ts-snapshots/hide-should-work-bidi-chromium.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd0549a4114a2f0b7c9957fcf72429d1f2f49f11
GIT binary patch
literal 35985
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