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 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 if (fullParagraphToCheck.isEmpty()) | 382 if (fullParagraphToCheck.isEmpty()) |
383 return; | 383 return; |
384 const EphemeralRange& paragraphRange = fullParagraphToCheck.paragraphRange()
; | 384 const EphemeralRange& paragraphRange = fullParagraphToCheck.paragraphRange()
; |
385 | 385 |
386 // Since the text may be quite big chunk it up and adjust to the sentence bo
undary. | 386 // Since the text may be quite big chunk it up and adjust to the sentence bo
undary. |
387 const int kChunkSize = 16 * 1024; | 387 const int kChunkSize = 16 * 1024; |
388 | 388 |
389 // Check the full paragraph instead if the paragraph is short, which saves | 389 // Check the full paragraph instead if the paragraph is short, which saves |
390 // the cost on sentence boundary finding. | 390 // the cost on sentence boundary finding. |
391 if (fullParagraphToCheck.rangeLength() <= kChunkSize) { | 391 if (fullParagraphToCheck.rangeLength() <= kChunkSize) { |
392 SpellCheckRequest* request = SpellCheckRequest::create(TextCheckingProce
ssBatch, paragraphRange, paragraphRange, 0); | 392 SpellCheckRequest* request = SpellCheckRequest::create(TextCheckingProce
ssBatch, paragraphRange, 0); |
393 if (request) | 393 if (request) |
394 m_spellCheckRequester->requestCheckingFor(request); | 394 m_spellCheckRequester->requestCheckingFor(request); |
395 return; | 395 return; |
396 } | 396 } |
397 | 397 |
398 CharacterIterator checkRangeIterator(fullParagraphToCheck.checkingRange(), T
extIteratorEmitsObjectReplacementCharacter); | 398 CharacterIterator checkRangeIterator(fullParagraphToCheck.checkingRange(), T
extIteratorEmitsObjectReplacementCharacter); |
399 for (int requestNum = 0; !checkRangeIterator.atEnd(); requestNum++) { | 399 for (int requestNum = 0; !checkRangeIterator.atEnd(); requestNum++) { |
400 EphemeralRange chunkRange = checkRangeIterator.calculateCharacterSubrang
e(0, kChunkSize); | 400 EphemeralRange chunkRange = checkRangeIterator.calculateCharacterSubrang
e(0, kChunkSize); |
401 EphemeralRange checkRange = requestNum ? expandEndToSentenceBoundary(chu
nkRange) : expandRangeToSentenceBoundary(chunkRange); | 401 EphemeralRange checkRange = requestNum ? expandEndToSentenceBoundary(chu
nkRange) : expandRangeToSentenceBoundary(chunkRange); |
402 | 402 |
403 SpellCheckRequest* request = SpellCheckRequest::create(TextCheckingProce
ssBatch, checkRange, paragraphRange, requestNum); | 403 SpellCheckRequest* request = SpellCheckRequest::create(TextCheckingProce
ssBatch, checkRange, requestNum); |
404 if (request) | 404 if (request) |
405 m_spellCheckRequester->requestCheckingFor(request); | 405 m_spellCheckRequester->requestCheckingFor(request); |
406 | 406 |
407 if (!checkRangeIterator.atEnd()) { | 407 if (!checkRangeIterator.atEnd()) { |
408 checkRangeIterator.advance(1); | 408 checkRangeIterator.advance(1); |
409 // The layout should be already update due to the initialization of
checkRangeIterator, | 409 // The layout should be already update due to the initialization of
checkRangeIterator, |
410 // so comparePositions can be directly called. | 410 // so comparePositions can be directly called. |
411 if (comparePositions(chunkRange.endPosition(), checkRange.endPositio
n()) < 0) | 411 if (comparePositions(chunkRange.endPosition(), checkRange.endPositio
n()) < 0) |
412 checkRangeIterator.advance(TextIterator::rangeLength(chunkRange.
endPosition(), checkRange.endPosition())); | 412 checkRangeIterator.advance(TextIterator::rangeLength(chunkRange.
endPosition(), checkRange.endPosition())); |
413 } | 413 } |
414 } | 414 } |
415 } | 415 } |
416 | 416 |
417 void SpellChecker::markAndReplaceFor(SpellCheckRequest* request, const Vector<Te
xtCheckingResult>& results) | 417 void SpellChecker::markAndReplaceFor(SpellCheckRequest* request, const Vector<Te
xtCheckingResult>& results) |
418 { | 418 { |
419 TRACE_EVENT0("blink", "SpellChecker::markAndReplaceFor"); | 419 TRACE_EVENT0("blink", "SpellChecker::markAndReplaceFor"); |
420 DCHECK(request); | 420 DCHECK(request); |
421 if (!frame().selection().isAvailable()) { | 421 if (!frame().selection().isAvailable()) { |
422 // "editing/spelling/spellcheck-async-remove-frame.html" reaches here. | 422 // "editing/spelling/spellcheck-async-remove-frame.html" reaches here. |
423 return; | 423 return; |
424 } | 424 } |
425 if (!request->isValid()) | 425 if (!request->isValid()) |
426 return; | 426 return; |
427 if (request->rootEditableElement()->document() != frame().selection().docume
nt()) { | 427 if (request->rootEditableElement()->document() != frame().selection().docume
nt()) { |
428 // we ignore |request| made for another document. | 428 // we ignore |request| made for another document. |
429 // "editing/spelling/spellcheck-sequencenum.html" and others reach here. | 429 // "editing/spelling/spellcheck-sequencenum.html" and others reach here. |
430 return; | 430 return; |
431 } | 431 } |
432 | 432 |
433 TextCheckingParagraph paragraph(request->checkingRange(), request->paragraph
Range()); | 433 TextCheckingParagraph paragraph(request->checkingRange(), request->checkingR
ange()); |
434 | 434 |
435 // Expand the range to encompass entire paragraphs, since text checking need
s that much context. | 435 // Expand the range to encompass entire paragraphs, since text checking need
s that much context. |
436 int selectionOffset = 0; | 436 int selectionOffset = 0; |
437 int ambiguousBoundaryOffset = -1; | 437 int ambiguousBoundaryOffset = -1; |
438 bool selectionChanged = false; | 438 bool selectionChanged = false; |
439 bool restoreSelectionAfterChange = false; | 439 bool restoreSelectionAfterChange = false; |
440 bool adjustSelectionForParagraphBoundaries = false; | 440 bool adjustSelectionForParagraphBoundaries = false; |
441 | 441 |
442 if (frame().selection().isCaret()) { | 442 if (frame().selection().isCaret()) { |
443 // Attempt to save the caret position so we can restore it later if need
ed | 443 // Attempt to save the caret position so we can restore it later if need
ed |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
768 } | 768 } |
769 | 769 |
770 void SpellChecker::cancelCheck() | 770 void SpellChecker::cancelCheck() |
771 { | 771 { |
772 m_spellCheckRequester->cancelCheck(); | 772 m_spellCheckRequester->cancelCheck(); |
773 } | 773 } |
774 | 774 |
775 void SpellChecker::requestTextChecking(const Element& element) | 775 void SpellChecker::requestTextChecking(const Element& element) |
776 { | 776 { |
777 const EphemeralRange rangeToCheck = EphemeralRange::rangeOfContents(element)
; | 777 const EphemeralRange rangeToCheck = EphemeralRange::rangeOfContents(element)
; |
778 m_spellCheckRequester->requestCheckingFor(SpellCheckRequest::create(TextChec
kingProcessBatch, rangeToCheck, rangeToCheck)); | 778 m_spellCheckRequester->requestCheckingFor(SpellCheckRequest::create(TextChec
kingProcessBatch, rangeToCheck)); |
779 } | 779 } |
780 | 780 |
781 DEFINE_TRACE(SpellChecker) | 781 DEFINE_TRACE(SpellChecker) |
782 { | 782 { |
783 visitor->trace(m_frame); | 783 visitor->trace(m_frame); |
784 visitor->trace(m_spellCheckRequester); | 784 visitor->trace(m_spellCheckRequester); |
785 } | 785 } |
786 | 786 |
787 void SpellChecker::prepareForLeakDetection() | 787 void SpellChecker::prepareForLeakDetection() |
788 { | 788 { |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 VisiblePosition newParagraphStart = startOfNextParagraph(createVisiblePo
sition(paragraphEnd)); | 889 VisiblePosition newParagraphStart = startOfNextParagraph(createVisiblePo
sition(paragraphEnd)); |
890 paragraphStart = newParagraphStart.toParentAnchoredPosition(); | 890 paragraphStart = newParagraphStart.toParentAnchoredPosition(); |
891 paragraphEnd = endOfParagraph(newParagraphStart).toParentAnchoredPositio
n(); | 891 paragraphEnd = endOfParagraph(newParagraphStart).toParentAnchoredPositio
n(); |
892 firstIteration = false; | 892 firstIteration = false; |
893 totalLengthProcessed += currentLength; | 893 totalLengthProcessed += currentLength; |
894 } | 894 } |
895 return std::make_pair(firstFoundItem, firstFoundOffset); | 895 return std::make_pair(firstFoundItem, firstFoundOffset); |
896 } | 896 } |
897 | 897 |
898 } // namespace blink | 898 } // namespace blink |
OLD | NEW |