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