OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "core/editing/spellcheck/SpellChecker.h" | 5 #include "core/editing/spellcheck/SpellChecker.h" |
6 | 6 |
7 #include "core/editing/Editor.h" | 7 #include "core/editing/Editor.h" |
8 #include "core/editing/markers/DocumentMarkerController.h" | 8 #include "core/editing/markers/DocumentMarkerController.h" |
9 #include "core/editing/markers/SpellCheckMarker.h" | 9 #include "core/editing/markers/SpellCheckMarker.h" |
10 #include "core/editing/spellcheck/SpellCheckRequester.h" | 10 #include "core/editing/spellcheck/SpellCheckRequester.h" |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 | 121 |
122 ASSERT_EQ(1u, GetDocument().Markers().Markers().size()); | 122 ASSERT_EQ(1u, GetDocument().Markers().Markers().size()); |
123 | 123 |
124 // The Spelling marker's description should be a newline-separated list of the | 124 // The Spelling marker's description should be a newline-separated list of the |
125 // suggested replacements | 125 // suggested replacements |
126 EXPECT_EQ( | 126 EXPECT_EQ( |
127 "spellcheck\nspillchuck", | 127 "spellcheck\nspillchuck", |
128 ToSpellCheckMarker(GetDocument().Markers().Markers()[0])->Description()); | 128 ToSpellCheckMarker(GetDocument().Markers().Markers()[0])->Description()); |
129 } | 129 } |
130 | 130 |
131 TEST_F(SpellCheckerTest, | 131 TEST_F(SpellCheckerTest, GetSpellCheckMarkerUnderSelection_FirstCharSelected) { |
132 GetSpellCheckMarkerTouchingSelection_FirstCharSelected) { | |
133 SetBodyContent( | 132 SetBodyContent( |
134 "<div contenteditable>" | 133 "<div contenteditable>" |
135 "spllchck" | 134 "spllchck" |
136 "</div>"); | 135 "</div>"); |
137 Element* div = GetDocument().QuerySelector("div"); | 136 Element* div = GetDocument().QuerySelector("div"); |
138 Node* text = div->firstChild(); | 137 Node* text = div->firstChild(); |
139 | 138 |
140 GetDocument().Markers().AddSpellingMarker( | 139 GetDocument().Markers().AddSpellingMarker( |
141 EphemeralRange(Position(text, 0), Position(text, 8))); | 140 EphemeralRange(Position(text, 0), Position(text, 8))); |
142 | 141 |
143 GetDocument().GetFrame()->Selection().SetSelection( | 142 GetDocument().GetFrame()->Selection().SetSelection( |
144 SelectionInDOMTree::Builder() | 143 SelectionInDOMTree::Builder() |
145 .SetBaseAndExtent(Position(text, 0), Position(text, 1)) | 144 .SetBaseAndExtent(Position(text, 0), Position(text, 1)) |
146 .Build()); | 145 .Build()); |
147 | 146 |
148 Optional<std::pair<Node*, SpellCheckMarker*>> result = | 147 Optional<std::pair<Node*, SpellCheckMarker*>> result = |
149 GetDocument() | 148 GetDocument() |
150 .GetFrame() | 149 .GetFrame() |
151 ->GetSpellChecker() | 150 ->GetSpellChecker() |
152 .GetSpellCheckMarkerTouchingSelection(); | 151 .GetSpellCheckMarkerUnderSelection(); |
153 EXPECT_TRUE(result); | 152 EXPECT_TRUE(result); |
154 } | 153 } |
155 | 154 |
156 TEST_F(SpellCheckerTest, | 155 TEST_F(SpellCheckerTest, GetSpellCheckMarkerUnderSelection_LastCharSelected) { |
157 GetSpellCheckMarkerTouchingSelection_LastCharSelected) { | |
158 SetBodyContent( | 156 SetBodyContent( |
159 "<div contenteditable>" | 157 "<div contenteditable>" |
160 "spllchck" | 158 "spllchck" |
161 "</div>"); | 159 "</div>"); |
162 Element* div = GetDocument().QuerySelector("div"); | 160 Element* div = GetDocument().QuerySelector("div"); |
163 Node* text = div->firstChild(); | 161 Node* text = div->firstChild(); |
164 | 162 |
165 GetDocument().Markers().AddSpellingMarker( | 163 GetDocument().Markers().AddSpellingMarker( |
166 EphemeralRange(Position(text, 0), Position(text, 8))); | 164 EphemeralRange(Position(text, 0), Position(text, 8))); |
167 | 165 |
168 GetDocument().GetFrame()->Selection().SetSelection( | 166 GetDocument().GetFrame()->Selection().SetSelection( |
169 SelectionInDOMTree::Builder() | 167 SelectionInDOMTree::Builder() |
170 .SetBaseAndExtent(Position(text, 7), Position(text, 8)) | 168 .SetBaseAndExtent(Position(text, 7), Position(text, 8)) |
171 .Build()); | 169 .Build()); |
172 | 170 |
173 Optional<std::pair<Node*, SpellCheckMarker*>> result = | 171 Optional<std::pair<Node*, SpellCheckMarker*>> result = |
174 GetDocument() | 172 GetDocument() |
175 .GetFrame() | 173 .GetFrame() |
176 ->GetSpellChecker() | 174 ->GetSpellChecker() |
177 .GetSpellCheckMarkerTouchingSelection(); | 175 .GetSpellCheckMarkerUnderSelection(); |
178 EXPECT_TRUE(result); | 176 EXPECT_TRUE(result); |
179 } | 177 } |
180 | 178 |
181 TEST_F(SpellCheckerTest, | 179 TEST_F(SpellCheckerTest, |
182 GetSpellCheckMarkerTouchingSelection_SingleCharWordSelected) { | 180 GetSpellCheckMarkerUnderSelection_SingleCharWordSelected) { |
183 SetBodyContent( | 181 SetBodyContent( |
184 "<div contenteditable>" | 182 "<div contenteditable>" |
185 "s" | 183 "s" |
186 "</div>"); | 184 "</div>"); |
187 Element* div = GetDocument().QuerySelector("div"); | 185 Element* div = GetDocument().QuerySelector("div"); |
188 Node* text = div->firstChild(); | 186 Node* text = div->firstChild(); |
189 | 187 |
190 GetDocument().Markers().AddSpellingMarker( | 188 GetDocument().Markers().AddSpellingMarker( |
191 EphemeralRange(Position(text, 0), Position(text, 1))); | 189 EphemeralRange(Position(text, 0), Position(text, 1))); |
192 | 190 |
193 GetDocument().GetFrame()->Selection().SetSelection( | 191 GetDocument().GetFrame()->Selection().SetSelection( |
194 SelectionInDOMTree::Builder() | 192 SelectionInDOMTree::Builder() |
195 .SetBaseAndExtent(Position(text, 0), Position(text, 1)) | 193 .SetBaseAndExtent(Position(text, 0), Position(text, 1)) |
196 .Build()); | 194 .Build()); |
197 | 195 |
198 Optional<std::pair<Node*, SpellCheckMarker*>> result = | 196 Optional<std::pair<Node*, SpellCheckMarker*>> result = |
199 GetDocument() | 197 GetDocument() |
200 .GetFrame() | 198 .GetFrame() |
201 ->GetSpellChecker() | 199 ->GetSpellChecker() |
202 .GetSpellCheckMarkerTouchingSelection(); | 200 .GetSpellCheckMarkerUnderSelection(); |
203 EXPECT_TRUE(result); | 201 EXPECT_TRUE(result); |
204 } | 202 } |
205 | 203 |
206 TEST_F(SpellCheckerTest, | 204 TEST_F(SpellCheckerTest, |
207 GetSpellCheckMarkerTouchingSelection_CaretLeftOfSingleCharWord) { | 205 GetSpellCheckMarkerUnderSelection_CaretLeftOfSingleCharWord) { |
208 SetBodyContent( | 206 SetBodyContent( |
209 "<div contenteditable>" | 207 "<div contenteditable>" |
210 "s" | 208 "s" |
211 "</div>"); | 209 "</div>"); |
212 Element* div = GetDocument().QuerySelector("div"); | 210 Element* div = GetDocument().QuerySelector("div"); |
213 Node* text = div->firstChild(); | 211 Node* text = div->firstChild(); |
214 | 212 |
215 GetDocument().Markers().AddSpellingMarker( | 213 GetDocument().Markers().AddSpellingMarker( |
216 EphemeralRange(Position(text, 0), Position(text, 1))); | 214 EphemeralRange(Position(text, 0), Position(text, 1))); |
217 | 215 |
218 GetDocument().GetFrame()->Selection().SetSelection( | 216 GetDocument().GetFrame()->Selection().SetSelection( |
219 SelectionInDOMTree::Builder() | 217 SelectionInDOMTree::Builder() |
220 .SetBaseAndExtent(Position(text, 0), Position(text, 0)) | 218 .SetBaseAndExtent(Position(text, 0), Position(text, 0)) |
221 .Build()); | 219 .Build()); |
222 | 220 |
223 Optional<std::pair<Node*, SpellCheckMarker*>> result = | 221 Optional<std::pair<Node*, SpellCheckMarker*>> result = |
224 GetDocument() | 222 GetDocument() |
225 .GetFrame() | 223 .GetFrame() |
226 ->GetSpellChecker() | 224 ->GetSpellChecker() |
227 .GetSpellCheckMarkerTouchingSelection(); | 225 .GetSpellCheckMarkerUnderSelection(); |
228 EXPECT_TRUE(result); | 226 EXPECT_FALSE(result); |
229 } | 227 } |
230 | 228 |
231 TEST_F(SpellCheckerTest, | 229 TEST_F(SpellCheckerTest, |
232 GetSpellCheckMarkerTouchingSelection_CaretRightOfSingleCharWord) { | 230 GetSpellCheckMarkerUnderSelection_CaretRightOfSingleCharWord) { |
233 SetBodyContent( | 231 SetBodyContent( |
234 "<div contenteditable>" | 232 "<div contenteditable>" |
235 "s" | 233 "s" |
236 "</div>"); | 234 "</div>"); |
237 Element* div = GetDocument().QuerySelector("div"); | 235 Element* div = GetDocument().QuerySelector("div"); |
238 Node* text = div->firstChild(); | 236 Node* text = div->firstChild(); |
239 | 237 |
240 GetDocument().Markers().AddSpellingMarker( | 238 GetDocument().Markers().AddSpellingMarker( |
241 EphemeralRange(Position(text, 0), Position(text, 1))); | 239 EphemeralRange(Position(text, 0), Position(text, 1))); |
242 | 240 |
243 GetDocument().GetFrame()->Selection().SetSelection( | 241 GetDocument().GetFrame()->Selection().SetSelection( |
244 SelectionInDOMTree::Builder() | 242 SelectionInDOMTree::Builder() |
245 .SetBaseAndExtent(Position(text, 1), Position(text, 1)) | 243 .SetBaseAndExtent(Position(text, 1), Position(text, 1)) |
246 .Build()); | 244 .Build()); |
247 | 245 |
248 Optional<std::pair<Node*, SpellCheckMarker*>> result = | 246 Optional<std::pair<Node*, SpellCheckMarker*>> result = |
249 GetDocument() | 247 GetDocument() |
250 .GetFrame() | 248 .GetFrame() |
251 ->GetSpellChecker() | 249 ->GetSpellChecker() |
252 .GetSpellCheckMarkerTouchingSelection(); | 250 .GetSpellCheckMarkerUnderSelection(); |
253 EXPECT_TRUE(result); | 251 EXPECT_FALSE(result); |
254 } | 252 } |
255 | 253 |
256 TEST_F(SpellCheckerTest, | 254 TEST_F(SpellCheckerTest, |
257 GetSpellCheckMarkerTouchingSelection_CaretLeftOfMultiCharWord) { | 255 GetSpellCheckMarkerUnderSelection_CaretLeftOfMultiCharWord) { |
258 SetBodyContent( | 256 SetBodyContent( |
259 "<div contenteditable>" | 257 "<div contenteditable>" |
260 "spllchck" | 258 "spllchck" |
261 "</div>"); | 259 "</div>"); |
262 Element* div = GetDocument().QuerySelector("div"); | 260 Element* div = GetDocument().QuerySelector("div"); |
263 Node* text = div->firstChild(); | 261 Node* text = div->firstChild(); |
264 | 262 |
265 GetDocument().Markers().AddSpellingMarker( | 263 GetDocument().Markers().AddSpellingMarker( |
266 EphemeralRange(Position(text, 0), Position(text, 8))); | 264 EphemeralRange(Position(text, 0), Position(text, 8))); |
267 | 265 |
268 GetDocument().GetFrame()->Selection().SetSelection( | 266 GetDocument().GetFrame()->Selection().SetSelection( |
269 SelectionInDOMTree::Builder() | 267 SelectionInDOMTree::Builder() |
270 .SetBaseAndExtent(Position(text, 0), Position(text, 0)) | 268 .SetBaseAndExtent(Position(text, 0), Position(text, 0)) |
271 .Build()); | 269 .Build()); |
272 | 270 |
273 Optional<std::pair<Node*, SpellCheckMarker*>> result = | 271 Optional<std::pair<Node*, SpellCheckMarker*>> result = |
274 GetDocument() | 272 GetDocument() |
275 .GetFrame() | 273 .GetFrame() |
276 ->GetSpellChecker() | 274 ->GetSpellChecker() |
277 .GetSpellCheckMarkerTouchingSelection(); | 275 .GetSpellCheckMarkerUnderSelection(); |
278 EXPECT_TRUE(result); | 276 EXPECT_FALSE(result); |
279 } | 277 } |
280 | 278 |
281 TEST_F(SpellCheckerTest, | 279 TEST_F(SpellCheckerTest, |
282 GetSpellCheckMarkerTouchingSelection_CaretRightOfMultiCharWord) { | 280 GetSpellCheckMarkerUnderSelection_CaretRightOfMultiCharWord) { |
283 SetBodyContent( | 281 SetBodyContent( |
284 "<div contenteditable>" | 282 "<div contenteditable>" |
285 "spllchck" | 283 "spllchck" |
286 "</div>"); | 284 "</div>"); |
287 Element* div = GetDocument().QuerySelector("div"); | 285 Element* div = GetDocument().QuerySelector("div"); |
288 Node* text = div->firstChild(); | 286 Node* text = div->firstChild(); |
289 | 287 |
290 GetDocument().Markers().AddSpellingMarker( | 288 GetDocument().Markers().AddSpellingMarker( |
291 EphemeralRange(Position(text, 0), Position(text, 8))); | 289 EphemeralRange(Position(text, 0), Position(text, 8))); |
292 | 290 |
293 GetDocument().GetFrame()->Selection().SetSelection( | 291 GetDocument().GetFrame()->Selection().SetSelection( |
294 SelectionInDOMTree::Builder() | 292 SelectionInDOMTree::Builder() |
295 .SetBaseAndExtent(Position(text, 8), Position(text, 8)) | 293 .SetBaseAndExtent(Position(text, 8), Position(text, 8)) |
296 .Build()); | 294 .Build()); |
297 | 295 |
298 Optional<std::pair<Node*, SpellCheckMarker*>> result = | 296 Optional<std::pair<Node*, SpellCheckMarker*>> result = |
299 GetDocument() | 297 GetDocument() |
300 .GetFrame() | 298 .GetFrame() |
301 ->GetSpellChecker() | 299 ->GetSpellChecker() |
302 .GetSpellCheckMarkerTouchingSelection(); | 300 .GetSpellCheckMarkerUnderSelection(); |
303 EXPECT_TRUE(result); | 301 EXPECT_FALSE(result); |
304 } | 302 } |
305 | 303 |
306 TEST_F(SpellCheckerTest, | 304 TEST_F(SpellCheckerTest, GetSpellCheckMarkerUnderSelection_CaretMiddleOfWord) { |
307 GetSpellCheckMarkerTouchingSelection_CaretMiddleOfWord) { | |
308 SetBodyContent( | 305 SetBodyContent( |
309 "<div contenteditable>" | 306 "<div contenteditable>" |
310 "spllchck" | 307 "spllchck" |
311 "</div>"); | 308 "</div>"); |
312 Element* div = GetDocument().QuerySelector("div"); | 309 Element* div = GetDocument().QuerySelector("div"); |
313 Node* text = div->firstChild(); | 310 Node* text = div->firstChild(); |
314 | 311 |
315 GetDocument().Markers().AddSpellingMarker( | 312 GetDocument().Markers().AddSpellingMarker( |
316 EphemeralRange(Position(text, 0), Position(text, 8))); | 313 EphemeralRange(Position(text, 0), Position(text, 8))); |
317 | 314 |
318 GetDocument().GetFrame()->Selection().SetSelection( | 315 GetDocument().GetFrame()->Selection().SetSelection( |
319 SelectionInDOMTree::Builder() | 316 SelectionInDOMTree::Builder() |
320 .SetBaseAndExtent(Position(text, 4), Position(text, 4)) | 317 .SetBaseAndExtent(Position(text, 4), Position(text, 4)) |
321 .Build()); | 318 .Build()); |
322 | 319 |
323 Optional<std::pair<Node*, SpellCheckMarker*>> result = | 320 Optional<std::pair<Node*, SpellCheckMarker*>> result = |
324 GetDocument() | 321 GetDocument() |
325 .GetFrame() | 322 .GetFrame() |
326 ->GetSpellChecker() | 323 ->GetSpellChecker() |
327 .GetSpellCheckMarkerTouchingSelection(); | 324 .GetSpellCheckMarkerUnderSelection(); |
328 EXPECT_TRUE(result); | 325 EXPECT_TRUE(result); |
329 } | 326 } |
330 | 327 |
331 TEST_F(SpellCheckerTest, | 328 TEST_F(SpellCheckerTest, |
332 GetSpellCheckMarkerTouchingSelection_CaretOneCharLeftOfMisspelling) { | 329 GetSpellCheckMarkerUnderSelection_CaretOneCharLeftOfMisspelling) { |
333 SetBodyContent( | 330 SetBodyContent( |
334 "<div contenteditable>" | 331 "<div contenteditable>" |
335 "a spllchck" | 332 "a spllchck" |
336 "</div>"); | 333 "</div>"); |
337 Element* div = GetDocument().QuerySelector("div"); | 334 Element* div = GetDocument().QuerySelector("div"); |
338 Node* text = div->firstChild(); | 335 Node* text = div->firstChild(); |
339 | 336 |
340 GetDocument().Markers().AddSpellingMarker( | 337 GetDocument().Markers().AddSpellingMarker( |
341 EphemeralRange(Position(text, 2), Position(text, 10))); | 338 EphemeralRange(Position(text, 2), Position(text, 10))); |
342 | 339 |
343 GetDocument().GetFrame()->Selection().SetSelection( | 340 GetDocument().GetFrame()->Selection().SetSelection( |
344 SelectionInDOMTree::Builder() | 341 SelectionInDOMTree::Builder() |
345 .SetBaseAndExtent(Position(text, 1), Position(text, 1)) | 342 .SetBaseAndExtent(Position(text, 1), Position(text, 1)) |
346 .Build()); | 343 .Build()); |
347 | 344 |
348 Optional<std::pair<Node*, SpellCheckMarker*>> result = | 345 Optional<std::pair<Node*, SpellCheckMarker*>> result = |
349 GetDocument() | 346 GetDocument() |
350 .GetFrame() | 347 .GetFrame() |
351 ->GetSpellChecker() | 348 ->GetSpellChecker() |
352 .GetSpellCheckMarkerTouchingSelection(); | 349 .GetSpellCheckMarkerUnderSelection(); |
353 EXPECT_FALSE(result); | 350 EXPECT_FALSE(result); |
354 } | 351 } |
355 | 352 |
356 TEST_F(SpellCheckerTest, | 353 TEST_F(SpellCheckerTest, |
357 GetSpellCheckMarkerTouchingSelection_CaretOneCharRightOfMisspelling) { | 354 GetSpellCheckMarkerUnderSelection_CaretOneCharRightOfMisspelling) { |
358 SetBodyContent( | 355 SetBodyContent( |
359 "<div contenteditable>" | 356 "<div contenteditable>" |
360 "spllchck a" | 357 "spllchck a" |
361 "</div>"); | 358 "</div>"); |
362 Element* div = GetDocument().QuerySelector("div"); | 359 Element* div = GetDocument().QuerySelector("div"); |
363 Node* text = div->firstChild(); | 360 Node* text = div->firstChild(); |
364 | 361 |
365 GetDocument().Markers().AddSpellingMarker( | 362 GetDocument().Markers().AddSpellingMarker( |
366 EphemeralRange(Position(text, 0), Position(text, 8))); | 363 EphemeralRange(Position(text, 0), Position(text, 8))); |
367 | 364 |
368 GetDocument().GetFrame()->Selection().SetSelection( | 365 GetDocument().GetFrame()->Selection().SetSelection( |
369 SelectionInDOMTree::Builder() | 366 SelectionInDOMTree::Builder() |
370 .SetBaseAndExtent(Position(text, 9), Position(text, 9)) | 367 .SetBaseAndExtent(Position(text, 9), Position(text, 9)) |
371 .Build()); | 368 .Build()); |
372 | 369 |
373 Optional<std::pair<Node*, SpellCheckMarker*>> result = | 370 Optional<std::pair<Node*, SpellCheckMarker*>> result = |
374 GetDocument() | 371 GetDocument() |
375 .GetFrame() | 372 .GetFrame() |
376 ->GetSpellChecker() | 373 ->GetSpellChecker() |
377 .GetSpellCheckMarkerTouchingSelection(); | 374 .GetSpellCheckMarkerUnderSelection(); |
378 EXPECT_FALSE(result); | 375 EXPECT_FALSE(result); |
379 } | 376 } |
380 | 377 |
381 } // namespace blink | 378 } // namespace blink |
OLD | NEW |