Skip to content

Commit

Permalink
caretRangeFromPoint returns bad results near input type checkbox or r…
Browse files Browse the repository at this point in the history
…adio in Strict Mode

caretRangeFromPoint returns bad results near input type checkbox or radio in Strict Mode
https://bugs.webkit.org/show_bug.cgi?id=246892

Reviewed by Ryosuke Niwa.

Merge - https://src.chromium.org/viewvc/blink?view=revision&revision=157506

This patch changes RenderBlock::positionForPoint() to check out of bound position. When document is no quirk mode, RenderBlock::positionForPoint() gets a position which is out side of RenderBlock due by condition in RenderBlock::positionForPointWithInlineChildren().

* Source/WebCore/rendering/RenderBlock.cpp:
(RenderBlock::positionForPoint): Add Out of Bound checks
* LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-with-checkbox.html: Added Test Case
* LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-with-checkbox-expected.txt: Added Test Case Expectations

Canonical link: https://commits.webkit.org/255886@main
  • Loading branch information
Ahmad-S792 authored and Ahmad Saleem committed Oct 22, 2022
1 parent b726ba4 commit 806c01f
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 2 deletions.
@@ -0,0 +1,8 @@
PASS result.startContainer.tagName is "DIV"
PASS result.startOffset is 1
PASS result.startContainer is result.endContainer
PASS result.startOffset is result.endOffset
PASS successfullyParsed is true

TEST COMPLETE

@@ -0,0 +1,13 @@
<!DOCTYPE html>
<div id="container"><input type=checkbox></div>
<div id="console"></div>
<script src="../../../../resources/js-test.js"></script>
<script>
var result = document.caretRangeFromPoint(40, 20);
shouldBeEqualToString('result.startContainer.tagName', 'DIV');
shouldBe('result.startOffset', '1');
shouldBe('result.startContainer', 'result.endContainer');
shouldBe('result.startOffset', 'result.endOffset');
if (window.testRunner)
document.getElementById('container').outerHTML = '';
</script>
8 changes: 6 additions & 2 deletions Source/WebCore/rendering/RenderBlock.cpp
Expand Up @@ -2208,9 +2208,13 @@ VisiblePosition RenderBlock::positionForPoint(const LayoutPoint& point, const Re
LayoutUnit pointLogicalLeft = isHorizontalWritingMode() ? point.x() : point.y();
LayoutUnit pointLogicalTop = isHorizontalWritingMode() ? point.y() : point.x();

if (pointLogicalTop < 0 || (pointLogicalTop < logicalHeight() && pointLogicalLeft < 0))
if (pointLogicalTop < 0)
return createVisiblePosition(caretMinOffset(), Affinity::Downstream);
if (pointLogicalTop >= logicalHeight() || (pointLogicalTop >= 0 && pointLogicalLeft >= logicalWidth()))
if (pointLogicalLeft >= logicalWidth())
return createVisiblePosition(caretMaxOffset(), Affinity::Downstream);
if (pointLogicalTop < 0)
return createVisiblePosition(caretMinOffset(), Affinity::Downstream);
if (pointLogicalTop >= logicalHeight())
return createVisiblePosition(caretMaxOffset(), Affinity::Downstream);
}
if (isFlexibleBoxIncludingDeprecated() || isRenderGrid())
Expand Down

0 comments on commit 806c01f

Please sign in to comment.