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..2e982175360ecfdf189a1d33a81aef0501b46947 100644 |
--- a/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckRequester.cpp |
+++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckRequester.cpp |
@@ -67,25 +67,38 @@ DEFINE_TRACE(SpellCheckRequest) |
TextCheckingRequest::trace(visitor); |
} |
-// static |
-PassRefPtrWillBeRawPtr<SpellCheckRequest> SpellCheckRequest::create(TextCheckingTypeMask textCheckingOptions, TextCheckingProcessType processType, PassRefPtrWillBeRawPtr<Range> checkingRange, PassRefPtrWillBeRawPtr<Range> paragraphRange, int requestNumber) |
+void SpellCheckRequest::dispose() |
{ |
- ASSERT(checkingRange); |
- ASSERT(paragraphRange); |
+ if (m_checkingRange) |
+ m_checkingRange->dispose(); |
+ if (m_paragraphRange && m_paragraphRange != m_checkingRange) |
+ m_paragraphRange->dispose(); |
+} |
- String text = checkingRange->text(); |
- if (!text.length()) |
+// static |
+PassRefPtrWillBeRawPtr<SpellCheckRequest> SpellCheckRequest::create(TextCheckingTypeMask textCheckingOptions, TextCheckingProcessType processType, const EphemeralRange& checkingRange, const EphemeralRange& paragraphRange, int requestNumber) |
+{ |
+ 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 |
@@ -213,12 +226,10 @@ 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(); |
+ if (!m_processingRequest) |
+ return; |
+ m_processingRequest->dispose(); |
m_processingRequest.clear(); |
} |