| Index: chrome/browser/renderer_context_menu/spellchecker_submenu_observer_hunspell.cc
|
| diff --git a/chrome/browser/renderer_context_menu/spellchecker_submenu_observer_hunspell.cc b/chrome/browser/renderer_context_menu/spellchecker_submenu_observer_hunspell.cc
|
| index dafc01e9ee26bd73217c02f3dc87a8bbfc0996ec..7816dc5d164bd94bbb49bbf0965d166c5390b69f 100644
|
| --- a/chrome/browser/renderer_context_menu/spellchecker_submenu_observer_hunspell.cc
|
| +++ b/chrome/browser/renderer_context_menu/spellchecker_submenu_observer_hunspell.cc
|
| @@ -4,16 +4,21 @@
|
|
|
| #include "chrome/browser/renderer_context_menu/spellchecker_submenu_observer.h"
|
|
|
| +#include <algorithm>
|
| +
|
| #include "base/command_line.h"
|
| #include "base/logging.h"
|
| #include "base/prefs/pref_member.h"
|
| #include "base/prefs/pref_service.h"
|
| +#include "base/strings/string_split.h"
|
| +#include "base/strings/string_util.h"
|
| #include "chrome/app/chrome_command_ids.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
|
| #include "chrome/browser/spellchecker/spellcheck_service.h"
|
| #include "chrome/common/chrome_switches.h"
|
| #include "chrome/common/pref_names.h"
|
| +#include "chrome/common/spellcheck_common.h"
|
| #include "chrome/common/spellcheck_messages.h"
|
| #include "chrome/grit/generated_resources.h"
|
| #include "content/public/browser/render_view_host.h"
|
| @@ -30,8 +35,7 @@ SpellCheckerSubMenuObserver::SpellCheckerSubMenuObserver(
|
| int group)
|
| : proxy_(proxy),
|
| submenu_model_(delegate),
|
| - language_group_(group),
|
| - language_selected_(0) {
|
| + language_group_(group) {
|
| DCHECK(proxy_);
|
| }
|
|
|
| @@ -45,17 +49,24 @@ void SpellCheckerSubMenuObserver::InitMenu(
|
| // Add available spell-checker languages to the sub menu.
|
| content::BrowserContext* browser_context = proxy_->GetBrowserContext();
|
| DCHECK(browser_context);
|
| - language_selected_ =
|
| + spellcheck_languages_ =
|
| SpellcheckService::GetSpellCheckLanguages(browser_context, &languages_);
|
| DCHECK(languages_.size() <
|
| IDC_SPELLCHECK_LANGUAGES_LAST - IDC_SPELLCHECK_LANGUAGES_FIRST);
|
| const std::string app_locale = g_browser_process->GetApplicationLocale();
|
| + const base::CommandLine* command_line =
|
| + base::CommandLine::ForCurrentProcess();
|
| +
|
| for (size_t i = 0; i < languages_.size(); ++i) {
|
| base::string16 display_name(
|
| l10n_util::GetDisplayNameForLocale(languages_[i], app_locale, true));
|
| - submenu_model_.AddRadioItem(IDC_SPELLCHECK_LANGUAGES_FIRST + i,
|
| - display_name,
|
| - language_group_);
|
| + if (command_line->HasSwitch(switches::kEnableMultilingualSpellChecker)) {
|
| + submenu_model_.AddCheckItem(
|
| + IDC_SPELLCHECK_LANGUAGES_FIRST + i, display_name);
|
| + } else {
|
| + submenu_model_.AddRadioItem(
|
| + IDC_SPELLCHECK_LANGUAGES_FIRST + i, display_name, language_group_);
|
| + }
|
| }
|
|
|
| // Add an item that opens the 'fonts and languages options' page.
|
| @@ -77,8 +88,6 @@ void SpellCheckerSubMenuObserver::InitMenu(
|
| l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_SPELLING_ASK_GOOGLE));
|
|
|
| // Add a check item "Automatically correct spelling".
|
| - const base::CommandLine* command_line =
|
| - base::CommandLine::ForCurrentProcess();
|
| if (command_line->HasSwitch(switches::kEnableSpellingAutoCorrect)) {
|
| submenu_model_.AddCheckItem(IDC_CONTENT_CONTEXT_AUTOCORRECT_SPELLING_TOGGLE,
|
| l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_SPELLING_AUTOCORRECT));
|
| @@ -117,7 +126,9 @@ bool SpellCheckerSubMenuObserver::IsCommandIdChecked(int command_id) {
|
|
|
| if (command_id >= IDC_SPELLCHECK_LANGUAGES_FIRST &&
|
| command_id < IDC_SPELLCHECK_LANGUAGES_LAST) {
|
| - return language_selected_ == command_id - IDC_SPELLCHECK_LANGUAGES_FIRST;
|
| + return spellcheck_languages_.find(command_id -
|
| + IDC_SPELLCHECK_LANGUAGES_FIRST) !=
|
| + spellcheck_languages_.end();
|
| }
|
|
|
| // Check box for 'Check Spelling while typing'.
|
| @@ -157,14 +168,41 @@ void SpellCheckerSubMenuObserver::ExecuteCommand(int command_id) {
|
| // Check to see if one of the spell check language ids have been clicked.
|
| Profile* profile = Profile::FromBrowserContext(proxy_->GetBrowserContext());
|
| DCHECK(profile);
|
| +
|
| + PrefService* prefs = profile->GetPrefs();
|
| if (command_id >= IDC_SPELLCHECK_LANGUAGES_FIRST &&
|
| command_id < IDC_SPELLCHECK_LANGUAGES_LAST) {
|
| - const size_t language = command_id - IDC_SPELLCHECK_LANGUAGES_FIRST;
|
| - if (profile && language < languages_.size()) {
|
| - StringPrefMember dictionary_language;
|
| - dictionary_language.Init(prefs::kSpellCheckDictionary,
|
| - profile->GetPrefs());
|
| - dictionary_language.SetValue(languages_[language]);
|
| + size_t language = command_id - IDC_SPELLCHECK_LANGUAGES_FIRST;
|
| + DCHECK_LT(language, languages_.size());
|
| +
|
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kEnableMultilingualSpellChecker)) {
|
| + std::vector<std::string> languages_split;
|
| + base::SplitString(
|
| + prefs->GetString(prefs::kSpellCheckDictionaries),
|
| + chrome::spellcheck_common::kDictionaryLanguagesSeparator,
|
| + &languages_split);
|
| +
|
| + auto partition_point = std::partition(
|
| + languages_split.begin(), languages_split.end(),
|
| + [](const std::string& language) { return language.length() > 0; });
|
| + languages_split.erase(partition_point, languages_split.end());
|
| +
|
| + auto found_language = std::find(languages_split.begin(),
|
| + languages_split.end(),
|
| + languages_[language]);
|
| +
|
| + if (found_language != languages_split.end())
|
| + languages_split.erase(found_language);
|
| + else
|
| + languages_split.push_back(languages_[language]);
|
| +
|
| + prefs->SetString(
|
| + prefs::kSpellCheckDictionaries,
|
| + JoinString(languages_split,
|
| + chrome::spellcheck_common::kDictionaryLanguagesSeparator));
|
| + } else {
|
| + prefs->SetString(prefs::kSpellCheckDictionary, languages_[language]);
|
| }
|
| return;
|
| }
|
|
|