[webkit-changes] [WebKit/WebKit] 0c8fb4: Interaction regions should support occlusions

EWS noreply at github.com
Fri Jan 27 10:59:06 PST 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 0c8fb49c7a40115abe543963829eb8268b96d048
      https://github.com/WebKit/WebKit/commit/0c8fb49c7a40115abe543963829eb8268b96d048
  Author: Etienne Segonzac <sgz at apple.com>
  Date:   2023-01-27 (Fri, 27 Jan 2023)

  Changed paths:
    M LayoutTests/interaction-region/click-handler-dynamically-added-expected.txt
    M LayoutTests/interaction-region/click-handler-expected.txt
    M LayoutTests/interaction-region/click-handler-in-shadowed-layer-expected.txt
    M LayoutTests/interaction-region/event-region-overflow-expected.txt
    M LayoutTests/interaction-region/icon-inside-button-single-region-expected.txt
    M LayoutTests/interaction-region/inline-link-dark-background-expected.txt
    M LayoutTests/interaction-region/inline-link-expected.txt
    R LayoutTests/interaction-region/inline-link-in-aria-hidden-subtree-expected.txt
    R LayoutTests/interaction-region/inline-link-in-aria-hidden-subtree.html
    M LayoutTests/interaction-region/inline-link-in-composited-iframe-expected.txt
    M LayoutTests/interaction-region/inline-link-in-layer-expected.txt
    M LayoutTests/interaction-region/inline-link-in-non-composited-iframe-expected.txt
    M LayoutTests/interaction-region/inline-link-with-pointer-events-none-content-expected.txt
    M LayoutTests/interaction-region/input-type-file-region-expected.txt
    M LayoutTests/interaction-region/input-type-range-region-expected.txt
    A LayoutTests/interaction-region/layer-tree-expected.txt
    A LayoutTests/interaction-region/layer-tree.html
    A LayoutTests/interaction-region/overlay-expected.txt
    A LayoutTests/interaction-region/overlay.html
    M LayoutTests/interaction-region/paused-video-regions-expected.txt
    M LayoutTests/interaction-region/region-area-overflow-does-not-crash-expected.txt
    M LayoutTests/interaction-region/region-area-overflow-does-not-crash.html
    M LayoutTests/interaction-region/split-inline-link-expected.txt
    M LayoutTests/interaction-region/wrapped-inline-link-expected.txt
    M LayoutTests/resources/ui-helper.js
    M Source/WebCore/page/InteractionRegion.cpp
    M Source/WebCore/page/InteractionRegion.h
    M Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreePropertyApplier.mm
    M Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h
    M Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm
    M Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeHost.mm
    M Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeInteractionRegionLayers.h
    M Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeInteractionRegionLayers.mm
    M Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeNode.h
    M Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeNode.mm
    M Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl
    M Tools/TestRunnerShared/UIScriptContext/UIScriptController.h
    M Tools/WebKitTestRunner/cocoa/UIScriptControllerCocoa.h
    M Tools/WebKitTestRunner/cocoa/UIScriptControllerCocoa.mm

  Log Message:
  -----------
  Interaction regions should support occlusions
https://bugs.webkit.org/show_bug.cgi?id=250860
<rdar://103928196>

Reviewed by Tim Horton.

Maintain a separate layer tree for Interaction Regions on top of the
content. This "mirror layer tree" includes layers for occlusions and now
comes with clear ordering rules.

* LayoutTests/interaction-region/click-handler-dynamically-added-expected.txt:
* LayoutTests/interaction-region/click-handler-expected.txt:
* LayoutTests/interaction-region/click-handler-in-shadowed-layer-expected.txt:
* LayoutTests/interaction-region/event-region-overflow-expected.txt:
* LayoutTests/interaction-region/icon-inside-button-single-region-expected.txt:
* LayoutTests/interaction-region/inline-link-dark-background-expected.txt:
* LayoutTests/interaction-region/inline-link-expected.txt:
* LayoutTests/interaction-region/inline-link-in-composited-iframe-expected.txt:
* LayoutTests/interaction-region/inline-link-in-layer-expected.txt:
* LayoutTests/interaction-region/inline-link-in-non-composited-iframe-expected.txt:
* LayoutTests/interaction-region/inline-link-with-pointer-events-none-content-expected.txt:
* LayoutTests/interaction-region/input-type-file-region-expected.txt:
* LayoutTests/interaction-region/input-type-range-region-expected.txt:
* LayoutTests/interaction-region/paused-video-regions-expected.txt:
* LayoutTests/interaction-region/split-inline-link-expected.txt:
* LayoutTests/interaction-region/wrapped-inline-link-expected.txt:
Update expectations with the new dump format.

