diff --git a/packages/playwright-core/src/server/injected/injectedScript.ts b/packages/playwright-core/src/server/injected/injectedScript.ts index d19603b827..48a9a388dd 100644 --- a/packages/playwright-core/src/server/injected/injectedScript.ts +++ b/packages/playwright-core/src/server/injected/injectedScript.ts @@ -67,6 +67,10 @@ export type HitTargetInterceptionResult = { stop: () => 'done' | { hitTargetDescription: string }; }; +interface WebKitLegacyDeviceOrientationEvent extends DeviceOrientationEvent { + readonly initDeviceOrientationEvent: (type: string, bubbles: boolean, cancelable: boolean, alpha: number, beta: number, gamma: number, absolute: boolean) => void; +} + export class InjectedScript { private _engines: Map; _evaluator: SelectorEvaluatorImpl; @@ -1036,6 +1040,15 @@ export class InjectedScript { case 'focus': event = new FocusEvent(type, eventInit); break; case 'drag': event = new DragEvent(type, eventInit); break; case 'wheel': event = new WheelEvent(type, eventInit); break; + case 'deviceorientation': + try { + event = new DeviceOrientationEvent(type, eventInit); + } catch { + const { bubbles, cancelable, alpha, beta, gamma, absolute } = eventInit as {bubbles: boolean, cancelable: boolean, alpha: number, beta: number, gamma: number, absolute: boolean}; + event = this.document.createEvent('DeviceOrientationEvent') as WebKitLegacyDeviceOrientationEvent; + event.initDeviceOrientationEvent(type, bubbles, cancelable, alpha, beta, gamma, absolute); + } + break; default: event = new Event(type, eventInit); break; } node.dispatchEvent(event); @@ -1371,7 +1384,7 @@ function oneLine(s: string): string { return s.replace(/\n/g, '↵').replace(/\t/g, '⇆'); } -const eventType = new Map([ +const eventType = new Map([ ['auxclick', 'mouse'], ['click', 'mouse'], ['dblclick', 'mouse'], @@ -1419,6 +1432,9 @@ const eventType = new Map + + + + Device orientation test + + + + + + + diff --git a/tests/page/page-dispatchevent.spec.ts b/tests/page/page-dispatchevent.spec.ts index 85b928862b..840c525788 100644 --- a/tests/page/page-dispatchevent.spec.ts +++ b/tests/page/page-dispatchevent.spec.ts @@ -171,3 +171,23 @@ it('should dispatch wheel event', async ({ page, server }) => { expect(await eventsHandle.evaluate(e => e[0] instanceof WheelEvent)).toBeTruthy(); expect(await eventsHandle.evaluate(e => ({ deltaX: e[0].deltaX, deltaY: e[0].deltaY }))).toEqual({ deltaX: 100, deltaY: 200 }); }); + +it('should dispatch device orientation event', async ({ page, server }) => { + await page.goto(server.PREFIX + '/device-orientation.html'); + await page.locator('html').dispatchEvent('deviceorientation', { alpha: 10, beta: 20, gamma: 30 }); + expect(await page.evaluate('result')).toBe('Oriented'); + expect(await page.evaluate('alpha')).toBe(10); + expect(await page.evaluate('beta')).toBe(20); + expect(await page.evaluate('gamma')).toBe(30); + expect(await page.evaluate('absolute')).toBeFalsy(); +}); + +it('should dispatch absolute device orientation event', async ({ page, server }) => { + await page.goto(server.PREFIX + '/device-orientation.html'); + await page.locator('html').dispatchEvent('deviceorientationabsolute', { alpha: 10, beta: 20, gamma: 30, absolute: true }); + expect(await page.evaluate('result')).toBe('Oriented'); + expect(await page.evaluate('alpha')).toBe(10); + expect(await page.evaluate('beta')).toBe(20); + expect(await page.evaluate('gamma')).toBe(30); + expect(await page.evaluate('absolute')).toBeTruthy(); +});