| Index: third_party/WebKit/Source/core/editing/VisibleUnits.cpp
|
| diff --git a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
|
| index a85060b7ce61a98969a30be26fef8ab3bd2c3cce..46edace66618e3c8e9724a8a9e6be011a28d2e94 100644
|
| --- a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
|
| +++ b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
|
| @@ -40,6 +40,7 @@
|
| #include "core/editing/VisiblePosition.h"
|
| #include "core/editing/iterators/BackwardsCharacterIterator.h"
|
| #include "core/editing/iterators/CharacterIterator.h"
|
| +#include "core/editing/iterators/ForwardsTextBuffer.h"
|
| #include "core/editing/iterators/SimplifiedBackwardsTextIterator.h"
|
| #include "core/editing/iterators/TextIterator.h"
|
| #include "core/frame/LocalFrame.h"
|
| @@ -666,16 +667,17 @@ static VisiblePositionTemplate<Strategy> previousBoundary(const VisiblePositionT
|
| const PositionTemplate<Strategy> start = PositionTemplate<Strategy>::editingPositionOf(boundary, 0).parentAnchoredEquivalent();
|
| const PositionTemplate<Strategy> end = pos.parentAnchoredEquivalent();
|
|
|
| - Vector<UChar, 1024> string;
|
| + ForwardsTextBuffer suffixString;
|
| unsigned suffixLength = 0;
|
|
|
| if (requiresContextForWordBoundary(characterBefore(c))) {
|
| TextIteratorAlgorithm<Strategy> forwardsIterator(end, PositionTemplate<Strategy>::afterNode(boundary));
|
| while (!forwardsIterator.atEnd()) {
|
| - Vector<UChar, 1024> characters;
|
| - forwardsIterator.copyTextTo(characters);
|
| + // TODO(xiaochengh): Eliminate this intermediate buffer.
|
| + ForwardsTextBuffer characters;
|
| + forwardsIterator.copyTextTo(&characters);
|
| int i = endOfFirstWordBoundaryContext(characters.data(), characters.size());
|
| - string.append(characters.data(), i);
|
| + suffixString.pushRange(characters.data(), i);
|
| suffixLength += i;
|
| if (static_cast<unsigned>(i) < characters.size())
|
| break;
|
| @@ -683,6 +685,9 @@ static VisiblePositionTemplate<Strategy> previousBoundary(const VisiblePositionT
|
| }
|
| }
|
|
|
| + Vector<UChar, 1024> string;
|
| + string.append(suffixString.data(), suffixString.size());
|
| +
|
| SimplifiedBackwardsTextIteratorAlgorithm<Strategy> it(start, end);
|
| unsigned next = 0;
|
| bool needMoreContext = false;
|
| @@ -746,19 +751,20 @@ static VisiblePositionTemplate<Strategy> nextBoundary(const VisiblePositionTempl
|
| Document& d = boundary->document();
|
| const PositionTemplate<Strategy> start(pos.parentAnchoredEquivalent());
|
|
|
| - Vector<UChar, 1024> string;
|
| + Vector<UChar, 1024> prefixString;
|
| unsigned prefixLength = 0;
|
|
|
| if (requiresContextForWordBoundary(characterAfter(c))) {
|
| SimplifiedBackwardsTextIteratorAlgorithm<Strategy> backwardsIterator(PositionTemplate<Strategy>::firstPositionInNode(&d), start);
|
| while (!backwardsIterator.atEnd()) {
|
| + // TODO(xiaochengh): Eliminate this intermediate buffer.
|
| Vector<UChar, 1024> characters;
|
| backwardsIterator.copyTextTo(characters);
|
| int length = characters.size();
|
| int i = startOfLastWordBoundaryContext(characters.data(), length);
|
| // TODO(xiaochengh): Iterative prepending has quadratic running
|
| // time in the worst case. Should improve it to linear.
|
| - string.prepend(characters.data() + i, length - i);
|
| + prefixString.prepend(characters.data() + i, length - i);
|
| prefixLength += length - i;
|
| if (i > 0)
|
| break;
|
| @@ -766,6 +772,9 @@ static VisiblePositionTemplate<Strategy> nextBoundary(const VisiblePositionTempl
|
| }
|
| }
|
|
|
| + ForwardsTextBuffer string;
|
| + string.pushRange(prefixString.data(), prefixString.size());
|
| +
|
| const PositionTemplate<Strategy> searchStart = PositionTemplate<Strategy>::editingPositionOf(start.anchorNode(), start.offsetInContainerNode());
|
| const PositionTemplate<Strategy> searchEnd = PositionTemplate<Strategy>::lastPositionInNode(boundary);
|
| TextIteratorAlgorithm<Strategy> it(searchStart, searchEnd, TextIteratorEmitsCharactersBetweenAllVisiblePositions);
|
| @@ -779,13 +788,11 @@ static VisiblePositionTemplate<Strategy> nextBoundary(const VisiblePositionTempl
|
| // it.
|
| bool inTextSecurityMode = it.isInTextSecurityMode();
|
| if (!inTextSecurityMode) {
|
| - it.copyTextTo(string);
|
| + it.copyTextTo(&string);
|
| } else {
|
| // Treat bullets used in the text security mode as regular
|
| // characters when looking for boundaries
|
| - Vector<UChar, 1024> iteratorString;
|
| - iteratorString.fill('x', it.length());
|
| - string.append(iteratorString.data(), iteratorString.size());
|
| + string.pushCharacters('x', it.length());
|
| }
|
| next = searchFunction(string.data(), string.size(), offset, MayHaveMoreContext, needMoreContext);
|
| if (next != string.size())
|
|
|