diff --git a/src/browser/client-scripts/screen-shooter/operations.ts b/src/browser/client-scripts/screen-shooter/operations.ts index a25aa8b83..0d678e78b 100644 --- a/src/browser/client-scripts/screen-shooter/operations.ts +++ b/src/browser/client-scripts/screen-shooter/operations.ts @@ -20,6 +20,7 @@ import { findFixedPositionedParent, forEachRoot, getMainDocumentElem, + getMainWindow, getScreenshooterNamespaceData } from "./utils/dom"; import { @@ -49,7 +50,8 @@ export function computeScrollOffset(element: Element): Coord<"page", "css", "y"> } export function computeViewportSize(): Size<"css"> { - const visualViewport = window.visualViewport; + const mainWindow = getMainWindow(); + const visualViewport = mainWindow.visualViewport; // Visual viewport occasionally returns more correct values than innerWidth/Height, but may not be available in older browsers if (visualViewport && visualViewport.width > 0 && visualViewport.height > 0) { @@ -60,15 +62,17 @@ export function computeViewportSize(): Size<"css"> { } return { - width: window.innerWidth as Length<"css", "x">, - height: window.innerHeight as Length<"css", "y"> + width: mainWindow.innerWidth as Length<"css", "x">, + height: mainWindow.innerHeight as Length<"css", "y"> }; } export function computeViewportOffset(): Point<"page", "css"> { + const mainWindow = getMainWindow(); + return { - left: window.pageXOffset as Coord<"page", "css", "x">, - top: window.pageYOffset as Coord<"page", "css", "y"> + left: mainWindow.pageXOffset as Coord<"page", "css", "x">, + top: mainWindow.pageYOffset as Coord<"page", "css", "y"> }; } diff --git a/src/browser/client-scripts/screen-shooter/utils/clip-rect.ts b/src/browser/client-scripts/screen-shooter/utils/clip-rect.ts index 375f9a078..cf3a6b067 100644 --- a/src/browser/client-scripts/screen-shooter/utils/clip-rect.ts +++ b/src/browser/client-scripts/screen-shooter/utils/clip-rect.ts @@ -2,15 +2,17 @@ import { Rect, Coord, Length, getIntersection } from "@isomorphic"; import * as lib from "@lib"; import { getBoundingClientContentRect } from "./element-rect"; import { isRootLikeElement } from "./scroll"; -import { findContainingBlock } from "./dom"; +import { findContainingBlock, getMainWindow } from "./dom"; import { getReadableElementDescriptor } from "./descriptions"; function getViewportRect(): Rect<"viewport", "css"> { + const mainWindow = getMainWindow(); + return { top: 0 as Coord<"viewport", "css", "y">, left: 0 as Coord<"viewport", "css", "x">, - width: window.innerWidth as Length<"css", "x">, - height: window.innerHeight as Length<"css", "y"> + width: mainWindow.innerWidth as Length<"css", "x">, + height: mainWindow.innerHeight as Length<"css", "y"> }; } diff --git a/src/browser/client-scripts/screen-shooter/utils/dom.ts b/src/browser/client-scripts/screen-shooter/utils/dom.ts index 24777dc2e..473c65484 100644 --- a/src/browser/client-scripts/screen-shooter/utils/dom.ts +++ b/src/browser/client-scripts/screen-shooter/utils/dom.ts @@ -43,6 +43,10 @@ export function getMainDocumentElem(currDocumentElem?: HTMLElement): HTMLElement return getMainDocumentElem(currWindow.document.documentElement); } +export function getMainWindow(): Window { + return getMainDocumentElem().ownerDocument.defaultView ?? window; +} + export function forEachRoot(cb: (root: Element | ShadowRoot) => void): void { function traverseRoots(root: Element | ShadowRoot): void { cb(root); diff --git a/test/e2e/screens/8486705/chrome/iframe-element.png b/test/e2e/screens/8486705/chrome/iframe-element.png new file mode 100644 index 000000000..1c9a64020 Binary files /dev/null and b/test/e2e/screens/8486705/chrome/iframe-element.png differ diff --git a/test/e2e/static/offset-iframe-content.html b/test/e2e/static/offset-iframe-content.html new file mode 100644 index 000000000..58c318b8a --- /dev/null +++ b/test/e2e/static/offset-iframe-content.html @@ -0,0 +1,20 @@ + + +
+ + + + + + + diff --git a/test/e2e/static/offset-iframe.html b/test/e2e/static/offset-iframe.html new file mode 100644 index 000000000..420eb67f4 --- /dev/null +++ b/test/e2e/static/offset-iframe.html @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/test/e2e/tests/assert-view.testplane.js b/test/e2e/tests/assert-view.testplane.js index 566f060ee..03fc2b4d3 100644 --- a/test/e2e/tests/assert-view.testplane.js +++ b/test/e2e/tests/assert-view.testplane.js @@ -478,4 +478,12 @@ describe("assertView", () => { allowViewportOverflow: true, }); }); + + it("should capture the full width of an element inside an offset iframe", async ({ browser }) => { + await browser.setWindowSize(1500, 1000); + await browser.url("offset-iframe.html"); + + await browser.switchToFrame(await browser.$("#frame")); + await browser.assertView("iframe-element", ".target-element"); + }); });