| Index: third_party/WebKit/Source/core/editing/InlineBoxTraversal.cpp
|
| diff --git a/third_party/WebKit/Source/core/editing/InlineBoxTraversal.cpp b/third_party/WebKit/Source/core/editing/InlineBoxTraversal.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f85c063f9600c5516641a6243309a8fe79ddfda5
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/core/editing/InlineBoxTraversal.cpp
|
| @@ -0,0 +1,117 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "core/editing/InlineBoxTraversal.h"
|
| +
|
| +#include "core/layout/line/InlineBox.h"
|
| +
|
| +namespace blink {
|
| +
|
| +namespace {
|
| +
|
| +// "Left" Traversal strategy
|
| +struct TraverseLeft {
|
| + STATIC_ONLY(TraverseLeft);
|
| +
|
| + static InlineBox* Forward(const InlineBox& inline_box) {
|
| + return inline_box.PrevLeafChild();
|
| + }
|
| +};
|
| +
|
| +// "Left" Traversal strategy ignoring line break
|
| +struct TraverseLeftIgnoringLineBreak {
|
| + STATIC_ONLY(TraverseLeftIgnoringLineBreak);
|
| +
|
| + static InlineBox* Forward(const InlineBox& inline_box) {
|
| + return inline_box.PrevLeafChildIgnoringLineBreak();
|
| + }
|
| +};
|
| +
|
| +// "Right" Traversal strategy
|
| +struct TraverseRight {
|
| + STATIC_ONLY(TraverseRight);
|
| +
|
| + static InlineBox* Forward(const InlineBox& inline_box) {
|
| + return inline_box.NextLeafChild();
|
| + }
|
| +};
|
| +
|
| +// "Right" Traversal strategy ignoring line break
|
| +struct TraverseRightIgnoringLineBreak {
|
| + STATIC_ONLY(TraverseRightIgnoringLineBreak);
|
| +
|
| + static InlineBox* Forward(const InlineBox& inline_box) {
|
| + return inline_box.NextLeafChildIgnoringLineBreak();
|
| + }
|
| +};
|
| +
|
| +template <typename TraversalStrategy>
|
| +InlineBox* FindBoudnaryOfBidiRun(const InlineBox& start, unsigned bidi_level) {
|
| + InlineBox* result = const_cast<InlineBox*>(&start);
|
| + for (InlineBox* runner = TraversalStrategy::Forward(start); runner;
|
| + runner = TraversalStrategy::Forward(*runner)) {
|
| + if (runner->BidiLevel() <= bidi_level)
|
| + return result;
|
| + result = runner;
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +template <typename TraversalStrategy>
|
| +InlineBox* FindBoudnaryOfEntireBidiRun(const InlineBox& start,
|
| + unsigned bidi_level) {
|
| + InlineBox* result = const_cast<InlineBox*>(&start);
|
| + for (InlineBox* runner = TraversalStrategy::Forward(start); runner;
|
| + runner = TraversalStrategy::Forward(*runner)) {
|
| + if (runner->BidiLevel() < bidi_level)
|
| + return result;
|
| + result = runner;
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +InlineBox* InlineBoxTraversal::FindLeftBoundaryOfBidiRunIgnoringLineBreak(
|
| + const InlineBox& inline_box,
|
| + unsigned bidi_level) {
|
| + return FindBoudnaryOfBidiRun<TraverseLeftIgnoringLineBreak>(inline_box,
|
| + bidi_level);
|
| +}
|
| +
|
| +InlineBox* InlineBoxTraversal::FindLeftBoundaryOfEntireBidiRun(
|
| + const InlineBox& inline_box,
|
| + unsigned bidi_level) {
|
| + return FindBoudnaryOfEntireBidiRun<TraverseLeft>(inline_box, bidi_level);
|
| +}
|
| +
|
| +InlineBox* InlineBoxTraversal::FindLeftBoundaryOfEntireBidiRunIgnoringLineBreak(
|
| + const InlineBox& inline_box,
|
| + unsigned bidi_level) {
|
| + return FindBoudnaryOfEntireBidiRun<TraverseLeftIgnoringLineBreak>(inline_box,
|
| + bidi_level);
|
| +}
|
| +
|
| +InlineBox* InlineBoxTraversal::FindRightBoundaryOfBidiRunIgnoringLineBreak(
|
| + const InlineBox& inline_box,
|
| + unsigned bidi_level) {
|
| + return FindBoudnaryOfBidiRun<TraverseRightIgnoringLineBreak>(inline_box,
|
| + bidi_level);
|
| +}
|
| +
|
| +InlineBox* InlineBoxTraversal::FindRightBoundaryOfEntireBidiRun(
|
| + const InlineBox& inline_box,
|
| + unsigned bidi_level) {
|
| + return FindBoudnaryOfEntireBidiRun<TraverseRight>(inline_box, bidi_level);
|
| +}
|
| +
|
| +InlineBox*
|
| +InlineBoxTraversal::FindRightBoundaryOfEntireBidiRunIgnoringLineBreak(
|
| + const InlineBox& inline_box,
|
| + unsigned bidi_level) {
|
| + return FindBoudnaryOfEntireBidiRun<TraverseRightIgnoringLineBreak>(
|
| + inline_box, bidi_level);
|
| +}
|
| +
|
| +} // namespace blink
|
|
|