Commit 4bbfc2aa authored by yutak@chromium.org's avatar yutak@chromium.org

Add an overloaded version of findPlainText() accepting two Positions.

This patch is in continuation of <https://codereview.chromium.org/210363006>.
While the last patch added an overloaded TextIterator constructor, this patch
adds similar overloads to findPlainText(), which will be used in the find-in-
page implementation in WebFrameImpl.

The added function is not used yet. Hence this patch should have no impact on
the product behavior.

BUG=353430

Review URL: https://codereview.chromium.org/203973005

git-svn-id: svn://svn.chromium.org/blink/trunk@170025 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 17d70e6e
...@@ -1477,11 +1477,25 @@ PassRefPtr<Range> SimplifiedBackwardsTextIterator::range() const ...@@ -1477,11 +1477,25 @@ PassRefPtr<Range> SimplifiedBackwardsTextIterator::range() const
// -------- // --------
CharacterIterator::CharacterIterator(const Range* r, TextIteratorBehaviorFlags behavior) CharacterIterator::CharacterIterator(const Range* range, TextIteratorBehaviorFlags behavior)
: m_offset(0) : m_offset(0)
, m_runOffset(0) , m_runOffset(0)
, m_atBreak(true) , m_atBreak(true)
, m_textIterator(r, behavior) , m_textIterator(range, behavior)
{
initialize();
}
CharacterIterator::CharacterIterator(const Position& start, const Position& end, TextIteratorBehaviorFlags behavior)
: m_offset(0)
, m_runOffset(0)
, m_atBreak(true)
, m_textIterator(start, end, behavior)
{
initialize();
}
void CharacterIterator::initialize()
{ {
while (!atEnd() && !m_textIterator.length()) while (!atEnd() && !m_textIterator.length())
m_textIterator.advance(); m_textIterator.advance();
...@@ -2059,7 +2073,7 @@ static PassRefPtr<Range> collapsedToBoundary(const Range* range, bool forward) ...@@ -2059,7 +2073,7 @@ static PassRefPtr<Range> collapsedToBoundary(const Range* range, bool forward)
return result.release(); return result.release();
} }
static size_t findPlainText(CharacterIterator& it, const String& target, FindOptions options, size_t& matchStart) static size_t findPlainTextInternal(CharacterIterator& it, const String& target, FindOptions options, size_t& matchStart)
{ {
matchStart = 0; matchStart = 0;
size_t matchLength = 0; size_t matchLength = 0;
...@@ -2105,6 +2119,8 @@ tryAgain: ...@@ -2105,6 +2119,8 @@ tryAgain:
return matchLength; return matchLength;
} }
static const TextIteratorBehaviorFlags iteratorFlagsForFindPlainText = TextIteratorEntersTextControls | TextIteratorEntersAuthorShadowRoots;
PassRefPtr<Range> findPlainText(const Range* range, const String& target, FindOptions options) PassRefPtr<Range> findPlainText(const Range* range, const String& target, FindOptions options)
{ {
// CharacterIterator requires renderers to be up-to-date // CharacterIterator requires renderers to be up-to-date
...@@ -2114,14 +2130,38 @@ PassRefPtr<Range> findPlainText(const Range* range, const String& target, FindOp ...@@ -2114,14 +2130,38 @@ PassRefPtr<Range> findPlainText(const Range* range, const String& target, FindOp
size_t matchStart; size_t matchStart;
size_t matchLength; size_t matchLength;
{ {
CharacterIterator findIterator(range, TextIteratorEntersTextControls | TextIteratorEntersAuthorShadowRoots); CharacterIterator findIterator(range, iteratorFlagsForFindPlainText);
matchLength = findPlainText(findIterator, target, options, matchStart); matchLength = findPlainTextInternal(findIterator, target, options, matchStart);
if (!matchLength) if (!matchLength)
return collapsedToBoundary(range, !(options & Backwards)); return collapsedToBoundary(range, !(options & Backwards));
} }
// Then, find the document position of the start and the end of the text. // Then, find the document position of the start and the end of the text.
CharacterIterator computeRangeIterator(range, TextIteratorEntersTextControls | TextIteratorEntersAuthorShadowRoots); CharacterIterator computeRangeIterator(range, iteratorFlagsForFindPlainText);
return characterSubrange(computeRangeIterator, matchStart, matchLength);
}
PassRefPtr<Range> findPlainText(const Position& start, const Position& end, const String& target, FindOptions options)
{
// CharacterIterator requires renderers to be up-to-date.
if (!start.inDocument())
return nullptr;
ASSERT(start.document() == end.document());
start.document()->updateLayout();
// FIXME: Reduce the code duplication with above (but how?).
size_t matchStart;
size_t matchLength;
{
CharacterIterator findIterator(start, end, iteratorFlagsForFindPlainText);
matchLength = findPlainTextInternal(findIterator, target, options, matchStart);
if (!matchLength) {
const Position& collapseTo = options & Backwards ? start : end;
return Range::create(*start.document(), collapseTo, collapseTo);
}
}
CharacterIterator computeRangeIterator(start, end, iteratorFlagsForFindPlainText);
return characterSubrange(computeRangeIterator, matchStart, matchLength); return characterSubrange(computeRangeIterator, matchStart, matchLength);
} }
......
...@@ -63,6 +63,7 @@ inline bool isCollapsibleWhitespace(UChar c) ...@@ -63,6 +63,7 @@ inline bool isCollapsibleWhitespace(UChar c)
String plainText(const Range*, TextIteratorBehaviorFlags = TextIteratorDefaultBehavior); String plainText(const Range*, TextIteratorBehaviorFlags = TextIteratorDefaultBehavior);
PassRefPtr<Range> findPlainText(const Range*, const String&, FindOptions); PassRefPtr<Range> findPlainText(const Range*, const String&, FindOptions);
PassRefPtr<Range> findPlainText(const Position& start, const Position& end, const String&, FindOptions);
class BitStack { class BitStack {
public: public:
...@@ -308,6 +309,7 @@ private: ...@@ -308,6 +309,7 @@ private:
class CharacterIterator { class CharacterIterator {
public: public:
explicit CharacterIterator(const Range*, TextIteratorBehaviorFlags = TextIteratorDefaultBehavior); explicit CharacterIterator(const Range*, TextIteratorBehaviorFlags = TextIteratorDefaultBehavior);
CharacterIterator(const Position& start, const Position& end, TextIteratorBehaviorFlags = TextIteratorDefaultBehavior);
void advance(int numCharacters); void advance(int numCharacters);
...@@ -324,6 +326,8 @@ public: ...@@ -324,6 +326,8 @@ public:
PassRefPtr<Range> range() const; PassRefPtr<Range> range() const;
private: private:
void initialize();
int m_offset; int m_offset;
int m_runOffset; int m_runOffset;
bool m_atBreak; bool m_atBreak;
......
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