 Chromium Code Reviews
 Chromium Code Reviews Issue 1369713002:
  Avoid creating duplicate Range objects when handling misspellings.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 1369713002:
  Avoid creating duplicate Range objects when handling misspellings.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| Index: third_party/WebKit/Source/core/editing/spellcheck/SpellCheckRequester.cpp | 
| diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckRequester.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckRequester.cpp | 
| index acdea4597f8967f6609b5699ebd750859fa50932..6e83fac46b3174fcaba16251892c5c765f7bc24f 100644 | 
| --- a/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckRequester.cpp | 
| +++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckRequester.cpp | 
| @@ -68,24 +68,29 @@ DEFINE_TRACE(SpellCheckRequest) | 
| } | 
| // static | 
| -PassRefPtrWillBeRawPtr<SpellCheckRequest> SpellCheckRequest::create(TextCheckingTypeMask textCheckingOptions, TextCheckingProcessType processType, PassRefPtrWillBeRawPtr<Range> checkingRange, PassRefPtrWillBeRawPtr<Range> paragraphRange, int requestNumber) | 
| +PassRefPtrWillBeRawPtr<SpellCheckRequest> SpellCheckRequest::create(TextCheckingTypeMask textCheckingOptions, TextCheckingProcessType processType, const EphemeralRange& checkingRange, const EphemeralRange& paragraphRange, int requestNumber) | 
| { | 
| - ASSERT(checkingRange); | 
| - ASSERT(paragraphRange); | 
| - | 
| - String text = checkingRange->text(); | 
| - if (!text.length()) | 
| + String text = plainText(checkingRange, TextIteratorEmitsObjectReplacementCharacter); | 
| + if (text.isEmpty()) | 
| return nullptr; | 
| - const DocumentMarkerVector& markers = checkingRange->ownerDocument().markers().markersInRange(EphemeralRange(checkingRange.get()), DocumentMarker::SpellCheckClientMarkers()); | 
| + RefPtrWillBeRawPtr<Range> checkingRangeObject = createRange(checkingRange); | 
| + RefPtrWillBeRawPtr<Range> paragraphRangeObject = nullptr; | 
| + // Share identical Range objects. | 
| + if (checkingRange == paragraphRange) | 
| + paragraphRangeObject = checkingRangeObject; | 
| + else | 
| + paragraphRangeObject = createRange(paragraphRange); | 
| + | 
| + const DocumentMarkerVector& markers = checkingRangeObject->ownerDocument().markers().markersInRange(checkingRange, DocumentMarker::SpellCheckClientMarkers()); | 
| Vector<uint32_t> hashes(markers.size()); | 
| Vector<unsigned> offsets(markers.size()); | 
| - for (size_t i = 0; i < markers.size(); i++) { | 
| + for (size_t i = 0; i < markers.size(); ++i) { | 
| hashes[i] = markers[i]->hash(); | 
| offsets[i] = markers[i]->startOffset(); | 
| } | 
| - return adoptRefWillBeNoop(new SpellCheckRequest(checkingRange, paragraphRange, text, textCheckingOptions, processType, hashes, offsets, requestNumber)); | 
| + return adoptRefWillBeNoop(new SpellCheckRequest(checkingRangeObject, paragraphRangeObject, text, textCheckingOptions, processType, hashes, offsets, requestNumber)); | 
| } | 
| const TextCheckingRequestData& SpellCheckRequest::data() const | 
| @@ -214,10 +219,12 @@ void SpellCheckRequester::invokeRequest(PassRefPtrWillBeRawPtr<SpellCheckRequest | 
| void SpellCheckRequester::clearProcessingRequest() | 
| { | 
| // This assumes that m_processingRequest's Ranges aren't shared. | 
| - if (m_processingRequest->checkingRange()) | 
| - m_processingRequest->checkingRange()->dispose(); | 
| - if (m_processingRequest->paragraphRange()) | 
| - m_processingRequest->paragraphRange()->dispose(); | 
| + RefPtrWillBeRawPtr<Range> checkingRange = m_processingRequest->checkingRange(); | 
| 
yosin_UTC9
2015/09/26 15:46:06
nit: Can we have |SpellCheckRequest::dispose()| or
 
sof
2015/09/26 16:18:29
Addressed.
 | 
| + RefPtrWillBeRawPtr<Range> paragraphRange = m_processingRequest->paragraphRange(); | 
| + if (checkingRange) | 
| + checkingRange->dispose(); | 
| + if (paragraphRange && paragraphRange != checkingRange) | 
| + paragraphRange->dispose(); | 
| m_processingRequest.clear(); | 
| } |