Commit 58cb97c4 authored by Xiaocheng Hu's avatar Xiaocheng Hu Committed by Commit Bot

Make PreviousSentencePosition utilize TextSegments class

This patch changes |PreviousSentencePosition()| to utilize
|TextSegments| class to make it work with LayoutNG.

Since the original implementation is a duplicate of
|StartOfSentence|, so is the new implementation.

Bug: 778507
Change-Id: I7ba9fe19c74ff87c121d6c2bfce7f28765976ca1
Reviewed-on: https://chromium-review.googlesource.com/c/1337282
Commit-Queue: Xiaocheng Hu <xiaochengh@chromium.org>
Reviewed-by: default avatarYoichi Osato <yoichio@chromium.org>
Reviewed-by: default avatarYoshifumi Inoue <yosin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#610244}
parent cb42e2ae
...@@ -40,16 +40,36 @@ namespace blink { ...@@ -40,16 +40,36 @@ namespace blink {
namespace { namespace {
unsigned PreviousSentencePositionBoundary(const UChar* characters, PositionInFlatTree PreviousSentencePositionInternal(
unsigned length, const PositionInFlatTree& position) {
unsigned, class Finder final : public TextSegments::Finder {
BoundarySearchContextAvailability, STACK_ALLOCATED();
bool&) {
// FIXME: This is identical to startSentenceBoundary. I'm pretty sure that's public:
// not right. Position Find(const String text, unsigned passed_offset) final {
TextBreakIterator* iterator = SentenceBreakIterator(characters, length); DCHECK_LE(passed_offset, text.length());
// FIXME: The following function can return -1; we don't handle that. // "move_by_sentence_boundary.html" requires to skip a space characters
return iterator->preceding(length); // between sentences.
const unsigned offset = FindLastNonSpaceCharacter(text, passed_offset);
TextBreakIterator* iterator =
SentenceBreakIterator(text.Characters16(), text.length());
const int result = iterator->preceding(offset);
if (result == kTextBreakDone)
return Position();
return Position::Before(result);
}
private:
static unsigned FindLastNonSpaceCharacter(const String text,
unsigned passed_offset) {
for (unsigned offset = passed_offset; offset; --offset) {
if (text[offset - 1] != ' ')
return offset;
}
return 0;
}
} finder;
return TextSegments::FindBoundaryBackward(position, &finder);
} }
PositionInFlatTree StartOfSentenceInternal(const PositionInFlatTree& position) { PositionInFlatTree StartOfSentenceInternal(const PositionInFlatTree& position) {
...@@ -247,12 +267,21 @@ VisiblePositionInFlatTree NextSentencePosition( ...@@ -247,12 +267,21 @@ VisiblePositionInFlatTree NextSentencePosition(
// ---- // ----
VisiblePosition PreviousSentencePosition(const VisiblePosition& c) { PositionInFlatTree PreviousSentencePosition(
DCHECK(c.IsValid()) << c; const PositionInFlatTree& position) {
VisiblePosition prev = CreateVisiblePosition( const PositionInFlatTree result = PreviousSentencePositionInternal(position);
PreviousBoundary(c, PreviousSentencePositionBoundary));
return AdjustBackwardPositionToAvoidCrossingEditingBoundaries( return AdjustBackwardPositionToAvoidCrossingEditingBoundaries(
prev, c.DeepEquivalent()); PositionInFlatTreeWithAffinity(result), position)
.GetPosition();
}
Position PreviousSentencePosition(const Position& position) {
return ToPositionInDOMTree(
PreviousSentencePosition(ToPositionInFlatTree(position)));
}
VisiblePosition PreviousSentencePosition(const VisiblePosition& c) {
return CreateVisiblePosition(PreviousSentencePosition(c.DeepEquivalent()));
} }
// ---- // ----
......
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