Repository navigation
[HitTest] Add culled inline ancestors of self-painting items to lists - #64131
Open
chromium-wpt-export-bot wants to merge 1 commit into
Open
chromium-wpt-export-bot wants to merge 1 commit into
chromium-wpt-export-bot wants to merge 1 commit into
Conversation
A culled inline is an inline element, such as a plain <span>, that has no box fragment of its own. BoxFragmentPainter::HitTestItemsChildren() adds culled inline ancestors by calling HitTestCulledInlineAncestors() after each item. It skips that call for items with a self-painting layer, such as a position:relative child, because that layer is hit-tested separately. The layer's own hit test never adds the culled ancestors outside it, so nothing does. For example, given <span id=a><span style="position:relative">Text</span></span> document.elementsFromPoint() returns the inner span but not #a. WebKit returns both, and CSSOM View says elementsFromPoint() returns every box at the point, in paint order. #a is also missing at points on its own text after such a child, such as "after" in <span id=a><span style="position:relative">Text</span>after</span> because that text relies on its earlier sibling to add #a. With this change, list-based hit tests let self-painting items fall through to the existing culled inline check, as they already do for other inline items. DOM event targets are unaffected. Mouse, pointer, and gesture events get their targets from single-point hit tests, which this change does not touch. Those tests return the innermost element, and events bubble normally through ancestor inlines. :hover and :active are set on every ancestor of the hit element, so #a already matches them. Bug: 576771254 Change-Id: I5c8c007bbbbebd39d6f9a7c6bb6d759f8e206171 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8642474 Commit-Queue: Aaron Leventhal <aleventhal@google.com> Reviewed-by: Khushal Sagar <khushalsagar@chromium.org> Cr-Commit-Position: refs/heads/main@{#1726041}
wpt-pr-bot
approved these changes
Oct 23, 2026
wpt-pr-bot
left a comment
Collaborator
There was a problem hiding this comment.
The review process for this patch is being conducted in the Chromium project.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A culled inline is an inline element, such as a plain <span>, that has
no box fragment of its own. BoxFragmentPainter::HitTestItemsChildren()
adds culled inline ancestors by calling HitTestCulledInlineAncestors()
after each item. It skips that call for items with a self-painting
layer, such as a position:relative child, because that layer is
hit-tested separately. The layer's own hit test never adds the culled
ancestors outside it, so nothing does.
For example, given
<span id=a><span style="position:relative">Text</span></span>
document.elementsFromPoint() returns the inner span but not #a. WebKit
returns both, and CSSOM View says elementsFromPoint() returns every box
at the point, in paint order. #a is also missing at points on its own
text after such a child, such as "after" in
<span id=a><span style="position:relative">Text</span>after</span>
because that text relies on its earlier sibling to add #a.
With this change, list-based hit tests let self-painting items fall
through to the existing culled inline check, as they already do for
other inline items.
DOM event targets are unaffected. Mouse, pointer, and gesture events get
their targets from single-point hit tests, which this change does not
touch. Those tests return the innermost element, and events bubble
normally through ancestor inlines. :hover and :active are set on every
ancestor of the hit element, so #a already matches them.
Bug: 576771254
Change-Id: I5c8c007bbbbebd39d6f9a7c6bb6d759f8e206171
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8642474
Commit-Queue: Aaron Leventhal <aleventhal@google.com>
Reviewed-by: Khushal Sagar <khushalsagar@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1726041}