Commit bb08a30b authored by Xiaocheng Hu's avatar Xiaocheng Hu Committed by Commit Bot

[LayoutNG] Set the correct TextAffinity for PositionForPoint0

This patch implements the behavior that, when clicking at the end of
a line, we set an upstream caret selection to indicate that the
the selection is at the end of the first line instead of the beginning
of the second line, though they may have the same DOM position.

This patch fixes accessibility/selection-affinity.html, whose failure
is no longer relevant to Range.getClientRects().

Bug: 811502
Cq-Include-Trybots: luci.chromium.try:linux_layout_tests_layout_ng;luci.chromium.try:linux_layout_tests_slimming_paint_v2;master.tryserver.blink:linux_trusty_blink_rel
Change-Id: I0e2d9a9b93e9371a0fb604a0550a376b6035e09d
Reviewed-on: https://chromium-review.googlesource.com/1111466
Commit-Queue: Xiaocheng Hu <xiaochengh@chromium.org>
Reviewed-by: default avatarYoshifumi Inoue <yosin@chromium.org>
Reviewed-by: default avatarKoji Ishii <kojii@chromium.org>
Cr-Commit-Position: refs/heads/master@{#569550}
parent 1da26f5e
# These tests currently fail when they run with --enable-blink-features=LayoutNG # These tests currently fail when they run with --enable-blink-features=LayoutNG
# See https://crbug.com/591099. # See https://crbug.com/591099.
# Need support for Range.getClientRects() and Range.getBoundingClientRect()
crbug.com/755750 accessibility/selection-affinity.html [ Failure ]
# Non-interoperable behavior not worth to fix. # Non-interoperable behavior not worth to fix.
crbug.com/591099 fast/text/apply-start-width-after-skipped-text.html [ Skip ] crbug.com/591099 fast/text/apply-start-width-after-skipped-text.html [ Skip ]
......
...@@ -289,25 +289,40 @@ NGCaretPosition ComputeNGCaretPosition(const PositionWithAffinity& position) { ...@@ -289,25 +289,40 @@ NGCaretPosition ComputeNGCaretPosition(const PositionWithAffinity& position) {
} }
Position NGCaretPosition::ToPositionInDOMTree() const { Position NGCaretPosition::ToPositionInDOMTree() const {
return ToPositionInDOMTreeWithAffinity().GetPosition();
}
PositionWithAffinity NGCaretPosition::ToPositionInDOMTreeWithAffinity() const {
if (!fragment) if (!fragment)
return Position(); return PositionWithAffinity();
switch (position_type) { switch (position_type) {
case NGCaretPositionType::kBeforeBox: case NGCaretPositionType::kBeforeBox:
if (!fragment->GetNode()) if (!fragment->GetNode())
return Position(); return PositionWithAffinity();
return Position::BeforeNode(*fragment->GetNode()); return PositionWithAffinity(Position::BeforeNode(*fragment->GetNode()),
TextAffinity::kDownstream);
case NGCaretPositionType::kAfterBox: case NGCaretPositionType::kAfterBox:
if (!fragment->GetNode()) if (!fragment->GetNode())
return Position(); return PositionWithAffinity();
return Position::AfterNode(*fragment->GetNode()); return PositionWithAffinity(Position::AfterNode(*fragment->GetNode()),
TextAffinity::kUpstreamIfPossible);
case NGCaretPositionType::kAtTextOffset: case NGCaretPositionType::kAtTextOffset:
DCHECK(text_offset.has_value()); DCHECK(text_offset.has_value());
const NGOffsetMapping* mapping = const NGOffsetMapping* mapping =
NGOffsetMapping::GetFor(fragment->GetLayoutObject()); NGOffsetMapping::GetFor(fragment->GetLayoutObject());
return mapping->GetFirstPosition(*text_offset); const Position position = mapping->GetFirstPosition(*text_offset);
if (position.IsNull())
return PositionWithAffinity();
const NGPhysicalTextFragment& text_fragment =
ToNGPhysicalTextFragment(fragment->PhysicalFragment());
const TextAffinity affinity =
text_offset.value() == text_fragment.EndOffset()
? TextAffinity::kUpstreamIfPossible
: TextAffinity::kDownstream;
return PositionWithAffinity(position, affinity);
} }
NOTREACHED(); NOTREACHED();
return Position(); return PositionWithAffinity();
} }
} // namespace blink } // namespace blink
...@@ -32,6 +32,7 @@ struct NGCaretPosition { ...@@ -32,6 +32,7 @@ struct NGCaretPosition {
bool IsNull() const { return !fragment; } bool IsNull() const { return !fragment; }
Position ToPositionInDOMTree() const; Position ToPositionInDOMTree() const;
PositionWithAffinity ToPositionInDOMTreeWithAffinity() const;
const NGPaintFragment* fragment = nullptr; // owned by root LayoutNGMixin const NGPaintFragment* fragment = nullptr; // owned by root LayoutNGMixin
NGCaretPositionType position_type; NGCaretPositionType position_type;
......
...@@ -439,16 +439,12 @@ PositionWithAffinity NGPaintFragment::PositionForPointInText( ...@@ -439,16 +439,12 @@ PositionWithAffinity NGPaintFragment::PositionForPointInText(
text_offset < text_fragment.EndOffset()) { text_offset < text_fragment.EndOffset()) {
const Position position = NGOffsetMapping::GetFor(GetLayoutObject()) const Position position = NGOffsetMapping::GetFor(GetLayoutObject())
->GetFirstPosition(text_offset); ->GetFirstPosition(text_offset);
// TODO(xiaochengh): Adjust TextAffinity.
return PositionWithAffinity(position, TextAffinity::kDownstream); return PositionWithAffinity(position, TextAffinity::kDownstream);
} }
const NGCaretPosition unadjusted_position{ const NGCaretPosition unadjusted_position{
this, NGCaretPositionType::kAtTextOffset, text_offset}; this, NGCaretPositionType::kAtTextOffset, text_offset};
const Position adjusted_position = return BidiAdjustment::AdjustForHitTest(unadjusted_position)
BidiAdjustment::AdjustForHitTest(unadjusted_position) .ToPositionInDOMTreeWithAffinity();
.ToPositionInDOMTree();
// TODO(xiaochengh): Adjust TextAffinity.
return PositionWithAffinity(adjusted_position, TextAffinity::kDownstream);
} }
PositionWithAffinity NGPaintFragment::PositionForPointInInlineLevelBox( PositionWithAffinity NGPaintFragment::PositionForPointInInlineLevelBox(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment