Commit e4584af3 authored by Yoichi Osato's avatar Yoichi Osato Committed by Commit Bot

Order start and end before canonicalization in LayoutSelection::CalcSelection

This is preparation to split LayoutSelection start/end calculation w/o 
canonicalization.

Bug: 739062
Change-Id: I8574fec9a82433e0b7313499db2f3068d9388b22
Reviewed-on: https://chromium-review.googlesource.com/571523Reviewed-by: default avatarYoshifumi Inoue <yosin@chromium.org>
Commit-Queue: Yoshifumi Inoue <yosin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#486725}
parent cfee1fb0
...@@ -129,6 +129,17 @@ static SelectionMode ComputeSelectionMode( ...@@ -129,6 +129,17 @@ static SelectionMode ComputeSelectionMode(
return SelectionMode::kBlockCursor; return SelectionMode::kBlockCursor;
} }
static PositionInFlatTree FindFirstVisiblePosition(
const PositionInFlatTree& start) {
return MostForwardCaretPosition(
CreateVisiblePosition(start).DeepEquivalent());
}
static PositionInFlatTree FindLastVisiblePosition(
const PositionInFlatTree& end) {
return MostBackwardCaretPosition(CreateVisiblePosition(end).DeepEquivalent());
}
static EphemeralRangeInFlatTree CalcSelection( static EphemeralRangeInFlatTree CalcSelection(
const FrameSelection& frame_selection) { const FrameSelection& frame_selection) {
const SelectionInDOMTree& selection_in_dom = const SelectionInDOMTree& selection_in_dom =
...@@ -138,17 +149,23 @@ static EphemeralRangeInFlatTree CalcSelection( ...@@ -138,17 +149,23 @@ static EphemeralRangeInFlatTree CalcSelection(
return {}; return {};
case SelectionMode::kRange: { case SelectionMode::kRange: {
const PositionInFlatTree& base = const PositionInFlatTree& base =
CreateVisiblePosition(ToPositionInFlatTree(selection_in_dom.Base())) ToPositionInFlatTree(selection_in_dom.Base());
.DeepEquivalent();
const PositionInFlatTree& extent = const PositionInFlatTree& extent =
CreateVisiblePosition(ToPositionInFlatTree(selection_in_dom.Extent())) ToPositionInFlatTree(selection_in_dom.Extent());
.DeepEquivalent();
if (base.IsNull() || extent.IsNull() || base == extent) if (base.IsNull() || extent.IsNull() || base == extent)
return {}; return {};
const bool base_is_first = base.CompareTo(extent) <= 0; const bool base_is_first = base.CompareTo(extent) <= 0;
const PositionInFlatTree& start = base_is_first ? base : extent; const PositionInFlatTree& start = base_is_first ? base : extent;
const PositionInFlatTree& end = base_is_first ? extent : base; const PositionInFlatTree& end = base_is_first ? extent : base;
return {MostForwardCaretPosition(start), MostBackwardCaretPosition(end)}; const PositionInFlatTree& visible_start = FindFirstVisiblePosition(start);
const PositionInFlatTree& visible_end = FindLastVisiblePosition(end);
if (visible_start.IsNull() || visible_end.IsNull())
return {};
// This case happens if we have
// <div>foo<div style="visibility:hidden">^bar|</div>baz</div>.
if (visible_start >= visible_end)
return {};
return {visible_start, visible_end};
} }
case SelectionMode::kBlockCursor: { case SelectionMode::kBlockCursor: {
const PositionInFlatTree& base = const PositionInFlatTree& base =
......
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