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

Refactor bidi adjustment code in SelectionController

This patch refactors bidi adjustment code in SelectonController by
introducing ShouldAdjustBase/ExtentAtBidiBoundary(), so that
adjustment criteria and adjustment result computation are separated.

Bug: 811502
Change-Id: I197322426f1f108c9aeae971c599b5bff5a7fc46
Reviewed-on: https://chromium-review.googlesource.com/1053122Reviewed-by: default avatarYoichi Osato <yoichio@chromium.org>
Commit-Queue: Xiaocheng Hu <xiaochengh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#558179}
parent c93faebd
......@@ -104,7 +104,7 @@ unsigned char RenderedPosition::BidiLevelOnRight() const {
}
RenderedPosition RenderedPosition::LeftBoundaryOfBidiRun(
unsigned char bidi_level_of_run) {
unsigned char bidi_level_of_run) const {
if (!inline_box_ || bidi_level_of_run > inline_box_->BidiLevel())
return RenderedPosition();
......@@ -115,7 +115,7 @@ RenderedPosition RenderedPosition::LeftBoundaryOfBidiRun(
}
RenderedPosition RenderedPosition::RightBoundaryOfBidiRun(
unsigned char bidi_level_of_run) {
unsigned char bidi_level_of_run) const {
if (!inline_box_ || bidi_level_of_run > inline_box_->BidiLevel())
return RenderedPosition();
......
......@@ -60,8 +60,9 @@ class CORE_EXPORT RenderedPosition {
unsigned char BidiLevelOnLeft() const;
unsigned char BidiLevelOnRight() const;
RenderedPosition LeftBoundaryOfBidiRun(unsigned char bidi_level_of_run);
RenderedPosition RightBoundaryOfBidiRun(unsigned char bidi_level_of_run);
RenderedPosition LeftBoundaryOfBidiRun(unsigned char bidi_level_of_run) const;
RenderedPosition RightBoundaryOfBidiRun(
unsigned char bidi_level_of_run) const;
enum ShouldMatchBidiLevel { kMatchBidiLevel, kIgnoreBidiLevel };
bool AtLeftBoundaryOfBidiRun() const {
......
......@@ -764,6 +764,32 @@ void SelectionController::SelectClosestWordOrLinkFromMouseEvent(
.Build());
}
static bool ShouldAdjustBaseAtBidiBoundary(const RenderedPosition& base,
const RenderedPosition& extent) {
if (base.AtLeftBoundaryOfBidiRun()) {
return !extent.AtRightBoundaryOfBidiRun(base.BidiLevelOnRight()) &&
base == extent.LeftBoundaryOfBidiRun(base.BidiLevelOnRight());
}
if (base.AtRightBoundaryOfBidiRun()) {
return !extent.AtLeftBoundaryOfBidiRun(base.BidiLevelOnLeft()) &&
base == extent.RightBoundaryOfBidiRun(base.BidiLevelOnLeft());
}
return false;
}
static bool ShouldAdjustExtentAtBidiBoundary(const RenderedPosition& base,
const RenderedPosition& extent) {
if (extent.AtLeftBoundaryOfBidiRun())
return extent == base.LeftBoundaryOfBidiRun(extent.BidiLevelOnRight());
if (extent.AtRightBoundaryOfBidiRun())
return extent == base.RightBoundaryOfBidiRun(extent.BidiLevelOnLeft());
return false;
}
static SelectionInFlatTree AdjustEndpointsAtBidiBoundary(
const VisiblePositionInFlatTree& visible_base,
const VisiblePositionInFlatTree& visible_extent) {
......@@ -782,47 +808,25 @@ static SelectionInFlatTree AdjustEndpointsAtBidiBoundary(
if (base.IsNull() || extent.IsNull() || base == extent)
return unchanged_selection;
if (base.AtLeftBoundaryOfBidiRun()) {
if (!extent.AtRightBoundaryOfBidiRun(base.BidiLevelOnRight()) &&
base == extent.LeftBoundaryOfBidiRun(base.BidiLevelOnRight())) {
if (base.AtLeftBoundaryOfBidiRun() || base.AtRightBoundaryOfBidiRun()) {
if (ShouldAdjustBaseAtBidiBoundary(base, extent)) {
const PositionInFlatTree adjusted_base =
CreateVisiblePosition(base.GetPosition()).DeepEquivalent();
return SelectionInFlatTree::Builder()
.SetBaseAndExtent(
CreateVisiblePosition(base.GetPosition()).DeepEquivalent(),
visible_extent.DeepEquivalent())
.SetBaseAndExtent(adjusted_base, visible_extent.DeepEquivalent())
.Build();
}
return unchanged_selection;
}
if (base.AtRightBoundaryOfBidiRun()) {
if (!extent.AtLeftBoundaryOfBidiRun(base.BidiLevelOnLeft()) &&
base == extent.RightBoundaryOfBidiRun(base.BidiLevelOnLeft())) {
return SelectionInFlatTree::Builder()
.SetBaseAndExtent(
CreateVisiblePosition(base.GetPosition()).DeepEquivalent(),
visible_extent.DeepEquivalent())
.Build();
}
return unchanged_selection;
}
if (extent.AtLeftBoundaryOfBidiRun() &&
extent == base.LeftBoundaryOfBidiRun(extent.BidiLevelOnRight())) {
if (ShouldAdjustExtentAtBidiBoundary(base, extent)) {
const PositionInFlatTree adjusted_extent =
CreateVisiblePosition(extent.GetPosition()).DeepEquivalent();
return SelectionInFlatTree::Builder()
.SetBaseAndExtent(
visible_base.DeepEquivalent(),
CreateVisiblePosition(extent.GetPosition()).DeepEquivalent())
.SetBaseAndExtent(visible_base.DeepEquivalent(), adjusted_extent)
.Build();
}
if (extent.AtRightBoundaryOfBidiRun() &&
extent == base.RightBoundaryOfBidiRun(extent.BidiLevelOnLeft())) {
return SelectionInFlatTree::Builder()
.SetBaseAndExtent(
visible_base.DeepEquivalent(),
CreateVisiblePosition(extent.GetPosition()).DeepEquivalent())
.Build();
}
return unchanged_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