Commit 11cd2e95 authored by Xiaocheng Hu's avatar Xiaocheng Hu Committed by Commit Bot

Refactor SelectionModifier's internal function DirectionOf()

This patch refactors the function by extracing DirectionAt() out of it,
so that the logic of getting direction from VisiblePosition is
abstracted. It also reduces one client of InlineBox, making it easier to
transition to LayoutNG.

Bug: 877263
Cq-Include-Trybots: luci.chromium.try:linux_layout_tests_layout_ng
Change-Id: Ifba556e3fb03b7bfa6e4ed27df5e39d07a45eb7c
Reviewed-on: https://chromium-review.googlesource.com/1187630Reviewed-by: default avatarYoichi Osato <yoichio@chromium.org>
Reviewed-by: default avatarYoshifumi Inoue <yosin@chromium.org>
Commit-Queue: Xiaocheng Hu <xiaochengh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#585701}
parent 6b6a65f4
...@@ -137,23 +137,30 @@ TextDirection SelectionModifier::DirectionOfEnclosingBlock() const { ...@@ -137,23 +137,30 @@ TextDirection SelectionModifier::DirectionOfEnclosingBlock() const {
: TextDirection::kLtr; : TextDirection::kLtr;
} }
static TextDirection DirectionOf(const VisibleSelection& visible_selection) { namespace {
const InlineBox* start_box = nullptr;
const InlineBox* end_box = nullptr; base::Optional<TextDirection> DirectionAt(const VisiblePosition& position) {
// Cache the VisiblePositions because visibleStart() and visibleEnd() if (position.IsNull())
// can cause layout, which has the potential to invalidate lineboxes. return base::nullopt;
const VisiblePosition& start_position = visible_selection.VisibleStart(); if (const InlineBox* box = ComputeInlineBoxPosition(position).inline_box)
const VisiblePosition& end_position = visible_selection.VisibleEnd(); return box->Direction();
if (start_position.IsNotNull()) return base::nullopt;
start_box = ComputeInlineBoxPosition(start_position).inline_box; }
if (end_position.IsNotNull())
end_box = ComputeInlineBoxPosition(end_position).inline_box; TextDirection DirectionOf(const VisibleSelection& visible_selection) {
if (start_box && end_box && start_box->Direction() == end_box->Direction()) base::Optional<TextDirection> maybe_start_direction =
return start_box->Direction(); DirectionAt(visible_selection.VisibleStart());
base::Optional<TextDirection> maybe_end_direction =
DirectionAt(visible_selection.VisibleEnd());
if (maybe_start_direction.has_value() && maybe_end_direction.has_value() &&
maybe_start_direction.value() == maybe_end_direction.value())
return maybe_start_direction.value();
return DirectionOfEnclosingBlockOf(visible_selection.Extent()); return DirectionOfEnclosingBlockOf(visible_selection.Extent());
} }
} // namespace
TextDirection SelectionModifier::DirectionOfSelection() const { TextDirection SelectionModifier::DirectionOfSelection() const {
return DirectionOf(selection_); return DirectionOf(selection_);
} }
......
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