[webkit-changes] [WebKit/WebKit] 39a323: Optimize Intersection Observer computations slightly

Simon Fraser noreply at github.com
Mon Jul 31 15:05:04 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 39a323e0f73673f8bf83f701cf6ee83a130d7cbe
      https://github.com/WebKit/WebKit/commit/39a323e0f73673f8bf83f701cf6ee83a130d7cbe
  Author: Simon Fraser <simon.fraser at apple.com>
  Date:   2023-07-31 (Mon, 31 Jul 2023)

  Changed paths:
    M Source/WebCore/page/IntersectionObserver.cpp
    M Source/WebCore/page/IntersectionObserver.h

  Log Message:
  -----------
  Optimize Intersection Observer computations slightly
https://bugs.webkit.org/show_bug.cgi?id=259630
rdar://113083595

Reviewed by Ryosuke Niwa.

Refactor computeIntersectionState() so that we can lazily compute intersectionState.absoluteRootBounds()
only when we know we're going to fire an observation.

This requires passing the IntersectionObserverRegistration to computeIntersectionState(), which now
makes more sense as a member function, and moving the computation of thresholdIndex into this
function, so we can compute absoluteRootBounds and absoluteTargetRect lazily when we know we're going
to fire the observation.

IntersectionObservationState becomes a class-private struct since the member function returns it.
To make it clearer which rectangles have valid values in IntersectionObservationState, use
std::optional<FloatRect>s. Rename "localRootBounds" to "rootBounds" because the "local" there didn't
add any information.

Make extensive use of lambda functions in IntersectionObserver::computeIntersectionState() to
group related code and allow for early returns for clarity.

For RenderInlines, replace a call to target.boundingAbsoluteRectWithoutLayout() by code that
calls absoluteQuads() directly, since this is what boundingAbsoluteRectWithoutLayout() does for
inlines. Add a note about how inefficient this is.

There should be no behavior change here. Tested by WPT Intersection Observer tests.

* Source/WebCore/page/IntersectionObserver.cpp:
(WebCore::expandRootBoundsWithRootMargin):
(WebCore::IntersectionObserver::computeIntersectionState const):
(WebCore::IntersectionObserver::updateObservations):
(): Deleted.
(WebCore::computeIntersectionState): Deleted.
* Source/WebCore/page/IntersectionObserver.h:

Canonical link: https://commits.webkit.org/266458@main




More information about the webkit-changes mailing list