| 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()) | 
|  |