| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 #include "core/editing/markers/DocumentMarkerController.h" | 31 #include "core/editing/markers/DocumentMarkerController.h" |
| 32 #include "core/editing/spellcheck/SpellChecker.h" | 32 #include "core/editing/spellcheck/SpellChecker.h" |
| 33 #include "core/frame/LocalFrame.h" | 33 #include "core/frame/LocalFrame.h" |
| 34 #include "core/frame/Settings.h" | 34 #include "core/frame/Settings.h" |
| 35 #include "platform/text/TextCheckerClient.h" | 35 #include "platform/text/TextCheckerClient.h" |
| 36 | 36 |
| 37 namespace blink { | 37 namespace blink { |
| 38 | 38 |
| 39 SpellCheckRequest::SpellCheckRequest( | 39 SpellCheckRequest::SpellCheckRequest( |
| 40 Range* checkingRange, | 40 Range* checkingRange, |
| 41 Range* paragraphRange, | |
| 42 const String& text, | 41 const String& text, |
| 43 TextCheckingProcessType processType, | 42 TextCheckingProcessType processType, |
| 44 const Vector<uint32_t>& documentMarkersInRange, | 43 const Vector<uint32_t>& documentMarkersInRange, |
| 45 const Vector<unsigned>& documentMarkerOffsets, | 44 const Vector<unsigned>& documentMarkerOffsets, |
| 46 int requestNumber) | 45 int requestNumber) |
| 47 : m_requester(nullptr) | 46 : m_requester(nullptr) |
| 48 , m_checkingRange(checkingRange) | 47 , m_checkingRange(checkingRange) |
| 49 , m_paragraphRange(paragraphRange) | |
| 50 , m_rootEditableElement(blink::rootEditableElement(*m_checkingRange->startCo
ntainer())) | 48 , m_rootEditableElement(blink::rootEditableElement(*m_checkingRange->startCo
ntainer())) |
| 51 , m_requestData(unrequestedTextCheckingSequence, text, processType, document
MarkersInRange, documentMarkerOffsets) | 49 , m_requestData(unrequestedTextCheckingSequence, text, processType, document
MarkersInRange, documentMarkerOffsets) |
| 52 , m_requestNumber(requestNumber) | 50 , m_requestNumber(requestNumber) |
| 53 { | 51 { |
| 54 DCHECK(m_checkingRange); | 52 DCHECK(m_checkingRange); |
| 55 DCHECK(m_checkingRange->isConnected()); | 53 DCHECK(m_checkingRange->isConnected()); |
| 56 DCHECK(m_paragraphRange); | |
| 57 DCHECK(m_paragraphRange->isConnected()); | |
| 58 DCHECK(m_rootEditableElement); | 54 DCHECK(m_rootEditableElement); |
| 59 } | 55 } |
| 60 | 56 |
| 61 SpellCheckRequest::~SpellCheckRequest() | 57 SpellCheckRequest::~SpellCheckRequest() |
| 62 { | 58 { |
| 63 } | 59 } |
| 64 | 60 |
| 65 DEFINE_TRACE(SpellCheckRequest) | 61 DEFINE_TRACE(SpellCheckRequest) |
| 66 { | 62 { |
| 67 visitor->trace(m_requester); | 63 visitor->trace(m_requester); |
| 68 visitor->trace(m_checkingRange); | 64 visitor->trace(m_checkingRange); |
| 69 visitor->trace(m_paragraphRange); | |
| 70 visitor->trace(m_rootEditableElement); | 65 visitor->trace(m_rootEditableElement); |
| 71 TextCheckingRequest::trace(visitor); | 66 TextCheckingRequest::trace(visitor); |
| 72 } | 67 } |
| 73 | 68 |
| 74 void SpellCheckRequest::dispose() | 69 void SpellCheckRequest::dispose() |
| 75 { | 70 { |
| 76 if (m_checkingRange) | 71 if (m_checkingRange) |
| 77 m_checkingRange->dispose(); | 72 m_checkingRange->dispose(); |
| 78 if (m_paragraphRange && m_paragraphRange != m_checkingRange) | |
| 79 m_paragraphRange->dispose(); | |
| 80 } | 73 } |
| 81 | 74 |
| 82 // static | 75 // static |
| 83 SpellCheckRequest* SpellCheckRequest::create(TextCheckingProcessType processType
, const EphemeralRange& checkingRange, const EphemeralRange& paragraphRange, int
requestNumber) | 76 SpellCheckRequest* SpellCheckRequest::create(TextCheckingProcessType processType
, const EphemeralRange& checkingRange, int requestNumber) |
| 84 { | 77 { |
| 85 if (checkingRange.isNull()) | 78 if (checkingRange.isNull()) |
| 86 return nullptr; | 79 return nullptr; |
| 87 if (!blink::rootEditableElement(*checkingRange.startPosition().computeContai
nerNode())) | 80 if (!blink::rootEditableElement(*checkingRange.startPosition().computeContai
nerNode())) |
| 88 return nullptr; | 81 return nullptr; |
| 89 | 82 |
| 90 String text = plainText(checkingRange, TextIteratorEmitsObjectReplacementCha
racter); | 83 String text = plainText(checkingRange, TextIteratorEmitsObjectReplacementCha
racter); |
| 91 if (text.isEmpty()) | 84 if (text.isEmpty()) |
| 92 return nullptr; | 85 return nullptr; |
| 93 | 86 |
| 94 Range* checkingRangeObject = createRange(checkingRange); | 87 Range* checkingRangeObject = createRange(checkingRange); |
| 95 Range* paragraphRangeObject = nullptr; | |
| 96 // Share identical Range objects. | |
| 97 if (checkingRange == paragraphRange) | |
| 98 paragraphRangeObject = checkingRangeObject; | |
| 99 else | |
| 100 paragraphRangeObject = createRange(paragraphRange); | |
| 101 | 88 |
| 102 const DocumentMarkerVector& markers = checkingRangeObject->ownerDocument().m
arkers().markersInRange(checkingRange, DocumentMarker::SpellCheckClientMarkers()
); | 89 const DocumentMarkerVector& markers = checkingRangeObject->ownerDocument().m
arkers().markersInRange(checkingRange, DocumentMarker::SpellCheckClientMarkers()
); |
| 103 Vector<uint32_t> hashes(markers.size()); | 90 Vector<uint32_t> hashes(markers.size()); |
| 104 Vector<unsigned> offsets(markers.size()); | 91 Vector<unsigned> offsets(markers.size()); |
| 105 for (size_t i = 0; i < markers.size(); ++i) { | 92 for (size_t i = 0; i < markers.size(); ++i) { |
| 106 hashes[i] = markers[i]->hash(); | 93 hashes[i] = markers[i]->hash(); |
| 107 offsets[i] = markers[i]->startOffset(); | 94 offsets[i] = markers[i]->startOffset(); |
| 108 } | 95 } |
| 109 | 96 |
| 110 return new SpellCheckRequest(checkingRangeObject, paragraphRangeObject, text
, processType, hashes, offsets, requestNumber); | 97 return new SpellCheckRequest(checkingRangeObject, text, processType, hashes,
offsets, requestNumber); |
| 111 } | 98 } |
| 112 | 99 |
| 113 const TextCheckingRequestData& SpellCheckRequest::data() const | 100 const TextCheckingRequestData& SpellCheckRequest::data() const |
| 114 { | 101 { |
| 115 return m_requestData; | 102 return m_requestData; |
| 116 } | 103 } |
| 117 | 104 |
| 118 bool SpellCheckRequest::isValid() const | 105 bool SpellCheckRequest::isValid() const |
| 119 { | 106 { |
| 120 return m_checkingRange->isConnected() && m_paragraphRange->isConnected() &&
m_rootEditableElement->isConnected(); | 107 return m_checkingRange->isConnected() && m_rootEditableElement->isConnected(
); |
| 121 } | 108 } |
| 122 | 109 |
| 123 void SpellCheckRequest::didSucceed(const Vector<TextCheckingResult>& results) | 110 void SpellCheckRequest::didSucceed(const Vector<TextCheckingResult>& results) |
| 124 { | 111 { |
| 125 if (!m_requester) | 112 if (!m_requester) |
| 126 return; | 113 return; |
| 127 SpellCheckRequester* requester = m_requester; | 114 SpellCheckRequester* requester = m_requester; |
| 128 m_requester = nullptr; | 115 m_requester = nullptr; |
| 129 requester->didCheckSucceed(m_requestData.sequence(), results); | 116 requester->didCheckSucceed(m_requestData.sequence(), results); |
| 130 } | 117 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 if (!range || !range->firstNode() || !range->firstNode()->layoutObject()) | 164 if (!range || !range->firstNode() || !range->firstNode()->layoutObject()) |
| 178 return false; | 165 return false; |
| 179 const Node* node = range->startContainer(); | 166 const Node* node = range->startContainer(); |
| 180 if (node && node->isElementNode() && !toElement(node)->isSpellCheckingEnable
d()) | 167 if (node && node->isElementNode() && !toElement(node)->isSpellCheckingEnable
d()) |
| 181 return false; | 168 return false; |
| 182 return true; | 169 return true; |
| 183 } | 170 } |
| 184 | 171 |
| 185 void SpellCheckRequester::requestCheckingFor(SpellCheckRequest* request) | 172 void SpellCheckRequester::requestCheckingFor(SpellCheckRequest* request) |
| 186 { | 173 { |
| 187 if (!request || !canCheckAsynchronously(request->paragraphRange())) | 174 if (!request || !canCheckAsynchronously(request->checkingRange())) |
| 188 return; | 175 return; |
| 189 | 176 |
| 190 DCHECK_EQ(request->data().sequence(), unrequestedTextCheckingSequence); | 177 DCHECK_EQ(request->data().sequence(), unrequestedTextCheckingSequence); |
| 191 int sequence = ++m_lastRequestSequence; | 178 int sequence = ++m_lastRequestSequence; |
| 192 if (sequence == unrequestedTextCheckingSequence) | 179 if (sequence == unrequestedTextCheckingSequence) |
| 193 sequence = ++m_lastRequestSequence; | 180 sequence = ++m_lastRequestSequence; |
| 194 | 181 |
| 195 request->setCheckerAndSequence(this, sequence); | 182 request->setCheckerAndSequence(this, sequence); |
| 196 | 183 |
| 197 if (m_timerToProcessQueuedRequest.isActive() || m_processingRequest) { | 184 if (m_timerToProcessQueuedRequest.isActive() || m_processingRequest) { |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 } | 293 } |
| 307 | 294 |
| 308 DEFINE_TRACE(SpellCheckRequester) | 295 DEFINE_TRACE(SpellCheckRequester) |
| 309 { | 296 { |
| 310 visitor->trace(m_frame); | 297 visitor->trace(m_frame); |
| 311 visitor->trace(m_processingRequest); | 298 visitor->trace(m_processingRequest); |
| 312 visitor->trace(m_requestQueue); | 299 visitor->trace(m_requestQueue); |
| 313 } | 300 } |
| 314 | 301 |
| 315 } // namespace blink | 302 } // namespace blink |
| OLD | NEW |