Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 74c2e1e966aa1bc8aedb1cd0adf72029e67a3f6d
      
https://github.com/WebKit/WebKit/commit/74c2e1e966aa1bc8aedb1cd0adf72029e67a3f6d
  Author: Aditya Keerthi <akeer...@apple.com>
  Date:   2025-08-06 (Wed, 06 Aug 2025)

  Changed paths:
    M LayoutTests/fast/shadow-dom/cannot-hit-test-into-shadow-media-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/cssom/caretPositionFromPoint-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/cssom/caretPositionFromPoint.html
    M Source/WebCore/accessibility/AccessibilityNodeObject.cpp
    M Source/WebCore/accessibility/AccessibilityObject.cpp
    M Source/WebCore/dom/Position.cpp
    M Source/WebCore/dom/Position.h
    M Source/WebCore/editing/Editing.cpp
    M Source/WebCore/editing/FrameSelection.cpp
    M Source/WebCore/editing/VisibleUnits.cpp
    M Source/WebCore/editing/cocoa/DataDetection.mm
    M Source/WebCore/page/EventHandler.cpp
    M Source/WebCore/page/EventHandler.h
    M Source/WebCore/page/LocalFrame.cpp
    M Source/WebCore/rendering/RenderBlock.cpp
    M Source/WebCore/rendering/RenderBlock.h
    M Source/WebCore/rendering/RenderBlockFlow.cpp
    M Source/WebCore/rendering/RenderBlockFlow.h
    M Source/WebCore/rendering/RenderBox.cpp
    M Source/WebCore/rendering/RenderBox.h
    M Source/WebCore/rendering/RenderFileUploadControl.cpp
    M Source/WebCore/rendering/RenderFileUploadControl.h
    M Source/WebCore/rendering/RenderFragmentContainer.cpp
    M Source/WebCore/rendering/RenderFragmentContainer.h
    M Source/WebCore/rendering/RenderInline.cpp
    M Source/WebCore/rendering/RenderInline.h
    M Source/WebCore/rendering/RenderLineBreak.cpp
    M Source/WebCore/rendering/RenderLineBreak.h
    M Source/WebCore/rendering/RenderMultiColumnSet.cpp
    M Source/WebCore/rendering/RenderMultiColumnSet.h
    M Source/WebCore/rendering/RenderObject.cpp
    M Source/WebCore/rendering/RenderObject.h
    M Source/WebCore/rendering/RenderReplaced.cpp
    M Source/WebCore/rendering/RenderReplaced.h
    M Source/WebCore/rendering/RenderText.cpp
    M Source/WebCore/rendering/RenderText.h
    M Source/WebCore/rendering/svg/RenderSVGInlineText.cpp
    M Source/WebCore/rendering/svg/RenderSVGInlineText.h
    M Source/WebCore/rendering/svg/RenderSVGText.cpp
    M Source/WebCore/rendering/svg/RenderSVGText.h
    M Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm

  Log Message:
  -----------
  document.caretPositionFromPoint returns null over SVG elements and elements 
with `-webkit-user-select: none`
https://bugs.webkit.org/show_bug.cgi?id=287472
rdar://145038689

Reviewed by Abrar Rahman Protyasha and Ryosuke Niwa.

`caretPositionFromPoint` is implemented using `RenderObject::positionForPoint`.
That method currently returns a `VisiblePosition`, which is created after
obtaining a `Position`. Then the `VisiblePosition` is converted back into a
`Position` for use by the Web API.

The above is problematic since `VisiblePosition`, canonicalizes the `Position`.
This means that for SVG elements and elements with `-webkit-user-select: none`,
the `Position` ends up being null. However, `caretPositionFromPoint` should not
exclude those elements. Both Chrome and Firefox return non-null values from
`caretPositionFromPoint` over those elements.

Additionally, the issue above ends up exposing UA shadow roots, as the null
Position in the shadow tree would simply be returned.

Fix by ensuring the Position is not canonicalized for the purpose of
`caretPositionFromPoint`. This is achieved by introducing `PositionWithAffinity`
and making `RenderObject::positionForPoint` return that object, rather than a
`VisiblePosition`. For all other uses, which need (or have historically used) a
`VisiblePosition`, `RenderObject::visiblePositionForPoint` may be used.

