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 |