소스 검색

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. :^)
Andreas Kling 2 년 전
부모
커밋
92bc3d200d
1개의 변경된 파일4개의 추가작업 그리고 1개의 파일을 삭제
  1. 4 1
      Userland/Libraries/LibWeb/IntersectionObserver/IntersectionObserver.cpp

+ 4 - 1
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<JS::Handle<DOM::Element>>());
         auto element = intersection_root.get<JS::Handle<DOM::Element>>();