OLD | NEW |
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 "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "chrome/common/chrome_switches.h" | 9 #include "chrome/common/chrome_switches.h" |
| 10 #include "chrome/common/spellcheck_marker.h" |
10 #include "chrome/common/spellcheck_messages.h" | 11 #include "chrome/common/spellcheck_messages.h" |
11 #include "chrome/common/spellcheck_result.h" | 12 #include "chrome/common/spellcheck_result.h" |
12 #include "chrome/renderer/spellchecker/spellcheck.h" | 13 #include "chrome/renderer/spellchecker/spellcheck.h" |
13 #include "content/public/renderer/render_view.h" | 14 #include "content/public/renderer/render_view.h" |
14 #include "third_party/WebKit/Source/Platform/chromium/public/WebVector.h" | 15 #include "third_party/WebKit/Source/Platform/chromium/public/WebVector.h" |
15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingComple
tion.h" | 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingComple
tion.h" |
17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingResult
.h" | 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingResult
.h" |
18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingType.h
" | 19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingType.h
" |
19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" | 20 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
(...skipping 22 matching lines...) Expand all Loading... |
42 render_view->GetWebView()->setSpellCheckClient(this); | 43 render_view->GetWebView()->setSpellCheckClient(this); |
43 EnableSpellcheck(spellcheck_->is_spellcheck_enabled()); | 44 EnableSpellcheck(spellcheck_->is_spellcheck_enabled()); |
44 } | 45 } |
45 } | 46 } |
46 | 47 |
47 SpellCheckProvider::~SpellCheckProvider() { | 48 SpellCheckProvider::~SpellCheckProvider() { |
48 } | 49 } |
49 | 50 |
50 void SpellCheckProvider::RequestTextChecking( | 51 void SpellCheckProvider::RequestTextChecking( |
51 const WebString& text, | 52 const WebString& text, |
52 WebTextCheckingCompletion* completion) { | 53 WebTextCheckingCompletion* completion, |
| 54 const std::vector<SpellCheckMarker>& markers) { |
53 // Ignore invalid requests. | 55 // Ignore invalid requests. |
54 if (text.isEmpty() || !HasWordCharacters(text, 0)) { | 56 if (text.isEmpty() || !HasWordCharacters(text, 0)) { |
55 completion->didCancelCheckingText(); | 57 completion->didCancelCheckingText(); |
56 return; | 58 return; |
57 } | 59 } |
58 | 60 |
59 // Try to satisfy check from cache. | 61 // Try to satisfy check from cache. |
60 if (SatisfyRequestFromCache(text, completion)) | 62 if (SatisfyRequestFromCache(text, completion)) |
61 return; | 63 return; |
62 | 64 |
63 // Send this text to a browser. A browser checks the user profile and send | 65 // Send this text to a browser. A browser checks the user profile and send |
64 // this text to the Spelling service only if a user enables this feature. | 66 // this text to the Spelling service only if a user enables this feature. |
65 last_request_.clear(); | 67 last_request_.clear(); |
66 last_results_.assign(WebKit::WebVector<WebKit::WebTextCheckingResult>()); | 68 last_results_.assign(WebKit::WebVector<WebKit::WebTextCheckingResult>()); |
67 | 69 |
68 #if defined(OS_MACOSX) | 70 #if defined(OS_MACOSX) |
69 // Text check (unified request for grammar and spell check) is only | 71 // Text check (unified request for grammar and spell check) is only |
70 // available for browser process, so we ask the system spellchecker | 72 // available for browser process, so we ask the system spellchecker |
71 // over IPC or return an empty result if the checker is not | 73 // over IPC or return an empty result if the checker is not |
72 // available. | 74 // available. |
73 Send(new SpellCheckHostMsg_RequestTextCheck( | 75 Send(new SpellCheckHostMsg_RequestTextCheck( |
74 routing_id(), | 76 routing_id(), |
75 text_check_completions_.Add(completion), | 77 text_check_completions_.Add(completion), |
76 text)); | 78 text)); |
77 #else | 79 #else |
78 Send(new SpellCheckHostMsg_CallSpellingService( | 80 Send(new SpellCheckHostMsg_CallSpellingService( |
79 routing_id(), | 81 routing_id(), |
80 text_check_completions_.Add(completion), | 82 text_check_completions_.Add(completion), |
81 string16(text))); | 83 string16(text), |
| 84 markers)); |
82 #endif // !OS_MACOSX | 85 #endif // !OS_MACOSX |
83 } | 86 } |
84 | 87 |
85 bool SpellCheckProvider::OnMessageReceived(const IPC::Message& message) { | 88 bool SpellCheckProvider::OnMessageReceived(const IPC::Message& message) { |
86 bool handled = true; | 89 bool handled = true; |
87 IPC_BEGIN_MESSAGE_MAP(SpellCheckProvider, message) | 90 IPC_BEGIN_MESSAGE_MAP(SpellCheckProvider, message) |
88 #if !defined(OS_MACOSX) | 91 #if !defined(OS_MACOSX) |
89 IPC_MESSAGE_HANDLER(SpellCheckMsg_RespondSpellingService, | 92 IPC_MESSAGE_HANDLER(SpellCheckMsg_RespondSpellingService, |
90 OnRespondSpellingService) | 93 OnRespondSpellingService) |
91 #endif | 94 #endif |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 NOTREACHED(); | 157 NOTREACHED(); |
155 spellcheck_->SpellCheckParagraph(string16(text), results); | 158 spellcheck_->SpellCheckParagraph(string16(text), results); |
156 UMA_HISTOGRAM_COUNTS("SpellCheck.api.paragraph", text.length()); | 159 UMA_HISTOGRAM_COUNTS("SpellCheck.api.paragraph", text.length()); |
157 } | 160 } |
158 | 161 |
159 void SpellCheckProvider::requestCheckingOfText( | 162 void SpellCheckProvider::requestCheckingOfText( |
160 const WebString& text, | 163 const WebString& text, |
161 const WebVector<uint32>& markers, | 164 const WebVector<uint32>& markers, |
162 const WebVector<unsigned>& marker_offsets, | 165 const WebVector<unsigned>& marker_offsets, |
163 WebTextCheckingCompletion* completion) { | 166 WebTextCheckingCompletion* completion) { |
164 RequestTextChecking(text, completion); | 167 std::vector<SpellCheckMarker> spellcheck_markers; |
| 168 for (size_t i = 0; i < markers.size(); ++i) { |
| 169 spellcheck_markers.push_back( |
| 170 SpellCheckMarker(markers[i], marker_offsets[i])); |
| 171 } |
| 172 RequestTextChecking(text, completion, spellcheck_markers); |
165 UMA_HISTOGRAM_COUNTS("SpellCheck.api.async", text.length()); | 173 UMA_HISTOGRAM_COUNTS("SpellCheck.api.async", text.length()); |
166 } | 174 } |
167 | 175 |
168 WebString SpellCheckProvider::autoCorrectWord(const WebString& word) { | 176 WebString SpellCheckProvider::autoCorrectWord(const WebString& word) { |
169 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | 177 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
170 if (command_line.HasSwitch(switches::kEnableSpellingAutoCorrect)) { | 178 if (command_line.HasSwitch(switches::kEnableSpellingAutoCorrect)) { |
171 UMA_HISTOGRAM_COUNTS("SpellCheck.api.autocorrect", word.length()); | 179 UMA_HISTOGRAM_COUNTS("SpellCheck.api.autocorrect", word.length()); |
172 return spellcheck_->GetAutoCorrectionWord(word, routing_id()); | 180 return spellcheck_->GetAutoCorrectionWord(word, routing_id()); |
173 } | 181 } |
174 return string16(); | 182 return string16(); |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 results[i].length = last_results_[i].length; | 348 results[i].length = last_results_[i].length; |
341 results[i].replacement = last_results_[i].replacement; | 349 results[i].replacement = last_results_[i].replacement; |
342 } | 350 } |
343 completion->didFinishCheckingText(results); | 351 completion->didFinishCheckingText(results); |
344 return true; | 352 return true; |
345 } | 353 } |
346 } | 354 } |
347 | 355 |
348 return false; | 356 return false; |
349 } | 357 } |
OLD | NEW |