OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "web/TextFinder.h" | 5 #include "web/TextFinder.h" |
6 | 6 |
7 #include "bindings/core/v8/ExceptionStatePlaceholder.h" | 7 #include "bindings/core/v8/ExceptionStatePlaceholder.h" |
8 #include "core/dom/Document.h" | 8 #include "core/dom/Document.h" |
9 #include "core/dom/NodeList.h" | 9 #include "core/dom/NodeList.h" |
10 #include "core/dom/Range.h" | 10 #include "core/dom/Range.h" |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 TEST_F(TextFinderTest, FindTextSimple) | 69 TEST_F(TextFinderTest, FindTextSimple) |
70 { | 70 { |
71 document().body()->setInnerHTML("XXXXFindMeYYYYfindmeZZZZ", ASSERT_NO_EXCEPT
ION); | 71 document().body()->setInnerHTML("XXXXFindMeYYYYfindmeZZZZ", ASSERT_NO_EXCEPT
ION); |
72 Node* textNode = document().body()->firstChild(); | 72 Node* textNode = document().body()->firstChild(); |
73 | 73 |
74 int identifier = 0; | 74 int identifier = 0; |
75 WebString searchText(String("FindMe")); | 75 WebString searchText(String("FindMe")); |
76 WebFindOptions findOptions; // Default. | 76 WebFindOptions findOptions; // Default. |
77 bool wrapWithinFrame = true; | 77 bool wrapWithinFrame = true; |
78 WebRect* selectionRect = nullptr; | 78 WebRect* selectionRect = nullptr; |
| 79 bool* activeNow = nullptr; |
79 | 80 |
80 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 81 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
81 Range* activeMatch = textFinder().activeMatch(); | 82 Range* activeMatch = textFinder().activeMatch(); |
82 ASSERT_TRUE(activeMatch); | 83 ASSERT_TRUE(activeMatch); |
83 EXPECT_EQ(textNode, activeMatch->startContainer()); | 84 EXPECT_EQ(textNode, activeMatch->startContainer()); |
84 EXPECT_EQ(4, activeMatch->startOffset()); | 85 EXPECT_EQ(4, activeMatch->startOffset()); |
85 EXPECT_EQ(textNode, activeMatch->endContainer()); | 86 EXPECT_EQ(textNode, activeMatch->endContainer()); |
86 EXPECT_EQ(10, activeMatch->endOffset()); | 87 EXPECT_EQ(10, activeMatch->endOffset()); |
87 | 88 |
88 findOptions.findNext = true; | 89 findOptions.findNext = true; |
89 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 90 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
90 activeMatch = textFinder().activeMatch(); | 91 activeMatch = textFinder().activeMatch(); |
91 ASSERT_TRUE(activeMatch); | 92 ASSERT_TRUE(activeMatch); |
92 EXPECT_EQ(textNode, activeMatch->startContainer()); | 93 EXPECT_EQ(textNode, activeMatch->startContainer()); |
93 EXPECT_EQ(14, activeMatch->startOffset()); | 94 EXPECT_EQ(14, activeMatch->startOffset()); |
94 EXPECT_EQ(textNode, activeMatch->endContainer()); | 95 EXPECT_EQ(textNode, activeMatch->endContainer()); |
95 EXPECT_EQ(20, activeMatch->endOffset()); | 96 EXPECT_EQ(20, activeMatch->endOffset()); |
96 | 97 |
97 // Should wrap to the first match. | 98 // Should wrap to the first match. |
98 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 99 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
99 activeMatch = textFinder().activeMatch(); | 100 activeMatch = textFinder().activeMatch(); |
100 ASSERT_TRUE(activeMatch); | 101 ASSERT_TRUE(activeMatch); |
101 EXPECT_EQ(textNode, activeMatch->startContainer()); | 102 EXPECT_EQ(textNode, activeMatch->startContainer()); |
102 EXPECT_EQ(4, activeMatch->startOffset()); | 103 EXPECT_EQ(4, activeMatch->startOffset()); |
103 EXPECT_EQ(textNode, activeMatch->endContainer()); | 104 EXPECT_EQ(textNode, activeMatch->endContainer()); |
104 EXPECT_EQ(10, activeMatch->endOffset()); | 105 EXPECT_EQ(10, activeMatch->endOffset()); |
105 | 106 |
106 // Search in the reverse order. | 107 // Search in the reverse order. |
107 identifier = 1; | 108 identifier = 1; |
108 findOptions = WebFindOptions(); | 109 findOptions = WebFindOptions(); |
109 findOptions.forward = false; | 110 findOptions.forward = false; |
110 | 111 |
111 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 112 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
112 activeMatch = textFinder().activeMatch(); | 113 activeMatch = textFinder().activeMatch(); |
113 ASSERT_TRUE(activeMatch); | 114 ASSERT_TRUE(activeMatch); |
114 EXPECT_EQ(textNode, activeMatch->startContainer()); | 115 EXPECT_EQ(textNode, activeMatch->startContainer()); |
115 EXPECT_EQ(14, activeMatch->startOffset()); | 116 EXPECT_EQ(14, activeMatch->startOffset()); |
116 EXPECT_EQ(textNode, activeMatch->endContainer()); | 117 EXPECT_EQ(textNode, activeMatch->endContainer()); |
117 EXPECT_EQ(20, activeMatch->endOffset()); | 118 EXPECT_EQ(20, activeMatch->endOffset()); |
118 | 119 |
119 findOptions.findNext = true; | 120 findOptions.findNext = true; |
120 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 121 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
121 activeMatch = textFinder().activeMatch(); | 122 activeMatch = textFinder().activeMatch(); |
122 ASSERT_TRUE(activeMatch); | 123 ASSERT_TRUE(activeMatch); |
123 EXPECT_EQ(textNode, activeMatch->startContainer()); | 124 EXPECT_EQ(textNode, activeMatch->startContainer()); |
124 EXPECT_EQ(4, activeMatch->startOffset()); | 125 EXPECT_EQ(4, activeMatch->startOffset()); |
125 EXPECT_EQ(textNode, activeMatch->endContainer()); | 126 EXPECT_EQ(textNode, activeMatch->endContainer()); |
126 EXPECT_EQ(10, activeMatch->endOffset()); | 127 EXPECT_EQ(10, activeMatch->endOffset()); |
127 | 128 |
128 // Wrap to the first match (last occurence in the document). | 129 // Wrap to the first match (last occurence in the document). |
129 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 130 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
130 activeMatch = textFinder().activeMatch(); | 131 activeMatch = textFinder().activeMatch(); |
131 ASSERT_TRUE(activeMatch); | 132 ASSERT_TRUE(activeMatch); |
132 EXPECT_EQ(textNode, activeMatch->startContainer()); | 133 EXPECT_EQ(textNode, activeMatch->startContainer()); |
133 EXPECT_EQ(14, activeMatch->startOffset()); | 134 EXPECT_EQ(14, activeMatch->startOffset()); |
134 EXPECT_EQ(textNode, activeMatch->endContainer()); | 135 EXPECT_EQ(textNode, activeMatch->endContainer()); |
135 EXPECT_EQ(20, activeMatch->endOffset()); | 136 EXPECT_EQ(20, activeMatch->endOffset()); |
136 } | 137 } |
137 | 138 |
138 TEST_F(TextFinderTest, FindTextAutosizing) | 139 TEST_F(TextFinderTest, FindTextAutosizing) |
139 { | 140 { |
140 document().body()->setInnerHTML("XXXXFindMeYYYYfindmeZZZZ", ASSERT_NO_EXCEPT
ION); | 141 document().body()->setInnerHTML("XXXXFindMeYYYYfindmeZZZZ", ASSERT_NO_EXCEPT
ION); |
141 | 142 |
142 int identifier = 0; | 143 int identifier = 0; |
143 WebString searchText(String("FindMe")); | 144 WebString searchText(String("FindMe")); |
144 WebFindOptions findOptions; // Default. | 145 WebFindOptions findOptions; // Default. |
145 bool wrapWithinFrame = true; | 146 bool wrapWithinFrame = true; |
146 WebRect* selectionRect = nullptr; | 147 WebRect* selectionRect = nullptr; |
| 148 bool* activeNow = nullptr; |
147 | 149 |
148 // Set viewport scale to 20 in order to simulate zoom-in | 150 // Set viewport scale to 20 in order to simulate zoom-in |
149 VisualViewport& visualViewport = document().page()->frameHost().visualViewpo
rt(); | 151 VisualViewport& visualViewport = document().page()->frameHost().visualViewpo
rt(); |
150 visualViewport.setScale(20); | 152 visualViewport.setScale(20); |
151 | 153 |
152 // Enforce autosizing | 154 // Enforce autosizing |
153 document().settings()->setTextAutosizingEnabled(true); | 155 document().settings()->setTextAutosizingEnabled(true); |
154 document().settings()->setTextAutosizingWindowSizeOverride(IntSize(20, 20)); | 156 document().settings()->setTextAutosizingWindowSizeOverride(IntSize(20, 20)); |
155 document().textAutosizer()->updatePageInfo(); | 157 document().textAutosizer()->updatePageInfo(); |
156 | 158 |
157 // In case of autosizing, scale _should_ change | 159 // In case of autosizing, scale _should_ change |
158 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 160 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
159 ASSERT_TRUE(textFinder().activeMatch()); | 161 ASSERT_TRUE(textFinder().activeMatch()); |
160 ASSERT_EQ(1, visualViewport.scale()); // in this case to 1 | 162 ASSERT_EQ(1, visualViewport.scale()); // in this case to 1 |
161 | 163 |
162 // Disable autosizing and reset scale to 20 | 164 // Disable autosizing and reset scale to 20 |
163 visualViewport.setScale(20); | 165 visualViewport.setScale(20); |
164 document().settings()->setTextAutosizingEnabled(false); | 166 document().settings()->setTextAutosizingEnabled(false); |
165 document().textAutosizer()->updatePageInfo(); | 167 document().textAutosizer()->updatePageInfo(); |
166 | 168 |
167 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 169 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
168 ASSERT_TRUE(textFinder().activeMatch()); | 170 ASSERT_TRUE(textFinder().activeMatch()); |
169 ASSERT_EQ(20, visualViewport.scale()); | 171 ASSERT_EQ(20, visualViewport.scale()); |
170 } | 172 } |
171 | 173 |
172 TEST_F(TextFinderTest, FindTextNotFound) | 174 TEST_F(TextFinderTest, FindTextNotFound) |
173 { | 175 { |
174 document().body()->setInnerHTML("XXXXFindMeYYYYfindmeZZZZ", ASSERT_NO_EXCEPT
ION); | 176 document().body()->setInnerHTML("XXXXFindMeYYYYfindmeZZZZ", ASSERT_NO_EXCEPT
ION); |
175 | 177 |
176 int identifier = 0; | 178 int identifier = 0; |
177 WebString searchText(String("Boo")); | 179 WebString searchText(String("Boo")); |
178 WebFindOptions findOptions; // Default. | 180 WebFindOptions findOptions; // Default. |
179 bool wrapWithinFrame = true; | 181 bool wrapWithinFrame = true; |
180 WebRect* selectionRect = nullptr; | 182 WebRect* selectionRect = nullptr; |
| 183 bool* activeNow = nullptr; |
181 | 184 |
182 EXPECT_FALSE(textFinder().find(identifier, searchText, findOptions, wrapWith
inFrame, selectionRect)); | 185 EXPECT_FALSE(textFinder().find(identifier, searchText, findOptions, wrapWith
inFrame, selectionRect, activeNow)); |
183 EXPECT_FALSE(textFinder().activeMatch()); | 186 EXPECT_FALSE(textFinder().activeMatch()); |
184 } | 187 } |
185 | 188 |
186 TEST_F(TextFinderTest, FindTextInShadowDOM) | 189 TEST_F(TextFinderTest, FindTextInShadowDOM) |
187 { | 190 { |
188 document().body()->setInnerHTML("<b>FOO</b><i>foo</i>", ASSERT_NO_EXCEPTION)
; | 191 document().body()->setInnerHTML("<b>FOO</b><i>foo</i>", ASSERT_NO_EXCEPTION)
; |
189 RefPtrWillBeRawPtr<ShadowRoot> shadowRoot = document().body()->createShadowR
ootInternal(ShadowRootType::V0, ASSERT_NO_EXCEPTION); | 192 RefPtrWillBeRawPtr<ShadowRoot> shadowRoot = document().body()->createShadowR
ootInternal(ShadowRootType::V0, ASSERT_NO_EXCEPTION); |
190 shadowRoot->setInnerHTML("<content select=\"i\"></content><u>Foo</u><content
></content>", ASSERT_NO_EXCEPTION); | 193 shadowRoot->setInnerHTML("<content select=\"i\"></content><u>Foo</u><content
></content>", ASSERT_NO_EXCEPTION); |
191 Node* textInBElement = document().body()->firstChild()->firstChild(); | 194 Node* textInBElement = document().body()->firstChild()->firstChild(); |
192 Node* textInIElement = document().body()->lastChild()->firstChild(); | 195 Node* textInIElement = document().body()->lastChild()->firstChild(); |
193 Node* textInUElement = shadowRoot->childNodes()->item(1)->firstChild(); | 196 Node* textInUElement = shadowRoot->childNodes()->item(1)->firstChild(); |
194 | 197 |
195 int identifier = 0; | 198 int identifier = 0; |
196 WebString searchText(String("foo")); | 199 WebString searchText(String("foo")); |
197 WebFindOptions findOptions; // Default. | 200 WebFindOptions findOptions; // Default. |
198 bool wrapWithinFrame = true; | 201 bool wrapWithinFrame = true; |
199 WebRect* selectionRect = nullptr; | 202 WebRect* selectionRect = nullptr; |
| 203 bool* activeNow = nullptr; |
200 | 204 |
201 // TextIterator currently returns the matches in the composed treeorder, so | 205 // TextIterator currently returns the matches in the composed treeorder, so |
202 // in this case the matches will be returned in the order of | 206 // in this case the matches will be returned in the order of |
203 // <i> -> <u> -> <b>. | 207 // <i> -> <u> -> <b>. |
204 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 208 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
205 Range* activeMatch = textFinder().activeMatch(); | 209 Range* activeMatch = textFinder().activeMatch(); |
206 ASSERT_TRUE(activeMatch); | 210 ASSERT_TRUE(activeMatch); |
207 EXPECT_EQ(textInIElement, activeMatch->startContainer()); | 211 EXPECT_EQ(textInIElement, activeMatch->startContainer()); |
208 EXPECT_EQ(0, activeMatch->startOffset()); | 212 EXPECT_EQ(0, activeMatch->startOffset()); |
209 EXPECT_EQ(textInIElement, activeMatch->endContainer()); | 213 EXPECT_EQ(textInIElement, activeMatch->endContainer()); |
210 EXPECT_EQ(3, activeMatch->endOffset()); | 214 EXPECT_EQ(3, activeMatch->endOffset()); |
211 | 215 |
212 findOptions.findNext = true; | 216 findOptions.findNext = true; |
213 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 217 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
214 activeMatch = textFinder().activeMatch(); | 218 activeMatch = textFinder().activeMatch(); |
215 ASSERT_TRUE(activeMatch); | 219 ASSERT_TRUE(activeMatch); |
216 EXPECT_EQ(textInUElement, activeMatch->startContainer()); | 220 EXPECT_EQ(textInUElement, activeMatch->startContainer()); |
217 EXPECT_EQ(0, activeMatch->startOffset()); | 221 EXPECT_EQ(0, activeMatch->startOffset()); |
218 EXPECT_EQ(textInUElement, activeMatch->endContainer()); | 222 EXPECT_EQ(textInUElement, activeMatch->endContainer()); |
219 EXPECT_EQ(3, activeMatch->endOffset()); | 223 EXPECT_EQ(3, activeMatch->endOffset()); |
220 | 224 |
221 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 225 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
222 activeMatch = textFinder().activeMatch(); | 226 activeMatch = textFinder().activeMatch(); |
223 ASSERT_TRUE(activeMatch); | 227 ASSERT_TRUE(activeMatch); |
224 EXPECT_EQ(textInBElement, activeMatch->startContainer()); | 228 EXPECT_EQ(textInBElement, activeMatch->startContainer()); |
225 EXPECT_EQ(0, activeMatch->startOffset()); | 229 EXPECT_EQ(0, activeMatch->startOffset()); |
226 EXPECT_EQ(textInBElement, activeMatch->endContainer()); | 230 EXPECT_EQ(textInBElement, activeMatch->endContainer()); |
227 EXPECT_EQ(3, activeMatch->endOffset()); | 231 EXPECT_EQ(3, activeMatch->endOffset()); |
228 | 232 |
229 // Should wrap to the first match. | 233 // Should wrap to the first match. |
230 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 234 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
231 activeMatch = textFinder().activeMatch(); | 235 activeMatch = textFinder().activeMatch(); |
232 ASSERT_TRUE(activeMatch); | 236 ASSERT_TRUE(activeMatch); |
233 EXPECT_EQ(textInIElement, activeMatch->startContainer()); | 237 EXPECT_EQ(textInIElement, activeMatch->startContainer()); |
234 EXPECT_EQ(0, activeMatch->startOffset()); | 238 EXPECT_EQ(0, activeMatch->startOffset()); |
235 EXPECT_EQ(textInIElement, activeMatch->endContainer()); | 239 EXPECT_EQ(textInIElement, activeMatch->endContainer()); |
236 EXPECT_EQ(3, activeMatch->endOffset()); | 240 EXPECT_EQ(3, activeMatch->endOffset()); |
237 | 241 |
238 // Fresh search in the reverse order. | 242 // Fresh search in the reverse order. |
239 identifier = 1; | 243 identifier = 1; |
240 findOptions = WebFindOptions(); | 244 findOptions = WebFindOptions(); |
241 findOptions.forward = false; | 245 findOptions.forward = false; |
242 | 246 |
243 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 247 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
244 activeMatch = textFinder().activeMatch(); | 248 activeMatch = textFinder().activeMatch(); |
245 ASSERT_TRUE(activeMatch); | 249 ASSERT_TRUE(activeMatch); |
246 EXPECT_EQ(textInBElement, activeMatch->startContainer()); | 250 EXPECT_EQ(textInBElement, activeMatch->startContainer()); |
247 EXPECT_EQ(0, activeMatch->startOffset()); | 251 EXPECT_EQ(0, activeMatch->startOffset()); |
248 EXPECT_EQ(textInBElement, activeMatch->endContainer()); | 252 EXPECT_EQ(textInBElement, activeMatch->endContainer()); |
249 EXPECT_EQ(3, activeMatch->endOffset()); | 253 EXPECT_EQ(3, activeMatch->endOffset()); |
250 | 254 |
251 findOptions.findNext = true; | 255 findOptions.findNext = true; |
252 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 256 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
253 activeMatch = textFinder().activeMatch(); | 257 activeMatch = textFinder().activeMatch(); |
254 ASSERT_TRUE(activeMatch); | 258 ASSERT_TRUE(activeMatch); |
255 EXPECT_EQ(textInUElement, activeMatch->startContainer()); | 259 EXPECT_EQ(textInUElement, activeMatch->startContainer()); |
256 EXPECT_EQ(0, activeMatch->startOffset()); | 260 EXPECT_EQ(0, activeMatch->startOffset()); |
257 EXPECT_EQ(textInUElement, activeMatch->endContainer()); | 261 EXPECT_EQ(textInUElement, activeMatch->endContainer()); |
258 EXPECT_EQ(3, activeMatch->endOffset()); | 262 EXPECT_EQ(3, activeMatch->endOffset()); |
259 | 263 |
260 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 264 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
261 activeMatch = textFinder().activeMatch(); | 265 activeMatch = textFinder().activeMatch(); |
262 ASSERT_TRUE(activeMatch); | 266 ASSERT_TRUE(activeMatch); |
263 EXPECT_EQ(textInIElement, activeMatch->startContainer()); | 267 EXPECT_EQ(textInIElement, activeMatch->startContainer()); |
264 EXPECT_EQ(0, activeMatch->startOffset()); | 268 EXPECT_EQ(0, activeMatch->startOffset()); |
265 EXPECT_EQ(textInIElement, activeMatch->endContainer()); | 269 EXPECT_EQ(textInIElement, activeMatch->endContainer()); |
266 EXPECT_EQ(3, activeMatch->endOffset()); | 270 EXPECT_EQ(3, activeMatch->endOffset()); |
267 | 271 |
268 // And wrap. | 272 // And wrap. |
269 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect)); | 273 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, activeNow)); |
270 activeMatch = textFinder().activeMatch(); | 274 activeMatch = textFinder().activeMatch(); |
271 ASSERT_TRUE(activeMatch); | 275 ASSERT_TRUE(activeMatch); |
272 EXPECT_EQ(textInBElement, activeMatch->startContainer()); | 276 EXPECT_EQ(textInBElement, activeMatch->startContainer()); |
273 EXPECT_EQ(0, activeMatch->startOffset()); | 277 EXPECT_EQ(0, activeMatch->startOffset()); |
274 EXPECT_EQ(textInBElement, activeMatch->endContainer()); | 278 EXPECT_EQ(textInBElement, activeMatch->endContainer()); |
275 EXPECT_EQ(3, activeMatch->endOffset()); | 279 EXPECT_EQ(3, activeMatch->endOffset()); |
276 } | 280 } |
277 | 281 |
278 TEST_F(TextFinderTest, ScopeTextMatchesSimple) | 282 TEST_F(TextFinderTest, ScopeTextMatchesSimple) |
279 { | 283 { |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 | 391 |
388 EXPECT_EQ(3, textFinder().totalMatchCount()); | 392 EXPECT_EQ(3, textFinder().totalMatchCount()); |
389 WebVector<WebFloatRect> matchRects; | 393 WebVector<WebFloatRect> matchRects; |
390 textFinder().findMatchRects(matchRects); | 394 textFinder().findMatchRects(matchRects); |
391 ASSERT_EQ(3u, matchRects.size()); | 395 ASSERT_EQ(3u, matchRects.size()); |
392 EXPECT_EQ(findInPageRect(textNode, 0, textNode, 2), matchRects[0]); | 396 EXPECT_EQ(findInPageRect(textNode, 0, textNode, 2), matchRects[0]); |
393 EXPECT_EQ(findInPageRect(textNode, 2, textNode, 4), matchRects[1]); | 397 EXPECT_EQ(findInPageRect(textNode, 2, textNode, 4), matchRects[1]); |
394 EXPECT_EQ(findInPageRect(textNode, 4, textNode, 6), matchRects[2]); | 398 EXPECT_EQ(findInPageRect(textNode, 4, textNode, 6), matchRects[2]); |
395 } | 399 } |
396 | 400 |
| 401 TEST_F(TextFinderTest, FindTextJavaScriptUpdatesDOM) |
| 402 { |
| 403 document().body()->setInnerHTML("<b>XXXXFindMeYYYY</b><i></i>", ASSERT_NO_EX
CEPTION); |
| 404 |
| 405 int identifier = 0; |
| 406 WebString searchText(String("FindMe")); |
| 407 WebFindOptions findOptions; // Default. |
| 408 bool wrapWithinFrame = true; |
| 409 WebRect* selectionRect = nullptr; |
| 410 bool activeNow; |
| 411 |
| 412 textFinder().resetMatchCount(); |
| 413 textFinder().scopeStringMatches(identifier, searchText, findOptions, true); |
| 414 while (textFinder().scopingInProgress()) |
| 415 runPendingTasks(); |
| 416 |
| 417 findOptions.findNext = true; |
| 418 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, &activeNow)); |
| 419 EXPECT_TRUE(activeNow); |
| 420 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, &activeNow)); |
| 421 EXPECT_TRUE(activeNow); |
| 422 |
| 423 // Add new text to DOM and try FindNext. |
| 424 Element* iElement = toElement(document().body()->lastChild()); |
| 425 ASSERT_TRUE(iElement); |
| 426 iElement->setInnerHTML("ZZFindMe", ASSERT_NO_EXCEPTION); |
| 427 |
| 428 ASSERT_TRUE(textFinder().find(identifier, searchText, findOptions, wrapWithi
nFrame, selectionRect, &activeNow)); |
| 429 Range* activeMatch = textFinder().activeMatch(); |
| 430 ASSERT_TRUE(activeMatch); |
| 431 EXPECT_FALSE(activeNow); |
| 432 EXPECT_EQ(2, activeMatch->startOffset()); |
| 433 EXPECT_EQ(8, activeMatch->endOffset()); |
| 434 |
| 435 // Restart full search and check that added text is found. |
| 436 findOptions.findNext = false; |
| 437 textFinder().resetMatchCount(); |
| 438 textFinder().cancelPendingScopingEffort(); |
| 439 textFinder().scopeStringMatches(identifier, searchText, findOptions, true); |
| 440 while (textFinder().scopingInProgress()) |
| 441 runPendingTasks(); |
| 442 EXPECT_EQ(2, textFinder().totalMatchCount()); |
| 443 |
| 444 WebVector<WebFloatRect> matchRects; |
| 445 textFinder().findMatchRects(matchRects); |
| 446 ASSERT_EQ(2u, matchRects.size()); |
| 447 Node* textInBElement = document().body()->firstChild()->firstChild(); |
| 448 Node* textInIElement = document().body()->lastChild()->firstChild(); |
| 449 EXPECT_EQ(findInPageRect(textInBElement, 4, textInBElement, 10), matchRects[
0]); |
| 450 EXPECT_EQ(findInPageRect(textInIElement, 2, textInIElement, 8), matchRects[1
]); |
| 451 } |
| 452 |
397 class TextFinderFakeTimerTest : public TextFinderTest { | 453 class TextFinderFakeTimerTest : public TextFinderTest { |
398 protected: | 454 protected: |
399 // A simple platform that mocks out the clock. | 455 // A simple platform that mocks out the clock. |
400 class TimeProxyPlatform : public TestingPlatformSupport { | 456 class TimeProxyPlatform : public TestingPlatformSupport { |
401 public: | 457 public: |
402 TimeProxyPlatform() | 458 TimeProxyPlatform() |
403 : m_timeCounter(m_oldPlatform->currentTimeSeconds()) | 459 : m_timeCounter(m_oldPlatform->currentTimeSeconds()) |
404 { | 460 { |
405 } | 461 } |
406 | 462 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 // There will be only one iteration before timeout, because increment | 511 // There will be only one iteration before timeout, because increment |
456 // of the TimeProxyPlatform timer is greater than timeout threshold. | 512 // of the TimeProxyPlatform timer is greater than timeout threshold. |
457 textFinder().scopeStringMatches(identifier, searchPattern, findOptions, true
); | 513 textFinder().scopeStringMatches(identifier, searchPattern, findOptions, true
); |
458 while (textFinder().scopingInProgress()) | 514 while (textFinder().scopingInProgress()) |
459 runPendingTasks(); | 515 runPendingTasks(); |
460 | 516 |
461 EXPECT_EQ(4, textFinder().totalMatchCount()); | 517 EXPECT_EQ(4, textFinder().totalMatchCount()); |
462 } | 518 } |
463 | 519 |
464 } // namespace blink | 520 } // namespace blink |
OLD | NEW |