Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 6cf87428964e43f42545c7e68c522acc23124a68
      
https://github.com/WebKit/WebKit/commit/6cf87428964e43f42545c7e68c522acc23124a68
  Author: Wenson Hsieh <[email protected]>
  Date:   2024-03-26 (Tue, 26 Mar 2024)

  Changed paths:
    A 
LayoutTests/fast/element-targeting/target-reinserted-elements-expected.html
    A LayoutTests/fast/element-targeting/target-reinserted-elements.html
    M LayoutTests/resources/ui-helper.js
    M Source/WebCore/Headers.cmake
    M Source/WebCore/Sources.txt
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    R Source/WebCore/page/ElementTargeting.cpp
    R Source/WebCore/page/ElementTargeting.h
    A Source/WebCore/page/ElementTargetingController.cpp
    A Source/WebCore/page/ElementTargetingController.h
    M Source/WebCore/page/Page.cpp
    M Source/WebCore/page/Page.h
    M Source/WebKit/WebProcess/WebPage/WebPage.cpp

  Log Message:
  -----------
  [Remote Inspection] Automatically adjust visibility when repeatedly adjusting 
visibility for elements in the same area
https://bugs.webkit.org/show_bug.cgi?id=271676

Reviewed by Megan Gardner.

Add support for automatically adjusting visibility for elements in the 
viewport, under some very
specific circumstances:

1.  We've repeatedly (i.e. at least twice) adjusted visibility for an element 
in the the same place,
    relative to the viewport.

2.  This "repeated adjustment area" contains an out of flow element.

Under these circumstances, we'll automatically adjust the visibility of any out 
of flow element that
meets the criteria in (2). See comments below for more details.

* LayoutTests/fast/element-targeting/target-reinserted-elements-expected.html: 
Added.
* LayoutTests/fast/element-targeting/target-reinserted-elements.html: Added.
* LayoutTests/resources/ui-helper.js:

Add a new layout test to exercise this change.

(window.UIHelper.adjustVisibilityForFrontmostTarget):
(window.UIHelper):

For convenience, augment this static helper to take a single element as the 
first argument and hit-
test in the center of the element.

* Source/WebCore/Headers.cmake:
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/page/ElementTargetingController.cpp: Renamed from 
Source/WebCore/page/ElementTargeting.cpp.

Rename `ElementTargeting.{h|cpp}` to `ElementTargetingController.{h|cpp}`, and 
pull the current
standalone utility functions into instance methods on the new controller class. 
This refactoring
allows us to modify and consult state (i.e., `Region`s that track 
previously-adjusted rects in
client coordinates) when automatically applying visibility adjustment (only 
when the criteria above
are met).

(WebCore::ElementTargetingController::ElementTargetingController):
(WebCore::elementAndAncestorsAreOnlyChildren):
(WebCore::querySelectorMatchesOneElement):
(WebCore::childIndexByType):
(WebCore::computeIDSelector):
(WebCore::computeClassSelector):
(WebCore::selectorForElementRecursive):
(WebCore::parentRelativeSelectorRecursive):
(WebCore::selectorsForTarget):
(WebCore::computeOffsetEdges):
(WebCore::collectChildFrameIdentifiers):
(WebCore::targetedElementInfo):
(WebCore::findOnlyMainElement):
(WebCore::isTargetCandidate):

Pull this lambda out into a static helper, for use in 
`adjustVisibilityInRepeatedlyTargetedRegions`.

(WebCore::ElementTargetingController::findTargets):
(WebCore::computeClientRect):
(WebCore::ElementTargetingController::adjustVisibility):

When performing visibility adjustment, keep track of `Region`s where we've 
previously performed
visibility adjustment (relative to client coordinates). If we adjust visibility 
for an element in
the same place again, add the intersecting rect to 
`m_repeatedAdjustmentClientRegion`, so that we'll
automatically apply visibility adjustment to any element that is contained 
within the same region
moving forward.

(WebCore::adjustRegionAfterViewportSizeChange):
(WebCore::ElementTargetingController::adjustVisibilityInRepeatedlyTargetedRegions):

Implement the main logic for automatically carrying out visibility adjustment. 
Here, we adjust
visibility for all out-of-flow elements that happen to be contained (in client 
coordinates) within
repeatedly targeted regions (which are tracked using 
`m_repeatedAdjustmentClientRegion`).

If the viewport size changes, we also adjust all rects in 
`m_adjustmentClientRegion` and
`m_repeatedAdjustmentClientRegion`, such that elements that are (likely) fixed 
near the top, left,
bottom, or right of the viewport will continue to be fixed to the same 
locations.

(WebCore::ElementTargetingController::resetAdjustmentRegions):
* Source/WebCore/page/ElementTargetingController.h: Renamed from 
Source/WebCore/page/ElementTargeting.h.
* Source/WebCore/page/Page.cpp:

Add a `ElementTargetingController` to `Page`, as well as a new rendering update 
step to apply
automatic visibility adjustments if necessary.

(WebCore::Page::Page):
(WebCore::Page::checkedElementTargetingController):
(WebCore::Page::didCommitLoad):

Reset `ElementTargetingController`'s adjustment regions when committing a load.

(WebCore::Page::updateRendering):
(WebCore::operator<<):
* Source/WebCore/page/Page.h:
(WebCore::Page::elementTargetingController):
* Source/WebKit/WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::requestTargetedElement):
(WebKit::WebPage::adjustVisibilityForTargetedElements):

Switch to the new instance methods on `ElementTargetingController`.

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



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to