Index: content/shell/renderer/test_runner/spell_check_client.cc |
diff --git a/content/shell/renderer/test_runner/spell_check_client.cc b/content/shell/renderer/test_runner/spell_check_client.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bedaa1c4bab379fa476186fe32cdda148c70c4b2 |
--- /dev/null |
+++ b/content/shell/renderer/test_runner/spell_check_client.cc |
@@ -0,0 +1,152 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/shell/renderer/test_runner/spell_check_client.h" |
+ |
+#include "content/shell/renderer/test_runner/WebTestDelegate.h" |
+#include "content/shell/renderer/test_runner/mock_grammar_check.h" |
+#include "content/shell/renderer/test_runner/web_test_proxy.h" |
+#include "third_party/WebKit/public/web/WebTextCheckingCompletion.h" |
+#include "third_party/WebKit/public/web/WebTextCheckingResult.h" |
+ |
+namespace content { |
+ |
+namespace { |
+ |
+class HostMethodTask : public WebMethodTask<SpellCheckClient> { |
+ public: |
+ typedef void (SpellCheckClient::*CallbackMethodType)(); |
+ HostMethodTask(SpellCheckClient* object, CallbackMethodType callback) |
+ : WebMethodTask<SpellCheckClient>(object), callback_(callback) {} |
+ |
+ virtual ~HostMethodTask() {} |
+ |
+ virtual void runIfValid() OVERRIDE { (m_object->*callback_)(); } |
+ |
+ private: |
+ CallbackMethodType callback_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(HostMethodTask); |
+}; |
+ |
+} // namespace |
+ |
+SpellCheckClient::SpellCheckClient(WebTestProxyBase* web_test_proxy) |
+ : last_requested_text_checking_completion_(0), |
+ web_test_proxy_(web_test_proxy) { |
+} |
+ |
+SpellCheckClient::~SpellCheckClient() { |
+} |
+ |
+void SpellCheckClient::SetDelegate(WebTestDelegate* delegate) { |
+ delegate_ = delegate; |
+} |
+ |
+// blink::WebSpellCheckClient |
+void SpellCheckClient::spellCheck( |
+ const blink::WebString& text, |
+ int& misspelled_offset, |
+ int& misspelled_length, |
+ blink::WebVector<blink::WebString>* optional_suggestions) { |
+ // Check the spelling of the given text. |
+ spell_check_.SpellCheckWord(text, &misspelled_offset, &misspelled_length); |
+} |
+ |
+void SpellCheckClient::checkTextOfParagraph( |
+ const blink::WebString& text, |
+ blink::WebTextCheckingTypeMask mask, |
+ blink::WebVector<blink::WebTextCheckingResult>* web_results) { |
+ std::vector<blink::WebTextCheckingResult> results; |
+ if (mask & blink::WebTextCheckingTypeSpelling) { |
+ size_t offset = 0; |
+ base::string16 data = text; |
+ while (offset < data.length()) { |
+ int misspelled_position = 0; |
+ int misspelled_length = 0; |
+ spell_check_.SpellCheckWord( |
+ data.substr(offset), &misspelled_position, &misspelled_length); |
+ if (!misspelled_length) |
+ break; |
+ blink::WebTextCheckingResult result; |
+ result.decoration = blink::WebTextDecorationTypeSpelling; |
+ result.location = offset + misspelled_position; |
+ result.length = misspelled_length; |
+ results.push_back(result); |
+ offset += misspelled_position + misspelled_length; |
+ } |
+ } |
+ if (mask & blink::WebTextCheckingTypeGrammar) |
+ MockGrammarCheck::CheckGrammarOfString(text, &results); |
+ web_results->assign(results); |
+} |
+ |
+void SpellCheckClient::requestCheckingOfText( |
+ const blink::WebString& text, |
+ const blink::WebVector<uint32_t>& markers, |
+ const blink::WebVector<unsigned>& marker_offsets, |
+ blink::WebTextCheckingCompletion* completion) { |
+ if (text.isEmpty()) { |
+ if (completion) |
+ completion->didCancelCheckingText(); |
+ return; |
+ } |
+ |
+ if (last_requested_text_checking_completion_) |
+ last_requested_text_checking_completion_->didCancelCheckingText(); |
+ |
+ last_requested_text_checking_completion_ = completion; |
+ last_requested_text_check_string_ = text; |
+ if (spell_check_.HasInCache(text)) |
+ FinishLastTextCheck(); |
+ else |
+ delegate_->postDelayedTask( |
+ new HostMethodTask(this, &SpellCheckClient::FinishLastTextCheck), 0); |
+} |
+ |
+void SpellCheckClient::FinishLastTextCheck() { |
+ if (!last_requested_text_checking_completion_) |
+ return; |
+ std::vector<blink::WebTextCheckingResult> results; |
+ int offset = 0; |
+ base::string16 text = last_requested_text_check_string_; |
+ if (!spell_check_.IsMultiWordMisspelling(blink::WebString(text), &results)) { |
+ while (text.length()) { |
+ int misspelled_position = 0; |
+ int misspelled_length = 0; |
+ spell_check_.SpellCheckWord( |
+ blink::WebString(text), &misspelled_position, &misspelled_length); |
+ if (!misspelled_length) |
+ break; |
+ blink::WebVector<blink::WebString> suggestions; |
+ spell_check_.FillSuggestionList( |
+ blink::WebString(text.substr(misspelled_position, misspelled_length)), |
+ &suggestions); |
+ results.push_back(blink::WebTextCheckingResult( |
+ blink::WebTextDecorationTypeSpelling, |
+ offset + misspelled_position, |
+ misspelled_length, |
+ suggestions.isEmpty() ? blink::WebString() : suggestions[0])); |
+ text = text.substr(misspelled_position + misspelled_length); |
+ offset += misspelled_position + misspelled_length; |
+ } |
+ MockGrammarCheck::CheckGrammarOfString(last_requested_text_check_string_, |
+ &results); |
+ } |
+ last_requested_text_checking_completion_->didFinishCheckingText(results); |
+ last_requested_text_checking_completion_ = 0; |
+ |
+ web_test_proxy_->PostSpellCheckEvent(blink::WebString("FinishLastTextCheck")); |
+} |
+ |
+blink::WebString SpellCheckClient::autoCorrectWord( |
+ const blink::WebString& word) { |
+ // Returns an empty string as Mac WebKit ('WebKitSupport/WebEditorClient.mm') |
+ // does. (If this function returns a non-empty string, WebKit replaces the |
+ // given misspelled string with the result one. This process executes some |
+ // editor commands and causes layout-test failures.) |
+ return blink::WebString(); |
+} |
+ |
+} // namespace content |