Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: chrome/renderer/spellchecker/spellcheck_provider.cc

Issue 9169082: Asynchronous spellchecking on Win and Linux (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Build fix Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/renderer/spellchecker/spellcheck_provider.h" 5 #include "chrome/renderer/spellchecker/spellcheck_provider.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "chrome/common/chrome_switches.h" 8 #include "chrome/common/chrome_switches.h"
9 #include "chrome/common/spellcheck_messages.h" 9 #include "chrome/common/spellcheck_messages.h"
10 #include "chrome/common/spellcheck_result.h" 10 #include "chrome/common/spellcheck_result.h"
11 #include "chrome/renderer/chrome_content_renderer_client.h" 11 #include "chrome/renderer/chrome_content_renderer_client.h"
12 #include "chrome/renderer/spellchecker/spellcheck.h" 12 #include "chrome/renderer/spellchecker/spellcheck.h"
13 #include "content/public/renderer/render_view.h" 13 #include "content/public/renderer/render_view.h"
14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" 14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingComple tion.h" 15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingComple tion.h"
16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingResult .h" 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingResult .h"
17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingType.h " 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingType.h "
18 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebVector.h" 18 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebVector.h"
19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" 19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
20 20
21 using spellcheck::ToWebResultList;
21 using WebKit::WebFrame; 22 using WebKit::WebFrame;
22 using WebKit::WebString; 23 using WebKit::WebString;
23 using WebKit::WebTextCheckingCompletion; 24 using WebKit::WebTextCheckingCompletion;
24 using WebKit::WebTextCheckingResult; 25 using WebKit::WebTextCheckingResult;
25 using WebKit::WebTextCheckingType; 26 using WebKit::WebTextCheckingType;
26 using WebKit::WebVector; 27 using WebKit::WebVector;
27 28
28 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeSpelling) == 29 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeSpelling) ==
29 int(SpellCheckResult::SPELLING), mismatching_enums); 30 int(SpellCheckResult::SPELLING), mismatching_enums);
30 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeGrammar) == 31 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeGrammar) ==
31 int(SpellCheckResult::GRAMMAR), mismatching_enums); 32 int(SpellCheckResult::GRAMMAR), mismatching_enums);
32 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeLink) == 33 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeLink) ==
33 int(SpellCheckResult::LINK), mismatching_enums); 34 int(SpellCheckResult::LINK), mismatching_enums);
34 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeQuote) == 35 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeQuote) ==
35 int(SpellCheckResult::QUOTE), mismatching_enums); 36 int(SpellCheckResult::QUOTE), mismatching_enums);
36 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeDash) == 37 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeDash) ==
37 int(SpellCheckResult::DASH), mismatching_enums); 38 int(SpellCheckResult::DASH), mismatching_enums);
38 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeReplacement) == 39 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeReplacement) ==
39 int(SpellCheckResult::REPLACEMENT), mismatching_enums); 40 int(SpellCheckResult::REPLACEMENT), mismatching_enums);
40 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeCorrection) == 41 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeCorrection) ==
41 int(SpellCheckResult::CORRECTION), mismatching_enums); 42 int(SpellCheckResult::CORRECTION), mismatching_enums);
42 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeShowCorrectionPanel) == 43 COMPILE_ASSERT(int(WebKit::WebTextCheckingTypeShowCorrectionPanel) ==
43 int(SpellCheckResult::SHOWCORRECTIONPANEL), mismatching_enums); 44 int(SpellCheckResult::SHOWCORRECTIONPANEL), mismatching_enums);
44 45
45 namespace {
46
47 void ToWebResultList(
48 int offset,
49 const std::vector<SpellCheckResult>& results,
50 WebVector<WebTextCheckingResult>* web_results) {
51 WebVector<WebTextCheckingResult> list(results.size());
52 for (size_t i = 0; i < results.size(); ++i) {
53 list[i] = WebTextCheckingResult(
54 static_cast<WebTextCheckingType>(results[i].type),
55 results[i].location + offset,
56 results[i].length,
57 results[i].replacement);
58 }
59
60 list.swap(*web_results);
61 }
62
63 WebVector<WebTextCheckingResult> ToWebResultList(
64 int offset,
65 const std::vector<SpellCheckResult>& results) {
66 WebVector<WebTextCheckingResult> web_results;
67 ToWebResultList(offset, results, &web_results);
68 return web_results;
69 }
70
71 } // namespace
72
73 SpellCheckProvider::SpellCheckProvider( 46 SpellCheckProvider::SpellCheckProvider(
74 content::RenderView* render_view, 47 content::RenderView* render_view,
75 chrome::ChromeContentRendererClient* renderer_client) 48 chrome::ChromeContentRendererClient* renderer_client)
76 : content::RenderViewObserver(render_view), 49 : content::RenderViewObserver(render_view),
77 #if defined(OS_MACOSX) 50 #if defined(OS_MACOSX)
78 has_document_tag_(false), 51 has_document_tag_(false),
79 #endif 52 #endif
80 document_tag_(0), 53 document_tag_(0),
81 spelling_panel_visible_(false), 54 spelling_panel_visible_(false),
82 chrome_content_renderer_client_(renderer_client) { 55 chrome_content_renderer_client_(renderer_client) {
(...skipping 28 matching lines...) Expand all
111 #else 84 #else
112 // Send this text to a browser. A browser checks the user profile and send 85 // Send this text to a browser. A browser checks the user profile and send
113 // this text to the Spelling service only if a user enables this feature. 86 // this text to the Spelling service only if a user enables this feature.
114 // TODO(hbono) Implement a cache to avoid sending IPC messages. 87 // TODO(hbono) Implement a cache to avoid sending IPC messages.
115 string16 line; 88 string16 line;
116 int offset = -1; 89 int offset = -1;
117 if (!GetRequestLine(text, &line, &offset)) { 90 if (!GetRequestLine(text, &line, &offset)) {
118 completion->didFinishCheckingText(std::vector<WebTextCheckingResult>()); 91 completion->didFinishCheckingText(std::vector<WebTextCheckingResult>());
119 return; 92 return;
120 } 93 }
94
121 last_line_ = line; 95 last_line_ = line;
122 Send(new SpellCheckHostMsg_CallSpellingService( 96 Send(new SpellCheckHostMsg_CallSpellingService(
123 routing_id(), 97 routing_id(),
124 text_check_completions_.Add(completion), 98 text_check_completions_.Add(completion),
125 offset, 99 offset,
126 line)); 100 line));
127 #endif // !OS_MACOSX 101 #endif // !OS_MACOSX
128 } 102 }
129 103
130 bool SpellCheckProvider::OnMessageReceived(const IPC::Message& message) { 104 bool SpellCheckProvider::OnMessageReceived(const IPC::Message& message) {
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 177
204 EnsureDocumentTag(); 178 EnsureDocumentTag();
205 179
206 // Will be NULL during unit tets. 180 // Will be NULL during unit tets.
207 if (!chrome_content_renderer_client_) 181 if (!chrome_content_renderer_client_)
208 return; 182 return;
209 183
210 std::vector<SpellCheckResult> tmp_results; 184 std::vector<SpellCheckResult> tmp_results;
211 chrome_content_renderer_client_->spellcheck()->SpellCheckParagraph( 185 chrome_content_renderer_client_->spellcheck()->SpellCheckParagraph(
212 string16(text), 186 string16(text),
213 document_tag_,
214 &tmp_results); 187 &tmp_results);
215 ToWebResultList(0, tmp_results, results); 188 ToWebResultList(0, tmp_results, results);
216 #endif 189 #endif
217 } 190 }
218 191
219 void SpellCheckProvider::requestCheckingOfText( 192 void SpellCheckProvider::requestCheckingOfText(
220 const WebString& text, 193 const WebString& text,
221 WebTextCheckingCompletion* completion) { 194 WebTextCheckingCompletion* completion) {
222 RequestTextChecking(text, document_tag_, completion); 195 RequestTextChecking(text, document_tag_, completion);
223 } 196 }
(...skipping 26 matching lines...) Expand all
250 #if defined(OS_MACOSX) 223 #if defined(OS_MACOSX)
251 Send(new SpellCheckHostMsg_UpdateSpellingPanelWithMisspelledWord(routing_id(), 224 Send(new SpellCheckHostMsg_UpdateSpellingPanelWithMisspelledWord(routing_id(),
252 word)); 225 word));
253 #endif 226 #endif
254 } 227 }
255 228
256 #if !defined(OS_MACOSX) 229 #if !defined(OS_MACOSX)
257 void SpellCheckProvider::OnRespondSpellingService( 230 void SpellCheckProvider::OnRespondSpellingService(
258 int identifier, 231 int identifier,
259 int offset, 232 int offset,
233 bool succeeded,
234 const string16& text,
260 const std::vector<SpellCheckResult>& results) { 235 const std::vector<SpellCheckResult>& results) {
261 WebTextCheckingCompletion* completion = 236 WebTextCheckingCompletion* completion =
262 text_check_completions_.Lookup(identifier); 237 text_check_completions_.Lookup(identifier);
263 if (!completion) 238 if (!completion)
264 return; 239 return;
265 text_check_completions_.Remove(identifier); 240 text_check_completions_.Remove(identifier);
241
242 // If |succeeded| is false, we use local spellcheck as a fallback.
243 if (!succeeded) {
244 // |chrome_content_renderer_client| may be NULL in unit tests.
245 if (chrome_content_renderer_client_) {
246 chrome_content_renderer_client_->spellcheck()->RequestTextChecking(
247 text, offset, completion);
248 return;
249 }
250 }
251
266 completion->didFinishCheckingText(ToWebResultList(offset, results)); 252 completion->didFinishCheckingText(ToWebResultList(offset, results));
267 } 253 }
268 254
269 bool SpellCheckProvider::HasWordCharacters(const string16& text, 255 bool SpellCheckProvider::HasWordCharacters(const string16& text,
270 int index) const { 256 int index) const {
271 const char16* data = text.c_str(); 257 const char16* data = text.c_str();
272 int length = text.length(); 258 int length = text.length();
273 while (index < length) { 259 while (index < length) {
274 uint32 code = 0; 260 uint32 code = 0;
275 U16_NEXT(data, index, length, code); 261 U16_NEXT(data, index, length, code);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 // TODO(darin): There's actually no reason for this to be here. We should 349 // TODO(darin): There's actually no reason for this to be here. We should
364 // have the browser side manage the document tag. 350 // have the browser side manage the document tag.
365 #if defined(OS_MACOSX) 351 #if defined(OS_MACOSX)
366 if (!has_document_tag_) { 352 if (!has_document_tag_) {
367 // Make the call to get the tag. 353 // Make the call to get the tag.
368 Send(new SpellCheckHostMsg_GetDocumentTag(routing_id(), &document_tag_)); 354 Send(new SpellCheckHostMsg_GetDocumentTag(routing_id(), &document_tag_));
369 has_document_tag_ = true; 355 has_document_tag_ = true;
370 } 356 }
371 #endif 357 #endif
372 } 358 }
OLDNEW
« no previous file with comments | « chrome/renderer/spellchecker/spellcheck_provider.h ('k') | chrome/renderer/spellchecker/spellcheck_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698