* LayoutTests/interaction-region/layer-tree-expected.txt: Added.
* LayoutTests/interaction-region/layer-tree.html: Added.
Add test covering the final RemoteLayerTree structure.

* LayoutTests/interaction-region/overlay-expected.txt: Renamed from LayoutTests/interaction-region/inline-link-in-aria-hidden-subtree-expected.txt.
* LayoutTests/interaction-region/overlay.html: Renamed from LayoutTests/interaction-region/inline-link-in-aria-hidden-subtree.html.
Remove the aria-hidden test.
Add test for the occlusions detection.

* LayoutTests/interaction-region/region-area-overflow-does-not-crash-expected.txt:
* LayoutTests/interaction-region/region-area-overflow-does-not-crash.html:
Update test to also include a big occlusion region.

* LayoutTests/resources/ui-helper.js:
(window.UIHelper.getCALayerTree):
* Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl:
* Tools/TestRunnerShared/UIScriptContext/UIScriptController.h:
(WTR::UIScriptController::caLayerTreeAsText const):
* Tools/WebKitTestRunner/cocoa/UIScriptControllerCocoa.h:
* Tools/WebKitTestRunner/cocoa/UIScriptControllerCocoa.mm:
(WTR::UIScriptControllerCocoa::caLayerTreeAsText const):
* Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h:
* Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm:
(-[WKWebView _caLayerTreeAsText]):
(dumpCALayer):
Introduce a new test helper to get the full remote layer hierarchy.

* Source/WebCore/page/InteractionRegion.cpp:
(WebCore::interactionRegionForRenderedRegion):
Remove the aria-hidden check. It was too strict and is not needed
anymore.
Generate regions for elements likely to occlude interactions.
(WebCore::operator<<):
Update the dump format to differentiate interactions and occlusions.

* Source/WebCore/page/InteractionRegion.h:
(WebCore::operator==):
(WebCore::InteractionRegion::encode const):
(WebCore::InteractionRegion::decode):
Add a `type` enum to the InteractionRegion struct to differentiate
interactions and occlusions.

* Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreePropertyApplier.mm:
(WebKit::applyGeometryPropertiesToLayer):
(WebKit::RemoteLayerTreePropertyApplier::applyPropertiesToLayer):
Extract the geometry related properties application code to a new
method.
(WebKit::RemoteLayerTreePropertyApplier::applyProperties):
Only update geometry and event region properties for Interaction Regions
layers.
(WebKit::applyInteractionRegionsHierarchyUpdate):
(WebKit::RemoteLayerTreePropertyApplier::applyHierarchyUpdates):
Apply all hierarchy updates to the Interaction Regions mirror layer tree.

* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeHost.mm:
(WebKit::RemoteLayerTreeHost::updateLayerTree):
Keep the Interaction Regions mirror layer tree on top of the content after
each layer tree update.

* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeInteractionRegionLayers.h:
* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeInteractionRegionLayers.mm:
(WebKit::isInteractionLayer):
(WebKit::isOcclusionLayer):
(WebKit::isAnyInteractionRegionLayer):
(WebKit::isInteractionRegionLayer): Deleted.
(WebKit::setInteractionRegionOcclusion):
Update utility functions to differentiate interactions and occlusions.
(WebKit::insertInteractionRegionLayersForLayer):
(WebKit::appendInteractionRegionLayersForLayer): Deleted.
Insert the Interaction Regions back at the beginning of the sublayers array.
(WebKit::updateLayersForInteractionRegions):
Maintain the following order when updating Interaction Regions layers:
1. Occlusions always come first (in no particular order).
2. Interactions come next, ordered by area (biggest to smallest).
3. Other siblings come last, in the same order as the content layers they mirror.

* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeNode.h:
(WebKit::RemoteLayerTreeNode::interactionRegionsLayer const):
* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeNode.mm:
(WebKit::RemoteLayerTreeNode::detachFromParent):
(WebKit::RemoteLayerTreeNode::initializeLayer):
Add an `interactionRegionsLayer` property to the RemoteLayerTreeNode.

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




More information about the webkit-changes mailing list