| Index: Source/core/editing/SpellChecker.cpp
|
| diff --git a/Source/core/editing/SpellChecker.cpp b/Source/core/editing/SpellChecker.cpp
|
| index 97c1fd81bc82e9ec410b67c50c2872dbc4045c64..776b38a9abebb2dc6af918478f8f5e968ff461db 100644
|
| --- a/Source/core/editing/SpellChecker.cpp
|
| +++ b/Source/core/editing/SpellChecker.cpp
|
| @@ -46,12 +46,14 @@ SpellCheckRequest::SpellCheckRequest(
|
| TextCheckingTypeMask mask,
|
| TextCheckingProcessType processType,
|
| const Vector<uint32_t>& documentMarkersInRange,
|
| - const Vector<unsigned>& documentMarkerOffsets)
|
| + const Vector<unsigned>& documentMarkerOffsets,
|
| + int requestNo)
|
| : m_checker(0)
|
| , m_checkingRange(checkingRange)
|
| , m_paragraphRange(paragraphRange)
|
| , m_rootEditableElement(m_checkingRange->startContainer()->rootEditableElement())
|
| , m_requestData(unrequestedTextCheckingSequence, text, mask, processType, documentMarkersInRange, documentMarkerOffsets)
|
| + , m_requestNo(requestNo)
|
| {
|
| }
|
|
|
| @@ -62,6 +64,12 @@ SpellCheckRequest::~SpellCheckRequest()
|
| // static
|
| PassRefPtr<SpellCheckRequest> SpellCheckRequest::create(TextCheckingTypeMask textCheckingOptions, TextCheckingProcessType processType, PassRefPtr<Range> checkingRange, PassRefPtr<Range> paragraphRange)
|
| {
|
| + return SpellCheckRequest::create(textCheckingOptions, processType, checkingRange, paragraphRange, 0);
|
| +}
|
| +
|
| +// static
|
| +PassRefPtr<SpellCheckRequest> SpellCheckRequest::create(TextCheckingTypeMask textCheckingOptions, TextCheckingProcessType processType, PassRefPtr<Range> checkingRange, PassRefPtr<Range> paragraphRange, int requestNo)
|
| +{
|
| ASSERT(checkingRange);
|
| ASSERT(paragraphRange);
|
|
|
| @@ -77,7 +85,7 @@ PassRefPtr<SpellCheckRequest> SpellCheckRequest::create(TextCheckingTypeMask tex
|
| offsets[i] = markers[i]->startOffset();
|
| }
|
|
|
| - return adoptRef(new SpellCheckRequest(checkingRange, paragraphRange, text, textCheckingOptions, processType, hashes, offsets));
|
| + return adoptRef(new SpellCheckRequest(checkingRange, paragraphRange, text, textCheckingOptions, processType, hashes, offsets, requestNo));
|
| }
|
|
|
| const TextCheckingRequestData& SpellCheckRequest::data() const
|
| @@ -207,13 +215,21 @@ void SpellChecker::invokeRequest(PassRefPtr<SpellCheckRequest> request)
|
| void SpellChecker::enqueueRequest(PassRefPtr<SpellCheckRequest> request)
|
| {
|
| ASSERT(request);
|
| + bool continuation = false;
|
| + if (m_requestQueue.size() > 0) {
|
| + RefPtr<SpellCheckRequest> lastRequest = m_requestQueue.last();
|
| + continuation = request->rootEditableElement() == lastRequest->rootEditableElement()
|
| + && request->requestNo() == lastRequest->requestNo() + 1;
|
| + }
|
|
|
| - for (RequestQueue::iterator it = m_requestQueue.begin(); it != m_requestQueue.end(); ++it) {
|
| - if (request->rootEditableElement() != (*it)->rootEditableElement())
|
| - continue;
|
| + if (!continuation) {
|
| + for (RequestQueue::iterator it = m_requestQueue.begin(); it != m_requestQueue.end(); ++it) {
|
| + if (request->rootEditableElement() != (*it)->rootEditableElement())
|
| + continue;
|
|
|
| - *it = request;
|
| - return;
|
| + *it = request;
|
| + return;
|
| + }
|
| }
|
|
|
| m_requestQueue.append(request);
|
|
|