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 { ...@@ -104,7 +104,7 @@ unsigned char RenderedPosition::BidiLevelOnRight() const {
} }
RenderedPosition RenderedPosition::LeftBoundaryOfBidiRun( 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()) if (!inline_box_ || bidi_level_of_run > inline_box_->BidiLevel())
return RenderedPosition(); return RenderedPosition();
...@@ -115,7 +115,7 @@ RenderedPosition RenderedPosition::LeftBoundaryOfBidiRun( ...@@ -115,7 +115,7 @@ RenderedPosition RenderedPosition::LeftBoundaryOfBidiRun(
} }
RenderedPosition RenderedPosition::RightBoundaryOfBidiRun( 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()) if (!inline_box_ || bidi_level_of_run > inline_box_->BidiLevel())
return RenderedPosition(); return RenderedPosition();
......
...@@ -60,8 +60,9 @@ class CORE_EXPORT RenderedPosition { ...@@ -60,8 +60,9 @@ class CORE_EXPORT RenderedPosition {
unsigned char BidiLevelOnLeft() const; unsigned char BidiLevelOnLeft() const;
unsigned char BidiLevelOnRight() const; unsigned char BidiLevelOnRight() const;
RenderedPosition LeftBoundaryOfBidiRun(unsigned char bidi_level_of_run); RenderedPosition LeftBoundaryOfBidiRun(unsigned char bidi_level_of_run) const;
RenderedPosition RightBoundaryOfBidiRun(unsigned char bidi_level_of_run); RenderedPosition RightBoundaryOfBidiRun(
unsigned char bidi_level_of_run) const;
enum ShouldMatchBidiLevel { kMatchBidiLevel, kIgnoreBidiLevel }; enum ShouldMatchBidiLevel { kMatchBidiLevel, kIgnoreBidiLevel };
bool AtLeftBoundaryOfBidiRun() const { bool AtLeftBoundaryOfBidiRun() const {
......
...@@ -764,6 +764,32 @@ void SelectionController::SelectClosestWordOrLinkFromMouseEvent( ...@@ -764,6 +764,32 @@ void SelectionController::SelectClosestWordOrLinkFromMouseEvent(
.Build()); .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( static SelectionInFlatTree AdjustEndpointsAtBidiBoundary(
const VisiblePositionInFlatTree& visible_base, const VisiblePositionInFlatTree& visible_base,
const VisiblePositionInFlatTree& visible_extent) { const VisiblePositionInFlatTree& visible_extent) {
...@@ -782,47 +808,25 @@ static SelectionInFlatTree AdjustEndpointsAtBidiBoundary( ...@@ -782,47 +808,25 @@ static SelectionInFlatTree AdjustEndpointsAtBidiBoundary(
if (base.IsNull() || extent.IsNull() || base == extent) if (base.IsNull() || extent.IsNull() || base == extent)
return unchanged_selection; return unchanged_selection;
if (base.AtLeftBoundaryOfBidiRun()) { if (base.AtLeftBoundaryOfBidiRun() || base.AtRightBoundaryOfBidiRun()) {
if (!extent.AtRightBoundaryOfBidiRun(base.BidiLevelOnRight()) && if (ShouldAdjustBaseAtBidiBoundary(base, extent)) {
base == extent.LeftBoundaryOfBidiRun(base.BidiLevelOnRight())) { const PositionInFlatTree adjusted_base =
CreateVisiblePosition(base.GetPosition()).DeepEquivalent();
return SelectionInFlatTree::Builder() return SelectionInFlatTree::Builder()
.SetBaseAndExtent( .SetBaseAndExtent(adjusted_base, visible_extent.DeepEquivalent())
CreateVisiblePosition(base.GetPosition()).DeepEquivalent(),
visible_extent.DeepEquivalent())
.Build(); .Build();
} }
return unchanged_selection; return unchanged_selection;
} }
if (base.AtRightBoundaryOfBidiRun()) { if (ShouldAdjustExtentAtBidiBoundary(base, extent)) {
if (!extent.AtLeftBoundaryOfBidiRun(base.BidiLevelOnLeft()) && const PositionInFlatTree adjusted_extent =
base == extent.RightBoundaryOfBidiRun(base.BidiLevelOnLeft())) { CreateVisiblePosition(extent.GetPosition()).DeepEquivalent();
return SelectionInFlatTree::Builder()
.SetBaseAndExtent(
CreateVisiblePosition(base.GetPosition()).DeepEquivalent(),
visible_extent.DeepEquivalent())
.Build();
}
return unchanged_selection;
}
if (extent.AtLeftBoundaryOfBidiRun() &&
extent == base.LeftBoundaryOfBidiRun(extent.BidiLevelOnRight())) {
return SelectionInFlatTree::Builder() return SelectionInFlatTree::Builder()
.SetBaseAndExtent( .SetBaseAndExtent(visible_base.DeepEquivalent(), adjusted_extent)
visible_base.DeepEquivalent(),
CreateVisiblePosition(extent.GetPosition()).DeepEquivalent())
.Build(); .Build();
} }
if (extent.AtRightBoundaryOfBidiRun() &&
extent == base.RightBoundaryOfBidiRun(extent.BidiLevelOnLeft())) {
return SelectionInFlatTree::Builder()
.SetBaseAndExtent(
visible_base.DeepEquivalent(),
CreateVisiblePosition(extent.GetPosition()).DeepEquivalent())
.Build();
}
return unchanged_selection; 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