From 92bc3d200d39809bccd7844129be534f43cb4c49 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 11 Jul 2023 07:48:31 +0200 Subject: [PATCH] LibWeb: Fix incorrectly offset root intersection rectangle for Document When the intersection root is a Document, we use the viewport itself as the root intersection rectangle. However, we should only use the size of the viewport and strip away the current scroll offset. This is important, as intersections are computed using viewport-relative element rects, so we're already in a coordinate system where (0, 0) is the top left of the scrolled viewport. This fixes an issue where IntersectionObservers would fire at entirely wrong scroll offsets. :^) --- .../LibWeb/IntersectionObserver/IntersectionObserver.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibWeb/IntersectionObserver/IntersectionObserver.cpp b/Userland/Libraries/LibWeb/IntersectionObserver/IntersectionObserver.cpp index ca85ccf04b..5282e2198b 100644 --- a/Userland/Libraries/LibWeb/IntersectionObserver/IntersectionObserver.cpp +++ b/Userland/Libraries/LibWeb/IntersectionObserver/IntersectionObserver.cpp @@ -175,7 +175,10 @@ CSSPixelRect IntersectionObserver::root_intersection_rectangle() const // Since the spec says that this is only reach if the document is fully active, that means it must have a browsing context. VERIFY(document->browsing_context()); - rect = document->browsing_context()->viewport_rect(); + + // NOTE: This rect is the *size* of the viewport. The viewport *offset* is not relevant, + // as intersections are computed using viewport-relative element rects. + rect = CSSPixelRect { CSSPixelPoint { 0, 0 }, document->browsing_context()->viewport_rect().size() }; } else { VERIFY(intersection_root.has>()); auto element = intersection_root.get>();