From 7d690e2cf7c38c993b77a3a3b2d79044b58be5da Mon Sep 17 00:00:00 2001 From: "Taro.Nonoyama" Date: Tue, 16 Jun 2026 11:30:38 +0900 Subject: [PATCH] fix: prevent false emulation detection inside iframe context --- .changeset/fix-iframe-emulation.md | 5 ++++ .../getScreenDimensions.test.ts | 27 +++++++++++++++++++ .../clientSideScripts/getScreenDimensions.ts | 2 ++ 3 files changed, 34 insertions(+) create mode 100644 .changeset/fix-iframe-emulation.md diff --git a/.changeset/fix-iframe-emulation.md b/.changeset/fix-iframe-emulation.md new file mode 100644 index 000000000..1ab5115c7 --- /dev/null +++ b/.changeset/fix-iframe-emulation.md @@ -0,0 +1,5 @@ +--- +"@wdio/image-comparison-core": patch +--- + +fix: prevent false emulation detection when checkElement is called inside an iframe after switchFrame diff --git a/packages/image-comparison-core/src/clientSideScripts/getScreenDimensions.test.ts b/packages/image-comparison-core/src/clientSideScripts/getScreenDimensions.test.ts index a2b8093cc..d101602a2 100644 --- a/packages/image-comparison-core/src/clientSideScripts/getScreenDimensions.test.ts +++ b/packages/image-comparison-core/src/clientSideScripts/getScreenDimensions.test.ts @@ -168,6 +168,33 @@ describe('getScreenDimensions', () => { expect(dimensions.dimensions.window.screenHeight).toBe(1800) }) + it('should not detect emulation when running inside an iframe', () => { + const originalSelf = window.self + Object.defineProperty(window, 'self', { + value: {} as Window, + configurable: true, + writable: true, + }) + + Object.defineProperty(window, 'devicePixelRatio', { value: 3, configurable: true }) + Object.defineProperty(window, 'innerWidth', { value: 50, configurable: true }) + Object.defineProperty(window, 'innerHeight', { value: 100, configurable: true }) + Object.defineProperty(window, 'matchMedia', { + value: vi.fn().mockImplementation(() => ({ matches: false })), + ...CONFIGURABLE, + }) + + const dimensions = getScreenDimensions(false) + + Object.defineProperty(window, 'self', { + value: originalSelf, + configurable: true, + writable: true, + }) + + expect(dimensions.dimensions.window.isEmulated).toBe(false) + }) + it('should handle zero devicePixelRatio', () => { Object.defineProperty(window, 'devicePixelRatio', { value: 0, configurable: true }) Object.defineProperty(window, 'innerWidth', { value: 1920, configurable: true }) diff --git a/packages/image-comparison-core/src/clientSideScripts/getScreenDimensions.ts b/packages/image-comparison-core/src/clientSideScripts/getScreenDimensions.ts index 73c3f6f17..d1add4582 100644 --- a/packages/image-comparison-core/src/clientSideScripts/getScreenDimensions.ts +++ b/packages/image-comparison-core/src/clientSideScripts/getScreenDimensions.ts @@ -10,8 +10,10 @@ export default function getScreenDimensions(isMobile: boolean): ScreenDimensions const dpr = window.devicePixelRatio || 1 const minEdge = Math.min(width, height) const maxEdge = Math.max(width, height) + const isInIframe = window.self !== window.top const isLikelyEmulated = !isMobile && // Only check for emulated on desktop + !isInIframe && // Skip emulation detection inside iframes dpr >= 2 && // High-DPI signal minEdge <= 800 && // Catch phones/tablets in portrait/landscape maxEdge <= 1280 && // Conservative max for emulated tablet sizes