* LayoutTests/fast/shadow-dom/cannot-hit-test-into-shadow-media-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/cssom/caretPositionFromPoint-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/cssom/caretPositionFromPoint.html:
* Source/WebCore/accessibility/AccessibilityNodeObject.cpp:
(WebCore::AccessibilityNodeObject::visiblePositionRangeForLine const):
* Source/WebCore/accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::visiblePositionForPoint const):
* Source/WebCore/dom/Position.cpp:
(WebCore::Position::inlineBoxAndOffset const):
* Source/WebCore/dom/Position.h:
(WebCore::PositionWithAffinity::PositionWithAffinity):
(WebCore::PositionWithAffinity::position const):
(WebCore::PositionWithAffinity::affinity const):
* Source/WebCore/editing/Editing.cpp:
(WebCore::closestEditablePositionInElementForAbsolutePoint):
* Source/WebCore/editing/FrameSelection.cpp:
(WebCore::FrameSelection::contains const):
* Source/WebCore/editing/VisibleUnits.cpp:
(WebCore::previousLinePosition):
(WebCore::nextLinePosition):
* Source/WebCore/editing/cocoa/DataDetection.mm:
(WebCore::DataDetection::detectItemAroundHitTestResult):
* Source/WebCore/page/EventHandler.cpp:
(WebCore::EventHandler::selectClosestWordFromHitTestResult):
(WebCore::EventHandler::selectClosestContextualWordFromHitTestResult):
(WebCore::EventHandler::selectClosestContextualWordOrLinkFromHitTestResult):
(WebCore::EventHandler::handleMousePressEventTripleClick):
(WebCore::EventHandler::handleMousePressEventSingleClick):
(WebCore::EventHandler::selectionExtentRespectingEditingBoundary):
(WebCore::EventHandler::updateSelectionForMouseDrag):
(WebCore::EventHandler::handleMouseReleaseEvent):
* Source/WebCore/page/EventHandler.h:
* Source/WebCore/page/LocalFrame.cpp:
(WebCore::LocalFrame::visiblePositionForPoint const):
* Source/WebCore/rendering/RenderBlock.cpp:
(WebCore::positionForPointRespectingEditingBoundaries):
(WebCore::RenderBlock::positionForPointWithInlineChildren):
(WebCore::RenderBlock::positionForPoint):
* Source/WebCore/rendering/RenderBlock.h:
* Source/WebCore/rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::positionForPointWithInlineChildren):
(WebCore::RenderBlockFlow::positionForPoint):
* Source/WebCore/rendering/RenderBlockFlow.h:
* Source/WebCore/rendering/RenderBox.cpp:
(WebCore::RenderBox::positionForPoint):
* Source/WebCore/rendering/RenderBox.h:
* Source/WebCore/rendering/RenderFileUploadControl.cpp:
(WebCore::RenderFileUploadControl::positionForPoint):
* Source/WebCore/rendering/RenderFileUploadControl.h:
* Source/WebCore/rendering/RenderFragmentContainer.cpp:
(WebCore::RenderFragmentContainer::positionForPoint):
* Source/WebCore/rendering/RenderFragmentContainer.h:
* Source/WebCore/rendering/RenderInline.cpp:
(WebCore::RenderInline::positionForPoint):
* Source/WebCore/rendering/RenderInline.h:
* Source/WebCore/rendering/RenderLineBreak.cpp:
(WebCore::RenderLineBreak::positionForPoint):
* Source/WebCore/rendering/RenderLineBreak.h:
* Source/WebCore/rendering/RenderMultiColumnSet.cpp:
(WebCore::RenderMultiColumnSet::positionForPoint):
* Source/WebCore/rendering/RenderMultiColumnSet.h:
* Source/WebCore/rendering/RenderObject.cpp:
(WebCore::RenderObject::positionForPoint):
(WebCore::RenderObject::visiblePositionForPoint):
(WebCore::RenderObject::createPositionWithAffinity const):
(WebCore::RenderObject::createVisiblePosition const): Deleted.
* Source/WebCore/rendering/RenderObject.h:
* Source/WebCore/rendering/RenderReplaced.cpp:
(WebCore::RenderReplaced::paint):
* Source/WebCore/rendering/RenderReplaced.h:
* Source/WebCore/rendering/RenderText.cpp:
(WebCore::RenderText::positionForPoint):
(WebCore::createPositionWithAffinityForBox):
(WebCore::createPositionWithAffinityAfterAdjustingOffsetForBiDi):
(WebCore::createVisiblePositionForBox): Deleted.
(WebCore::createVisiblePositionAfterAdjustingOffsetForBiDi): Deleted.
* Source/WebCore/rendering/RenderText.h:
* Source/WebCore/rendering/svg/RenderSVGInlineText.cpp:
(WebCore::RenderSVGInlineText::positionForPoint):
* Source/WebCore/rendering/svg/RenderSVGInlineText.h:
* Source/WebCore/rendering/svg/RenderSVGText.cpp:
(WebCore::RenderSVGText::positionForPoint):
* Source/WebCore/rendering/svg/RenderSVGText.h:
* Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::selectionPositionInformation):

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



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

Reply via email to