OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. |
3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
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 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 | 194 |
195 // If spellingSearchRange starts in the middle of a word, advance to the nex
t word so we start checking | 195 // If spellingSearchRange starts in the middle of a word, advance to the nex
t word so we start checking |
196 // at a word boundary. Going back by one char and then forward by a word doe
s the trick. | 196 // at a word boundary. Going back by one char and then forward by a word doe
s the trick. |
197 if (startedWithSelection) { | 197 if (startedWithSelection) { |
198 VisiblePosition oneBeforeStart = startVisiblePosition(spellingSearchRang
e.get(), DOWNSTREAM).previous(); | 198 VisiblePosition oneBeforeStart = startVisiblePosition(spellingSearchRang
e.get(), DOWNSTREAM).previous(); |
199 if (oneBeforeStart.isNotNull()) | 199 if (oneBeforeStart.isNotNull()) |
200 setStart(spellingSearchRange.get(), endOfWord(oneBeforeStart)); | 200 setStart(spellingSearchRange.get(), endOfWord(oneBeforeStart)); |
201 // else we were already at the start of the editable node | 201 // else we were already at the start of the editable node |
202 } | 202 } |
203 | 203 |
204 if (spellingSearchRange->collapsed(IGNORE_EXCEPTION)) | 204 if (spellingSearchRange->collapsed()) |
205 return; // nothing to search in | 205 return; // nothing to search in |
206 | 206 |
207 // We go to the end of our first range instead of the start of it, just to b
e sure | 207 // We go to the end of our first range instead of the start of it, just to b
e sure |
208 // we don't get foiled by any word boundary problems at the start. It means
we might | 208 // we don't get foiled by any word boundary problems at the start. It means
we might |
209 // do a tiny bit more searching. | 209 // do a tiny bit more searching. |
210 Node* searchEndNodeAfterWrap = spellingSearchRange->endContainer(); | 210 Node* searchEndNodeAfterWrap = spellingSearchRange->endContainer(); |
211 int searchEndOffsetAfterWrap = spellingSearchRange->endOffset(); | 211 int searchEndOffsetAfterWrap = spellingSearchRange->endOffset(); |
212 | 212 |
213 int misspellingOffset = 0; | 213 int misspellingOffset = 0; |
214 GrammarDetail grammarDetail; | 214 GrammarDetail grammarDetail; |
215 int grammarPhraseOffset = 0; | 215 int grammarPhraseOffset = 0; |
216 RefPtrWillBeRawPtr<Range> grammarSearchRange = nullptr; | 216 RefPtrWillBeRawPtr<Range> grammarSearchRange = nullptr; |
217 String badGrammarPhrase; | 217 String badGrammarPhrase; |
218 String misspelledWord; | 218 String misspelledWord; |
219 | 219 |
220 bool isSpelling = true; | 220 bool isSpelling = true; |
221 int foundOffset = 0; | 221 int foundOffset = 0; |
222 String foundItem; | 222 String foundItem; |
223 RefPtrWillBeRawPtr<Range> firstMisspellingRange = nullptr; | 223 RefPtrWillBeRawPtr<Range> firstMisspellingRange = nullptr; |
224 if (unifiedTextCheckerEnabled()) { | 224 if (unifiedTextCheckerEnabled()) { |
225 grammarSearchRange = spellingSearchRange->cloneRange(IGNORE_EXCEPTION); | 225 grammarSearchRange = spellingSearchRange->cloneRange(); |
226 foundItem = TextCheckingHelper(spellCheckerClient(), spellingSearchRange
).findFirstMisspellingOrBadGrammar(isGrammarCheckingEnabled(), isSpelling, found
Offset, grammarDetail); | 226 foundItem = TextCheckingHelper(spellCheckerClient(), spellingSearchRange
).findFirstMisspellingOrBadGrammar(isGrammarCheckingEnabled(), isSpelling, found
Offset, grammarDetail); |
227 if (isSpelling) { | 227 if (isSpelling) { |
228 misspelledWord = foundItem; | 228 misspelledWord = foundItem; |
229 misspellingOffset = foundOffset; | 229 misspellingOffset = foundOffset; |
230 } else { | 230 } else { |
231 badGrammarPhrase = foundItem; | 231 badGrammarPhrase = foundItem; |
232 grammarPhraseOffset = foundOffset; | 232 grammarPhraseOffset = foundOffset; |
233 } | 233 } |
234 } else { | 234 } else { |
235 misspelledWord = TextCheckingHelper(spellCheckerClient(), spellingSearch
Range).findFirstMisspelling(misspellingOffset, false, firstMisspellingRange); | 235 misspelledWord = TextCheckingHelper(spellCheckerClient(), spellingSearch
Range).findFirstMisspelling(misspellingOffset, false, firstMisspellingRange); |
236 grammarSearchRange = spellingSearchRange->cloneRange(IGNORE_EXCEPTION); | 236 grammarSearchRange = spellingSearchRange->cloneRange(); |
237 if (!misspelledWord.isEmpty()) { | 237 if (!misspelledWord.isEmpty()) { |
238 // Stop looking at start of next misspelled word | 238 // Stop looking at start of next misspelled word |
239 CharacterIterator chars(grammarSearchRange.get()); | 239 CharacterIterator chars(grammarSearchRange.get()); |
240 chars.advance(misspellingOffset); | 240 chars.advance(misspellingOffset); |
241 grammarSearchRange->setEnd(chars.range()->startContainer(), chars.ra
nge()->startOffset(), IGNORE_EXCEPTION); | 241 grammarSearchRange->setEnd(chars.range()->startContainer(), chars.ra
nge()->startOffset(), IGNORE_EXCEPTION); |
242 } | 242 } |
243 | 243 |
244 if (isGrammarCheckingEnabled()) | 244 if (isGrammarCheckingEnabled()) |
245 badGrammarPhrase = TextCheckingHelper(spellCheckerClient(), grammarS
earchRange).findFirstBadGrammar(grammarDetail, grammarPhraseOffset, false); | 245 badGrammarPhrase = TextCheckingHelper(spellCheckerClient(), grammarS
earchRange).findFirstBadGrammar(grammarDetail, grammarPhraseOffset, false); |
246 } | 246 } |
247 | 247 |
248 // If we found neither bad grammar nor a misspelled word, wrap and try again
(but don't bother if we started at the beginning of the | 248 // If we found neither bad grammar nor a misspelled word, wrap and try again
(but don't bother if we started at the beginning of the |
249 // block rather than at a selection). | 249 // block rather than at a selection). |
250 if (startedWithSelection && !misspelledWord && !badGrammarPhrase) { | 250 if (startedWithSelection && !misspelledWord && !badGrammarPhrase) { |
251 spellingSearchRange->setStart(topNode, 0, IGNORE_EXCEPTION); | 251 spellingSearchRange->setStart(topNode, 0, IGNORE_EXCEPTION); |
252 // going until the end of the very first chunk we tested is far enough | 252 // going until the end of the very first chunk we tested is far enough |
253 spellingSearchRange->setEnd(searchEndNodeAfterWrap, searchEndOffsetAfter
Wrap, IGNORE_EXCEPTION); | 253 spellingSearchRange->setEnd(searchEndNodeAfterWrap, searchEndOffsetAfter
Wrap, IGNORE_EXCEPTION); |
254 | 254 |
255 if (unifiedTextCheckerEnabled()) { | 255 if (unifiedTextCheckerEnabled()) { |
256 grammarSearchRange = spellingSearchRange->cloneRange(IGNORE_EXCEPTIO
N); | 256 grammarSearchRange = spellingSearchRange->cloneRange(); |
257 foundItem = TextCheckingHelper(spellCheckerClient(), spellingSearchR
ange).findFirstMisspellingOrBadGrammar(isGrammarCheckingEnabled(), isSpelling, f
oundOffset, grammarDetail); | 257 foundItem = TextCheckingHelper(spellCheckerClient(), spellingSearchR
ange).findFirstMisspellingOrBadGrammar(isGrammarCheckingEnabled(), isSpelling, f
oundOffset, grammarDetail); |
258 if (isSpelling) { | 258 if (isSpelling) { |
259 misspelledWord = foundItem; | 259 misspelledWord = foundItem; |
260 misspellingOffset = foundOffset; | 260 misspellingOffset = foundOffset; |
261 } else { | 261 } else { |
262 badGrammarPhrase = foundItem; | 262 badGrammarPhrase = foundItem; |
263 grammarPhraseOffset = foundOffset; | 263 grammarPhraseOffset = foundOffset; |
264 } | 264 } |
265 } else { | 265 } else { |
266 misspelledWord = TextCheckingHelper(spellCheckerClient(), spellingSe
archRange).findFirstMisspelling(misspellingOffset, false, firstMisspellingRange)
; | 266 misspelledWord = TextCheckingHelper(spellCheckerClient(), spellingSe
archRange).findFirstMisspelling(misspellingOffset, false, firstMisspellingRange)
; |
267 grammarSearchRange = spellingSearchRange->cloneRange(IGNORE_EXCEPTIO
N); | 267 grammarSearchRange = spellingSearchRange->cloneRange(); |
268 if (!misspelledWord.isEmpty()) { | 268 if (!misspelledWord.isEmpty()) { |
269 // Stop looking at start of next misspelled word | 269 // Stop looking at start of next misspelled word |
270 CharacterIterator chars(grammarSearchRange.get()); | 270 CharacterIterator chars(grammarSearchRange.get()); |
271 chars.advance(misspellingOffset); | 271 chars.advance(misspellingOffset); |
272 grammarSearchRange->setEnd(chars.range()->startContainer(), char
s.range()->startOffset(), IGNORE_EXCEPTION); | 272 grammarSearchRange->setEnd(chars.range()->startContainer(), char
s.range()->startOffset(), IGNORE_EXCEPTION); |
273 } | 273 } |
274 | 274 |
275 if (isGrammarCheckingEnabled()) | 275 if (isGrammarCheckingEnabled()) |
276 badGrammarPhrase = TextCheckingHelper(spellCheckerClient(), gram
marSearchRange).findFirstBadGrammar(grammarDetail, grammarPhraseOffset, false); | 276 badGrammarPhrase = TextCheckingHelper(spellCheckerClient(), gram
marSearchRange).findFirstBadGrammar(grammarDetail, grammarPhraseOffset, false); |
277 } | 277 } |
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
845 } | 845 } |
846 | 846 |
847 void SpellChecker::requestTextChecking(const Element& element) | 847 void SpellChecker::requestTextChecking(const Element& element) |
848 { | 848 { |
849 RefPtrWillBeRawPtr<Range> rangeToCheck = rangeOfContents(const_cast<Element*
>(&element)); | 849 RefPtrWillBeRawPtr<Range> rangeToCheck = rangeOfContents(const_cast<Element*
>(&element)); |
850 m_spellCheckRequester->requestCheckingFor(SpellCheckRequest::create(TextChec
kingTypeSpelling | TextCheckingTypeGrammar, TextCheckingProcessBatch, rangeToChe
ck, rangeToCheck)); | 850 m_spellCheckRequester->requestCheckingFor(SpellCheckRequest::create(TextChec
kingTypeSpelling | TextCheckingTypeGrammar, TextCheckingProcessBatch, rangeToChe
ck, rangeToCheck)); |
851 } | 851 } |
852 | 852 |
853 | 853 |
854 } // namespace WebCore | 854 } // namespace WebCore |
OLD | NEW |