Index: chrome/browser/chromeos/input_method/input_method_syncer.cc |
diff --git a/chrome/browser/chromeos/input_method/input_method_syncer.cc b/chrome/browser/chromeos/input_method/input_method_syncer.cc |
deleted file mode 100644 |
index 77166ca23b4b9eb0650b801ee25fb3a00e969ef6..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/input_method/input_method_syncer.cc |
+++ /dev/null |
@@ -1,328 +0,0 @@ |
-// Copyright 2014 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 "chrome/browser/chromeos/input_method/input_method_syncer.h" |
- |
-#include <algorithm> |
-#include <set> |
-#include <vector> |
- |
-#include "base/bind.h" |
-#include "base/strings/string_split.h" |
-#include "base/strings/string_util.h" |
-#include "base/task_runner.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/prefs/pref_service_syncable.h" |
-#include "chrome/common/pref_names.h" |
-#include "components/pref_registry/pref_registry_syncable.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "ui/base/ime/chromeos/component_extension_ime_manager.h" |
-#include "ui/base/ime/chromeos/extension_ime_util.h" |
-#include "ui/base/l10n/l10n_util.h" |
- |
-namespace chromeos { |
-namespace input_method { |
-namespace { |
- |
-// Checks input method IDs, converting engine IDs to input method IDs and |
-// removing unsupported IDs from |values|. |
-void CheckAndResolveInputMethodIDs( |
- const input_method::InputMethodDescriptors& supported_descriptors, |
- std::vector<std::string>* values) { |
- // Extract the supported input method IDs into a set. |
- std::set<std::string> supported_input_method_ids; |
- for (const auto& descriptor : supported_descriptors) |
- supported_input_method_ids.insert(descriptor.id()); |
- |
- // Convert engine IDs to input method extension IDs. |
- std::transform(values->begin(), values->end(), values->begin(), |
- extension_ime_util::GetInputMethodIDByEngineID); |
- |
- // Remove values that aren't found in the set of supported input method IDs. |
- std::vector<std::string>::iterator it = values->begin(); |
- while (it != values->end()) { |
- if (it->size() && supported_input_method_ids.find(*it) != |
- supported_input_method_ids.end()) { |
- ++it; |
- } else { |
- it = values->erase(it); |
- } |
- } |
-} |
- |
-// Checks whether each language is supported, replacing locales with variants |
-// if they are available. Must be called on a thread that allows IO. |
-void CheckAndResolveLocales(std::string* languages) { |
- DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); |
- if (languages->empty()) |
- return; |
- std::vector<std::string> values; |
- base::SplitString(*languages, ',', &values); |
- |
- const std::string app_locale = g_browser_process->GetApplicationLocale(); |
- |
- std::vector<std::string> accept_language_codes; |
- l10n_util::GetAcceptLanguagesForLocale(app_locale, &accept_language_codes); |
- std::sort(accept_language_codes.begin(), accept_language_codes.end()); |
- |
- // Remove unsupported language values. |
- std::vector<std::string>::iterator value_iter = values.begin(); |
- while (value_iter != values.end()) { |
- if (binary_search(accept_language_codes.begin(), |
- accept_language_codes.end(), |
- *value_iter)) { |
- ++value_iter; |
- continue; |
- } |
- |
- // If a language code resolves to a supported backup locale, replace it |
- // with the resolved locale. |
- std::string resolved_locale; |
- if (l10n_util::CheckAndResolveLocale(*value_iter, &resolved_locale)) { |
- if (binary_search(accept_language_codes.begin(), |
- accept_language_codes.end(), |
- resolved_locale)) { |
- *value_iter = resolved_locale; |
- ++value_iter; |
- continue; |
- } |
- } |
- value_iter = values.erase(value_iter); |
- } |
- |
- *languages = JoinString(values, ','); |
-} |
- |
-// Appends tokens from |src| that are not in |dest| to |dest|. |
-void MergeLists(std::vector<std::string>* dest, |
- const std::vector<std::string>& src) { |
- // Keep track of already-added tokens. |
- std::set<std::string> unique_tokens(dest->begin(), dest->end()); |
- |
- for (const std::string& token : src) { |
- // Skip token if it's already in |dest|. |
- if (binary_search(unique_tokens.begin(), unique_tokens.end(), token)) |
- continue; |
- dest->push_back(token); |
- unique_tokens.insert(token); |
- } |
-} |
- |
-} // anonymous namespace |
- |
-InputMethodSyncer::InputMethodSyncer( |
- PrefServiceSyncable* prefs, |
- scoped_refptr<input_method::InputMethodManager::State> ime_state) |
- : prefs_(prefs), |
- ime_state_(ime_state), |
- merging_(false), |
- weak_factory_(this) { |
-} |
- |
-InputMethodSyncer::~InputMethodSyncer() { |
- prefs_->RemoveObserver(this); |
-} |
- |
-// static |
-void InputMethodSyncer::RegisterProfilePrefs( |
- user_prefs::PrefRegistrySyncable* registry) { |
- registry->RegisterStringPref( |
- prefs::kLanguagePreferredLanguagesSyncable, |
- "", |
- user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
- registry->RegisterStringPref( |
- prefs::kLanguagePreloadEnginesSyncable, |
- "", |
- user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
- registry->RegisterStringPref( |
- prefs::kLanguageEnabledExtensionImesSyncable, |
- "", |
- user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
- registry->RegisterBooleanPref( |
- prefs::kLanguageShouldMergeInputMethods, |
- false, |
- user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
-} |
- |
-void InputMethodSyncer::Initialize() { |
- // This causes OnIsSyncingChanged to be called when the value of |
- // PrefService::IsSyncing() changes. |
- prefs_->AddObserver(this); |
- |
- preferred_languages_syncable_.Init(prefs::kLanguagePreferredLanguagesSyncable, |
- prefs_); |
- preload_engines_syncable_.Init(prefs::kLanguagePreloadEnginesSyncable, |
- prefs_); |
- enabled_extension_imes_syncable_.Init( |
- prefs::kLanguageEnabledExtensionImesSyncable, prefs_); |
- |
- BooleanPrefMember::NamedChangeCallback callback = |
- base::Bind(&InputMethodSyncer::OnPreferenceChanged, |
- base::Unretained(this)); |
- preferred_languages_.Init(prefs::kLanguagePreferredLanguages, |
- prefs_, callback); |
- preload_engines_.Init(prefs::kLanguagePreloadEngines, |
- prefs_, callback); |
- enabled_extension_imes_.Init( |
- prefs::kLanguageEnabledExtensionImes, prefs_, callback); |
- |
- // If we have already synced but haven't merged input methods yet, do so now. |
- if (prefs_->GetBoolean(prefs::kLanguageShouldMergeInputMethods) && |
- !(preferred_languages_syncable_.GetValue().empty() && |
- preload_engines_syncable_.GetValue().empty() && |
- enabled_extension_imes_syncable_.GetValue().empty())) { |
- MergeSyncedPrefs(); |
- } |
-} |
- |
-void InputMethodSyncer::MergeSyncedPrefs() { |
- // This should only be done after the first ever sync. |
- DCHECK(prefs_->GetBoolean(prefs::kLanguageShouldMergeInputMethods)); |
- prefs_->SetBoolean(prefs::kLanguageShouldMergeInputMethods, false); |
- merging_ = true; |
- |
- std::string preferred_languages_syncable = |
- preferred_languages_syncable_.GetValue(); |
- std::string preload_engines_syncable = |
- preload_engines_syncable_.GetValue(); |
- std::string enabled_extension_imes_syncable = |
- enabled_extension_imes_syncable_.GetValue(); |
- |
- std::vector<std::string> synced_tokens; |
- std::vector<std::string> new_tokens; |
- |
- // First, set the syncable prefs to the union of the local and synced prefs. |
- base::SplitString( |
- preferred_languages_syncable_.GetValue(), ',', &synced_tokens); |
- base::SplitString(preferred_languages_.GetValue(), ',', &new_tokens); |
- |
- // Append the synced values to the current values. |
- MergeLists(&new_tokens, synced_tokens); |
- preferred_languages_syncable_.SetValue(JoinString(new_tokens, ',')); |
- |
- base::SplitString( |
- enabled_extension_imes_syncable_.GetValue(), ',', &synced_tokens); |
- base::SplitString(enabled_extension_imes_.GetValue(), ',', &new_tokens); |
- |
- MergeLists(&new_tokens, synced_tokens); |
- enabled_extension_imes_syncable_.SetValue(JoinString(new_tokens, ',')); |
- |
- // Revert preload engines to legacy component IDs. |
- base::SplitString(preload_engines_.GetValue(), ',', &new_tokens); |
- std::transform(new_tokens.begin(), new_tokens.end(), new_tokens.begin(), |
- extension_ime_util::GetComponentIDByInputMethodID); |
- base::SplitString( |
- preload_engines_syncable_.GetValue(), ',', &synced_tokens); |
- |
- MergeLists(&new_tokens, synced_tokens); |
- preload_engines_syncable_.SetValue(JoinString(new_tokens, ',')); |
- |
- // Second, set the local prefs, incorporating new values from the sync server. |
- preload_engines_.SetValue( |
- AddSupportedInputMethodValues(preload_engines_.GetValue(), |
- preload_engines_syncable, |
- prefs::kLanguagePreloadEngines)); |
- enabled_extension_imes_.SetValue( |
- AddSupportedInputMethodValues(enabled_extension_imes_.GetValue(), |
- enabled_extension_imes_syncable, |
- prefs::kLanguageEnabledExtensionImes)); |
- |
- // Remove unsupported locales before updating the local languages preference. |
- scoped_ptr<std::string> languages(new std::string( |
- AddSupportedInputMethodValues(preferred_languages_.GetValue(), |
- preferred_languages_syncable, |
- prefs::kLanguagePreferredLanguages))); |
- content::BrowserThread::GetBlockingPool()->PostTaskAndReply( |
- FROM_HERE, |
- base::Bind(&CheckAndResolveLocales, languages.get()), |
- base::Bind(&InputMethodSyncer::FinishMerge, |
- weak_factory_.GetWeakPtr(), |
- base::Passed(&languages))); |
-} |
- |
-std::string InputMethodSyncer::AddSupportedInputMethodValues( |
- const std::string& pref, |
- const std::string& synced_pref, |
- const char* pref_name) { |
- std::vector<std::string> old_tokens; |
- std::vector<std::string> new_tokens; |
- base::SplitString(pref, ',', &old_tokens); |
- base::SplitString(synced_pref, ',', &new_tokens); |
- |
- // Check and convert the new tokens. |
- if (pref_name == prefs::kLanguagePreloadEngines || |
- pref_name == prefs::kLanguageEnabledExtensionImes) { |
- input_method::InputMethodManager* manager = |
- input_method::InputMethodManager::Get(); |
- scoped_ptr<input_method::InputMethodDescriptors> supported_descriptors; |
- |
- if (pref_name == prefs::kLanguagePreloadEngines) { |
- // Set the known input methods. |
- supported_descriptors = manager->GetSupportedInputMethods(); |
- // Add the available component extension IMEs. |
- ComponentExtensionIMEManager* component_extension_manager = |
- manager->GetComponentExtensionIMEManager(); |
- input_method::InputMethodDescriptors component_descriptors = |
- component_extension_manager->GetAllIMEAsInputMethodDescriptor(); |
- supported_descriptors->insert(supported_descriptors->end(), |
- component_descriptors.begin(), |
- component_descriptors.end()); |
- } else { |
- supported_descriptors.reset(new input_method::InputMethodDescriptors); |
- ime_state_->GetInputMethodExtensions(supported_descriptors.get()); |
- } |
- CheckAndResolveInputMethodIDs(*supported_descriptors, &new_tokens); |
- } else if (pref_name != prefs::kLanguagePreferredLanguages) { |
- NOTREACHED() << "Attempting to merge an invalid preference."; |
- // kLanguagePreferredLanguages is checked in CheckAndResolveLocales(). |
- } |
- |
- // Do the actual merging. |
- MergeLists(&old_tokens, new_tokens); |
- return JoinString(old_tokens, ','); |
-} |
- |
-void InputMethodSyncer::FinishMerge( |
- scoped_ptr<std::string> languages) { |
- // Since the merge only removed locales that are unsupported on this system, |
- // we don't need to update the syncable prefs. If the local preference changes |
- // later, the sync server will lose the values we dropped. That's okay since |
- // the values from this device should then become the new defaults anyway. |
- preferred_languages_.SetValue(*languages); |
- |
- // We've finished merging. |
- merging_ = false; |
-} |
- |
-void InputMethodSyncer::OnPreferenceChanged(const std::string& pref_name) { |
- DCHECK(pref_name == prefs::kLanguagePreferredLanguages || |
- pref_name == prefs::kLanguagePreloadEngines || |
- pref_name == prefs::kLanguageEnabledExtensionImes); |
- |
- if (merging_ || prefs_->GetBoolean(prefs::kLanguageShouldMergeInputMethods)) |
- return; |
- |
- // Set the language and input prefs at the same time. Otherwise we may, |
- // e.g., use a stale languages setting but push a new preload engines setting. |
- preferred_languages_syncable_.SetValue(preferred_languages_.GetValue()); |
- enabled_extension_imes_syncable_.SetValue(enabled_extension_imes_.GetValue()); |
- |
- // For preload engines, use legacy xkb IDs so the preference can sync |
- // across Chrome OS and Chromium OS. |
- std::vector<std::string> engines; |
- base::SplitString(preload_engines_.GetValue(), ',', &engines); |
- std::transform(engines.begin(), engines.end(), engines.begin(), |
- extension_ime_util::GetComponentIDByInputMethodID); |
- preload_engines_syncable_.SetValue(JoinString(engines, ',')); |
-} |
- |
-void InputMethodSyncer::OnIsSyncingChanged() { |
- if (prefs_->GetBoolean(prefs::kLanguageShouldMergeInputMethods) && |
- prefs_->IsSyncing()) { |
- MergeSyncedPrefs(); |
- } |
-} |
- |
-} // namespace input_method |
-} // namespace chromeos |