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(); |
} |