Index: chrome/browser/tab_contents/spelling_menu_observer.cc |
=================================================================== |
--- chrome/browser/tab_contents/spelling_menu_observer.cc (revision 108037) |
+++ chrome/browser/tab_contents/spelling_menu_observer.cc (working copy) |
@@ -14,6 +14,8 @@ |
#include "chrome/app/chrome_command_ids.h" |
#include "chrome/browser/prefs/pref_service.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/spellchecker/spellcheck_host.h" |
+#include "chrome/browser/spellchecker/spellcheck_host_metrics.h" |
#include "chrome/browser/tab_contents/render_view_context_menu.h" |
#include "chrome/common/pref_names.h" |
#include "content/browser/renderer_host/render_view_host.h" |
@@ -55,45 +57,87 @@ |
if (!profile || !profile->GetRequestContext()) |
return; |
- // Retrieve the misspelled word to be sent to the Spelling service. |
- string16 text = params.misspelled_word; |
- if (text.empty()) |
- return; |
+ PrefService* pref = profile->GetPrefs(); |
+ if (pref->GetBoolean(prefs::kEnableSpellCheck) && |
+ pref->GetBoolean(prefs::kSpellCheckUseSpellingService)) { |
+ // Retrieve the misspelled word to be sent to the Spelling service. |
+ string16 text = params.misspelled_word; |
+ if (text.empty()) |
+ return; |
- // Initialize variables used in OnURLFetchComplete(). We copy the input text |
- // to the result text so we can replace its misspelled regions with |
- // suggestions. |
- loading_frame_ = 0; |
- succeeded_ = false; |
- result_ = text; |
+ // Initialize variables used in OnURLFetchComplete(). We copy the input text |
+ // to the result text so we can replace its misspelled regions with |
+ // suggestions. |
+ loading_frame_ = 0; |
+ succeeded_ = false; |
+ result_ = text; |
- // Add a placeholder item. This item will be updated when we receive a |
- // response from the Spelling service. (We do not have to disable this item |
- // now since Chrome will call IsCommandIdEnabled() and disable it.) |
- loading_message_ = |
- l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_SPELLING_CHECKING); |
- proxy_->AddMenuItem(IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION, |
- loading_message_); |
+ // Add a placeholder item. This item will be updated when we receive a |
+ // response from the Spelling service. (We do not have to disable this item |
+ // now since Chrome will call IsCommandIdEnabled() and disable it.) |
+ loading_message_ = |
+ l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_SPELLING_CHECKING); |
+ proxy_->AddMenuItem(IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION, |
+ loading_message_); |
- // Invoke a JSON-RPC call to the Spelling service in the background so we can |
- // update the placeholder item when we receive its response. It also starts |
- // the animation timer so we can show animation until we receive it. |
- const PrefService* pref = profile->GetPrefs(); |
- std::string language = |
- pref ? pref->GetString(prefs::kSpellCheckDictionary) : "en-US"; |
- Invoke(text, language, profile->GetRequestContext()); |
+ // Invoke a JSON-RPC call to the Spelling service in the background so we |
+ // can update the placeholder item when we receive its response. It also |
+ // starts the animation timer so we can show animation until we receive it. |
+ const PrefService* pref = profile->GetPrefs(); |
+ std::string language = |
+ pref ? pref->GetString(prefs::kSpellCheckDictionary) : "en-US"; |
+ Invoke(text, language, profile->GetRequestContext()); |
+ } |
+ |
+ // Append Dictionary spell check suggestions. |
+ suggestions_ = params.dictionary_suggestions; |
+ for (size_t i = 0; i < params.dictionary_suggestions.size() && |
+ IDC_SPELLCHECK_SUGGESTION_0 + i <= IDC_SPELLCHECK_SUGGESTION_LAST; |
+ ++i) { |
+ proxy_->AddMenuItem(IDC_SPELLCHECK_SUGGESTION_0 + static_cast<int>(i), |
+ params.dictionary_suggestions[i]); |
+ } |
} |
bool SpellingMenuObserver::IsCommandIdSupported(int command_id) { |
+ if (command_id >= IDC_SPELLCHECK_SUGGESTION_0 && |
+ command_id <= IDC_SPELLCHECK_SUGGESTION_4) |
+ return true; |
+ |
return command_id == IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION; |
} |
bool SpellingMenuObserver::IsCommandIdEnabled(int command_id) { |
- return command_id == IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION && succeeded_; |
+ DCHECK(IsCommandIdSupported(command_id)); |
+ |
+ if (command_id >= IDC_SPELLCHECK_SUGGESTION_0 && |
+ command_id <= IDC_SPELLCHECK_SUGGESTION_4) |
+ return true; |
+ |
+ if (command_id == IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION) |
+ return succeeded_; |
+ return false; |
} |
void SpellingMenuObserver::ExecuteCommand(int command_id) { |
- if (IsCommandIdEnabled(command_id)) |
+ DCHECK(IsCommandIdSupported(command_id)); |
+ |
+ if (command_id >= IDC_SPELLCHECK_SUGGESTION_0 && |
+ command_id <= IDC_SPELLCHECK_SUGGESTION_4) { |
+ proxy_->GetRenderViewHost()->Replace( |
+ suggestions_[command_id - IDC_SPELLCHECK_SUGGESTION_0]); |
+ // GetSpellCheckHost() can return null when the suggested word is |
+ // provided by Web SpellCheck API. |
+ Profile* profile = proxy_->GetProfile(); |
+ if (profile) { |
+ SpellCheckHost* spellcheck_host = profile->GetSpellCheckHost(); |
+ if (spellcheck_host && spellcheck_host->GetMetrics()) |
+ spellcheck_host->GetMetrics()->RecordReplacedWordStats(1); |
+ } |
+ return; |
+ } |
+ |
+ if (command_id == IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION) |
proxy_->GetRenderViewHost()->Replace(result_); |
} |
@@ -163,16 +207,11 @@ |
std::string data; |
source->GetResponseAsString(&data); |
succeeded_ = ParseResponse(source->GetResponseCode(), data); |
- if (!succeeded_) |
- result_ = l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_SPELLING_CORRECT); |
- // Update the menu item with the result text. We enable this item only when |
- // the request text has misspelled words. (We disable this item not only when |
- // we receive a server error but also when the input text consists only of |
- // well-spelled words. For either case, we do not need to replace the input |
- // text.) |
+ // Update the menu item with the result text. We disable this item and hide it |
+ // when the spelling service does not provide valid suggestions. |
proxy_->UpdateMenuItem(IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION, succeeded_, |
- false, result_); |
+ !succeeded_, result_); |
} |
bool SpellingMenuObserver::ParseResponse(int response, |
@@ -255,6 +294,14 @@ |
result_.replace(start, length, text); |
} |
+ // If the above result text is included in the suggestion list provided by the |
+ // local spellchecker, we return false to hide this item. |
+ for (std::vector<string16>::const_iterator it = suggestions_.begin(); |
+ it != suggestions_.end(); ++it) { |
+ if (result_ == *it) |
+ return false; |
+ } |
+ |
return true; |
} |