OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All r
ights reserved. | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All r
ights reserved. |
3 * Copyright (C) 2005 Alexey Proskuryakov. | 3 * Copyright (C) 2005 Alexey Proskuryakov. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 1459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1470 PassRefPtr<Range> SimplifiedBackwardsTextIterator::range() const | 1470 PassRefPtr<Range> SimplifiedBackwardsTextIterator::range() const |
1471 { | 1471 { |
1472 if (m_positionNode) | 1472 if (m_positionNode) |
1473 return Range::create(m_positionNode->document(), m_positionNode, m_posit
ionStartOffset, m_positionNode, m_positionEndOffset); | 1473 return Range::create(m_positionNode->document(), m_positionNode, m_posit
ionStartOffset, m_positionNode, m_positionEndOffset); |
1474 | 1474 |
1475 return Range::create(m_startNode->document(), m_startNode, m_startOffset, m_
startNode, m_startOffset); | 1475 return Range::create(m_startNode->document(), m_startNode, m_startOffset, m_
startNode, m_startOffset); |
1476 } | 1476 } |
1477 | 1477 |
1478 // -------- | 1478 // -------- |
1479 | 1479 |
1480 CharacterIterator::CharacterIterator(const Range* r, TextIteratorBehaviorFlags b
ehavior) | 1480 CharacterIterator::CharacterIterator(const Range* range, TextIteratorBehaviorFla
gs behavior) |
1481 : m_offset(0) | 1481 : m_offset(0) |
1482 , m_runOffset(0) | 1482 , m_runOffset(0) |
1483 , m_atBreak(true) | 1483 , m_atBreak(true) |
1484 , m_textIterator(r, behavior) | 1484 , m_textIterator(range, behavior) |
| 1485 { |
| 1486 initialize(); |
| 1487 } |
| 1488 |
| 1489 CharacterIterator::CharacterIterator(const Position& start, const Position& end,
TextIteratorBehaviorFlags behavior) |
| 1490 : m_offset(0) |
| 1491 , m_runOffset(0) |
| 1492 , m_atBreak(true) |
| 1493 , m_textIterator(start, end, behavior) |
| 1494 { |
| 1495 initialize(); |
| 1496 } |
| 1497 |
| 1498 void CharacterIterator::initialize() |
1485 { | 1499 { |
1486 while (!atEnd() && !m_textIterator.length()) | 1500 while (!atEnd() && !m_textIterator.length()) |
1487 m_textIterator.advance(); | 1501 m_textIterator.advance(); |
1488 } | 1502 } |
1489 | 1503 |
1490 PassRefPtr<Range> CharacterIterator::range() const | 1504 PassRefPtr<Range> CharacterIterator::range() const |
1491 { | 1505 { |
1492 RefPtr<Range> r = m_textIterator.range(); | 1506 RefPtr<Range> r = m_textIterator.range(); |
1493 if (!m_textIterator.atEnd()) { | 1507 if (!m_textIterator.atEnd()) { |
1494 if (m_textIterator.length() <= 1) { | 1508 if (m_textIterator.length() <= 1) { |
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2052 return builder.toString(); | 2066 return builder.toString(); |
2053 } | 2067 } |
2054 | 2068 |
2055 static PassRefPtr<Range> collapsedToBoundary(const Range* range, bool forward) | 2069 static PassRefPtr<Range> collapsedToBoundary(const Range* range, bool forward) |
2056 { | 2070 { |
2057 RefPtr<Range> result = range->cloneRange(ASSERT_NO_EXCEPTION); | 2071 RefPtr<Range> result = range->cloneRange(ASSERT_NO_EXCEPTION); |
2058 result->collapse(!forward, ASSERT_NO_EXCEPTION); | 2072 result->collapse(!forward, ASSERT_NO_EXCEPTION); |
2059 return result.release(); | 2073 return result.release(); |
2060 } | 2074 } |
2061 | 2075 |
2062 static size_t findPlainText(CharacterIterator& it, const String& target, FindOpt
ions options, size_t& matchStart) | 2076 static size_t findPlainTextInternal(CharacterIterator& it, const String& target,
FindOptions options, size_t& matchStart) |
2063 { | 2077 { |
2064 matchStart = 0; | 2078 matchStart = 0; |
2065 size_t matchLength = 0; | 2079 size_t matchLength = 0; |
2066 | 2080 |
2067 SearchBuffer buffer(target, options); | 2081 SearchBuffer buffer(target, options); |
2068 | 2082 |
2069 if (buffer.needsMoreContext()) { | 2083 if (buffer.needsMoreContext()) { |
2070 RefPtr<Range> startRange = it.range(); | 2084 RefPtr<Range> startRange = it.range(); |
2071 RefPtr<Range> beforeStartRange = startRange->ownerDocument().createRange
(); | 2085 RefPtr<Range> beforeStartRange = startRange->ownerDocument().createRange
(); |
2072 beforeStartRange->setEnd(startRange->startContainer(), startRange->start
Offset(), IGNORE_EXCEPTION); | 2086 beforeStartRange->setEnd(startRange->startContainer(), startRange->start
Offset(), IGNORE_EXCEPTION); |
(...skipping 25 matching lines...) Expand all Loading... |
2098 } | 2112 } |
2099 if (it.atBreak() && !buffer.atBreak()) { | 2113 if (it.atBreak() && !buffer.atBreak()) { |
2100 buffer.reachedBreak(); | 2114 buffer.reachedBreak(); |
2101 goto tryAgain; | 2115 goto tryAgain; |
2102 } | 2116 } |
2103 } | 2117 } |
2104 | 2118 |
2105 return matchLength; | 2119 return matchLength; |
2106 } | 2120 } |
2107 | 2121 |
| 2122 static const TextIteratorBehaviorFlags iteratorFlagsForFindPlainText = TextItera
torEntersTextControls | TextIteratorEntersAuthorShadowRoots; |
| 2123 |
2108 PassRefPtr<Range> findPlainText(const Range* range, const String& target, FindOp
tions options) | 2124 PassRefPtr<Range> findPlainText(const Range* range, const String& target, FindOp
tions options) |
2109 { | 2125 { |
2110 // CharacterIterator requires renderers to be up-to-date | 2126 // CharacterIterator requires renderers to be up-to-date |
2111 range->ownerDocument().updateLayout(); | 2127 range->ownerDocument().updateLayout(); |
2112 | 2128 |
2113 // First, find the text. | 2129 // First, find the text. |
2114 size_t matchStart; | 2130 size_t matchStart; |
2115 size_t matchLength; | 2131 size_t matchLength; |
2116 { | 2132 { |
2117 CharacterIterator findIterator(range, TextIteratorEntersTextControls | T
extIteratorEntersAuthorShadowRoots); | 2133 CharacterIterator findIterator(range, iteratorFlagsForFindPlainText); |
2118 matchLength = findPlainText(findIterator, target, options, matchStart); | 2134 matchLength = findPlainTextInternal(findIterator, target, options, match
Start); |
2119 if (!matchLength) | 2135 if (!matchLength) |
2120 return collapsedToBoundary(range, !(options & Backwards)); | 2136 return collapsedToBoundary(range, !(options & Backwards)); |
2121 } | 2137 } |
2122 | 2138 |
2123 // Then, find the document position of the start and the end of the text. | 2139 // Then, find the document position of the start and the end of the text. |
2124 CharacterIterator computeRangeIterator(range, TextIteratorEntersTextControls
| TextIteratorEntersAuthorShadowRoots); | 2140 CharacterIterator computeRangeIterator(range, iteratorFlagsForFindPlainText)
; |
2125 return characterSubrange(computeRangeIterator, matchStart, matchLength); | 2141 return characterSubrange(computeRangeIterator, matchStart, matchLength); |
2126 } | 2142 } |
2127 | 2143 |
| 2144 PassRefPtr<Range> findPlainText(const Position& start, const Position& end, cons
t String& target, FindOptions options) |
| 2145 { |
| 2146 // CharacterIterator requires renderers to be up-to-date. |
| 2147 if (!start.inDocument()) |
| 2148 return nullptr; |
| 2149 ASSERT(start.document() == end.document()); |
| 2150 start.document()->updateLayout(); |
| 2151 |
| 2152 // FIXME: Reduce the code duplication with above (but how?). |
| 2153 size_t matchStart; |
| 2154 size_t matchLength; |
| 2155 { |
| 2156 CharacterIterator findIterator(start, end, iteratorFlagsForFindPlainText
); |
| 2157 matchLength = findPlainTextInternal(findIterator, target, options, match
Start); |
| 2158 if (!matchLength) { |
| 2159 const Position& collapseTo = options & Backwards ? start : end; |
| 2160 return Range::create(*start.document(), collapseTo, collapseTo); |
| 2161 } |
| 2162 } |
| 2163 |
| 2164 CharacterIterator computeRangeIterator(start, end, iteratorFlagsForFindPlain
Text); |
| 2165 return characterSubrange(computeRangeIterator, matchStart, matchLength); |
| 2166 } |
| 2167 |
2128 } | 2168 } |
OLD | NEW |