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

Side by Side Diff: chrome/browser/chromeos/preferences.cc

Issue 312023002: Sync starting language and input method preferences (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 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/browser/chromeos/preferences.h" 5 #include "chrome/browser/chromeos/preferences.h"
6 6
7 #include <vector> 7 #include <algorithm>
8 8
9 #include "ash/autoclick/autoclick_controller.h" 9 #include "ash/autoclick/autoclick_controller.h"
10 #include "ash/magnifier/magnifier_constants.h" 10 #include "ash/magnifier/magnifier_constants.h"
11 #include "ash/shell.h" 11 #include "ash/shell.h"
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/i18n/time_formatting.h" 13 #include "base/i18n/time_formatting.h"
14 #include "base/metrics/histogram.h" 14 #include "base/metrics/histogram.h"
15 #include "base/prefs/pref_member.h" 15 #include "base/prefs/pref_member.h"
16 #include "base/prefs/pref_registry_simple.h" 16 #include "base/prefs/pref_registry_simple.h"
17 #include "base/prefs/scoped_user_pref_update.h" 17 #include "base/prefs/scoped_user_pref_update.h"
18 #include "base/strings/string_split.h" 18 #include "base/strings/string_split.h"
19 #include "base/strings/string_util.h" 19 #include "base/strings/string_util.h"
20 #include "base/strings/utf_string_conversions.h" 20 #include "base/strings/utf_string_conversions.h"
21 #include "base/sys_info.h" 21 #include "base/sys_info.h"
22 #include "chrome/browser/browser_process.h" 22 #include "chrome/browser/browser_process.h"
23 #include "chrome/browser/chrome_notification_types.h" 23 #include "chrome/browser/chrome_notification_types.h"
24 #include "chrome/browser/chromeos/accessibility/magnification_manager.h" 24 #include "chrome/browser/chromeos/accessibility/magnification_manager.h"
25 #include "chrome/browser/chromeos/drive/file_system_util.h" 25 #include "chrome/browser/chromeos/drive/file_system_util.h"
26 #include "chrome/browser/chromeos/input_method/input_method_util.h" 26 #include "chrome/browser/chromeos/input_method/input_method_util.h"
27 #include "chrome/browser/chromeos/login/session/session_manager.h" 27 #include "chrome/browser/chromeos/login/session/session_manager.h"
28 #include "chrome/browser/chromeos/login/users/user.h" 28 #include "chrome/browser/chromeos/login/users/user.h"
29 #include "chrome/browser/chromeos/system/input_device_settings.h" 29 #include "chrome/browser/chromeos/system/input_device_settings.h"
30 #include "chrome/browser/download/download_prefs.h" 30 #include "chrome/browser/download/download_prefs.h"
31 #include "chrome/browser/prefs/pref_service_syncable.h" 31 #include "chrome/browser/prefs/pref_service_syncable.h"
32 #include "chrome/common/chrome_switches.h" 32 #include "chrome/common/chrome_switches.h"
33 #include "chrome/common/pref_names.h" 33 #include "chrome/common/pref_names.h"
34 #include "chromeos/chromeos_switches.h" 34 #include "chromeos/chromeos_switches.h"
35 #include "chromeos/ime/component_extension_ime_manager.h"
35 #include "chromeos/ime/extension_ime_util.h" 36 #include "chromeos/ime/extension_ime_util.h"
36 #include "chromeos/ime/ime_keyboard.h" 37 #include "chromeos/ime/ime_keyboard.h"
37 #include "chromeos/ime/input_method_manager.h" 38 #include "chromeos/ime/input_method_manager.h"
38 #include "chromeos/system/statistics_provider.h" 39 #include "chromeos/system/statistics_provider.h"
39 #include "components/feedback/tracing_manager.h" 40 #include "components/feedback/tracing_manager.h"
40 #include "components/pref_registry/pref_registry_syncable.h" 41 #include "components/pref_registry/pref_registry_syncable.h"
42 #include "content/public/browser/browser_thread.h"
41 #include "third_party/icu/source/i18n/unicode/timezone.h" 43 #include "third_party/icu/source/i18n/unicode/timezone.h"
44 #include "ui/base/l10n/l10n_util.h"
42 #include "ui/events/event_constants.h" 45 #include "ui/events/event_constants.h"
43 #include "ui/events/event_utils.h" 46 #include "ui/events/event_utils.h"
44 #include "url/gurl.h" 47 #include "url/gurl.h"
45 48
46 namespace chromeos { 49 namespace chromeos {
50 namespace {
47 51
48 static const char kFallbackInputMethodLocale[] = "en-US"; 52 static const char kFallbackInputMethodLocale[] = "en-US";
49 53
54 // Checks input method IDs, converting engine IDs to input method IDs and
55 // removing unsupported IDs from |values|.
56 void CheckAndResolveInputMethodIDs(
57 std::vector<std::string>* values,
58 const input_method::InputMethodDescriptors& supported_descriptors) {
59 // Extract the supported input method IDs into a set.
60 std::set<std::string> supported_input_method_ids;
61 for (size_t i = 0; i < supported_descriptors.size(); i++)
62 supported_input_method_ids.insert(supported_descriptors[i].id());
63
64 // Convert engine IDs to input method extension IDs.
65 std::transform(values->begin(), values->end(), values->begin(),
66 extension_ime_util::GetInputMethodIDByEngineID);
67
68 // Remove values that aren't found in the set of supported input method IDs.
69 std::vector<std::string>::iterator it = values->begin();
70 while (it != values->end()) {
71 if (it->size() && std::find(supported_input_method_ids.begin(),
72 supported_input_method_ids.end(),
73 *it) != supported_input_method_ids.end()) {
74 ++it;
75 } else {
76 it = values->erase(it);
77 }
78 }
79 }
80
81 // Checks whether each language is supported, replacing locales with variants
82 // if they are available. Must be called on a thread that allows IO.
83 void CheckAndResolveLocales(std::string* languages) {
84 if (languages->empty())
85 return;
86 std::vector<std::string> values;
87 base::SplitString(*languages, ',', &values);
88
89 // Remove unsupported language values and set the resolved locales.
90 std::vector<std::string>::iterator value_iter = values.begin();
91 while (value_iter != values.end()) {
92 std::string resolved_locale;
93 if (l10n_util::CheckAndResolveLocale(*value_iter, &resolved_locale)) {
94 *value_iter = resolved_locale;
95 ++value_iter;
96 } else {
97 value_iter = values.erase(value_iter);
98 }
99 }
100
101 *languages = JoinString(values, ',');
102 }
103
104 // Appends tokens from |src| that are not in |dest| to |dest|. Quadratic
105 // runtime; use only for small lists.
106 void MergeLists(std::vector<std::string>* dest,
107 const std::vector<std::string>& src) {
108 for (size_t i = 0; i < src.size(); i++) {
109 // Skip token if it's already in |dest|.
110 if (std::find(dest->begin(), dest->end(), src[i]) == dest->end())
111 dest->push_back(src[i]);
112 }
113 }
114
115 // For the given input method pref, adds unique values from |synced_pref| to
116 // values in |pref|. The new values are converted from legacy engine IDs to
117 // input method IDs if necessary.
118 std::string AddSupportedInputMethodValues(const std::string& pref,
119 const std::string& synced_pref,
120 const char* pref_name) {
121 std::vector<std::string> old_tokens;
122 std::vector<std::string> new_tokens;
123 base::SplitString(pref, ',', &old_tokens);
124 base::SplitString(synced_pref, ',', &new_tokens);
125
126 // Check and convert the new tokens.
127 if (pref_name == prefs::kLanguagePreloadEngines ||
128 pref_name == prefs::kLanguageEnabledExtensionImes) {
129 input_method::InputMethodManager* manager =
130 input_method::InputMethodManager::Get();
131 scoped_ptr<input_method::InputMethodDescriptors> supported_descriptors;
132
133 if (pref_name == prefs::kLanguagePreloadEngines) {
134 // Set the known input methods.
135 supported_descriptors = manager->GetSupportedInputMethods();
136 // Add the available component extension IMEs.
137 ComponentExtensionIMEManager* component_extension_manager =
138 manager->GetComponentExtensionIMEManager();
139 if (component_extension_manager->IsInitialized()) {
Alexander Alekseev 2014/06/30 21:22:23 This seems to be dangerous (what if Component Exte
michaelpg 2014/07/10 00:46:01 I wouldn't say "dangerous", the scenario is that d
Alexander Alekseev 2014/07/10 17:47:49 Ok, it's not "dangerous", but it just disables syn
140 input_method::InputMethodDescriptors component_descriptors =
141 component_extension_manager->GetAllIMEAsInputMethodDescriptor();
142 supported_descriptors->insert(supported_descriptors->end(),
143 component_descriptors.begin(),
144 component_descriptors.end());
145 }
146 } else {
147 supported_descriptors.reset(new input_method::InputMethodDescriptors);
148 manager->GetInputMethodExtensions(supported_descriptors.get());
149 }
150 CheckAndResolveInputMethodIDs(&new_tokens, *supported_descriptors);
151 } else if (pref_name != prefs::kLanguagePreferredLanguages) {
152 NOTREACHED() << "Attempting to merge an invalid preference.";
153 }
154
155 // Do the actual merging.
156 MergeLists(&old_tokens, new_tokens);
157 return JoinString(old_tokens, ',');
158 }
159
160 } // anonymous namespace
161
50 Preferences::Preferences() 162 Preferences::Preferences()
51 : prefs_(NULL), 163 : prefs_(NULL),
52 input_method_manager_(input_method::InputMethodManager::Get()), 164 input_method_manager_(input_method::InputMethodManager::Get()),
53 user_(NULL), 165 user_(NULL),
54 user_is_primary_(false) { 166 user_is_primary_(false),
167 weak_factory_(this) {
55 // Do not observe shell, if there is no shell instance; e.g., in some unit 168 // Do not observe shell, if there is no shell instance; e.g., in some unit
56 // tests. 169 // tests.
57 if (ash::Shell::HasInstance()) 170 if (ash::Shell::HasInstance())
58 ash::Shell::GetInstance()->AddShellObserver(this); 171 ash::Shell::GetInstance()->AddShellObserver(this);
59 } 172 }
60 173
61 Preferences::Preferences(input_method::InputMethodManager* input_method_manager) 174 Preferences::Preferences(input_method::InputMethodManager* input_method_manager)
62 : prefs_(NULL), 175 : prefs_(NULL),
63 input_method_manager_(input_method_manager), 176 input_method_manager_(input_method_manager),
64 user_(NULL), 177 user_(NULL),
65 user_is_primary_(false) { 178 user_is_primary_(false),
179 weak_factory_(this) {
66 // Do not observe shell, if there is no shell instance; e.g., in some unit 180 // Do not observe shell, if there is no shell instance; e.g., in some unit
67 // tests. 181 // tests.
68 if (ash::Shell::HasInstance()) 182 if (ash::Shell::HasInstance())
69 ash::Shell::GetInstance()->AddShellObserver(this); 183 ash::Shell::GetInstance()->AddShellObserver(this);
70 } 184 }
71 185
72 Preferences::~Preferences() { 186 Preferences::~Preferences() {
73 prefs_->RemoveObserver(this); 187 prefs_->RemoveObserver(this);
74 UserManager::Get()->RemoveSessionStateObserver(this); 188 UserManager::Get()->RemoveSessionStateObserver(this);
75 // If shell instance is destoryed before this preferences instance, there is 189 // If shell instance is destoryed before this preferences instance, there is
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 // We don't sync prefs::kLanguageCurrentInputMethod and PreviousInputMethod 321 // We don't sync prefs::kLanguageCurrentInputMethod and PreviousInputMethod
208 // because they're just used to track the logout state of the device. 322 // because they're just used to track the logout state of the device.
209 registry->RegisterStringPref( 323 registry->RegisterStringPref(
210 prefs::kLanguageCurrentInputMethod, 324 prefs::kLanguageCurrentInputMethod,
211 "", 325 "",
212 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 326 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
213 registry->RegisterStringPref( 327 registry->RegisterStringPref(
214 prefs::kLanguagePreviousInputMethod, 328 prefs::kLanguagePreviousInputMethod,
215 "", 329 "",
216 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 330 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
217 // We don't sync the list of input methods and preferred languages since a
218 // user might use two or more devices with different hardware keyboards.
219 // crosbug.com/15181
220 registry->RegisterStringPref( 331 registry->RegisterStringPref(
221 prefs::kLanguagePreferredLanguages, 332 prefs::kLanguagePreferredLanguages,
222 kFallbackInputMethodLocale, 333 kFallbackInputMethodLocale,
223 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 334 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
224 registry->RegisterStringPref( 335 registry->RegisterStringPref(
336 prefs::kLanguagePreferredLanguagesSyncable,
337 "",
338 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
339 registry->RegisterStringPref(
225 prefs::kLanguagePreloadEngines, 340 prefs::kLanguagePreloadEngines,
226 hardware_keyboard_id, 341 hardware_keyboard_id,
227 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 342 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
228 registry->RegisterStringPref( 343 registry->RegisterStringPref(
344 prefs::kLanguagePreloadEnginesSyncable,
345 "",
346 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
347 registry->RegisterStringPref(
229 prefs::kLanguageEnabledExtensionImes, 348 prefs::kLanguageEnabledExtensionImes,
230 "", 349 "",
231 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 350 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
351 registry->RegisterStringPref(
352 prefs::kLanguageEnabledExtensionImesSyncable,
353 "",
354 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
355 registry->RegisterBooleanPref(
356 prefs::kLanguageShouldMergeInputMethods,
357 false,
358 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
232 359
233 registry->RegisterIntegerPref( 360 registry->RegisterIntegerPref(
234 prefs::kLanguageRemapSearchKeyTo, 361 prefs::kLanguageRemapSearchKeyTo,
235 input_method::kSearchKey, 362 input_method::kSearchKey,
236 user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF); 363 user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
237 registry->RegisterIntegerPref( 364 registry->RegisterIntegerPref(
238 prefs::kLanguageRemapControlKeyTo, 365 prefs::kLanguageRemapControlKeyTo,
239 input_method::kControlKey, 366 input_method::kControlKey,
240 user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF); 367 user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
241 registry->RegisterIntegerPref( 368 registry->RegisterIntegerPref(
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 prefs, callback); 455 prefs, callback);
329 natural_scroll_.Init(prefs::kNaturalScroll, prefs, callback); 456 natural_scroll_.Init(prefs::kNaturalScroll, prefs, callback);
330 mouse_sensitivity_.Init(prefs::kMouseSensitivity, prefs, callback); 457 mouse_sensitivity_.Init(prefs::kMouseSensitivity, prefs, callback);
331 touchpad_sensitivity_.Init(prefs::kTouchpadSensitivity, prefs, callback); 458 touchpad_sensitivity_.Init(prefs::kTouchpadSensitivity, prefs, callback);
332 primary_mouse_button_right_.Init(prefs::kPrimaryMouseButtonRight, 459 primary_mouse_button_right_.Init(prefs::kPrimaryMouseButtonRight,
333 prefs, callback); 460 prefs, callback);
334 download_default_directory_.Init(prefs::kDownloadDefaultDirectory, 461 download_default_directory_.Init(prefs::kDownloadDefaultDirectory,
335 prefs, callback); 462 prefs, callback);
336 touch_hud_projection_enabled_.Init(prefs::kTouchHudProjectionEnabled, 463 touch_hud_projection_enabled_.Init(prefs::kTouchHudProjectionEnabled,
337 prefs, callback); 464 prefs, callback);
465 preferred_languages_.Init(prefs::kLanguagePreferredLanguages,
466 prefs, callback);
338 preload_engines_.Init(prefs::kLanguagePreloadEngines, prefs, callback); 467 preload_engines_.Init(prefs::kLanguagePreloadEngines, prefs, callback);
339 enabled_extension_imes_.Init(prefs::kLanguageEnabledExtensionImes, 468 enabled_extension_imes_.Init(prefs::kLanguageEnabledExtensionImes,
340 prefs, callback); 469 prefs, callback);
470 preferred_languages_syncable_.Init(prefs::kLanguagePreferredLanguagesSyncable,
471 prefs, callback);
472 preload_engines_syncable_.Init(prefs::kLanguagePreloadEnginesSyncable,
473 prefs, callback);
474 enabled_extension_imes_syncable_.Init(
475 prefs::kLanguageEnabledExtensionImesSyncable, prefs, callback);
341 current_input_method_.Init(prefs::kLanguageCurrentInputMethod, 476 current_input_method_.Init(prefs::kLanguageCurrentInputMethod,
342 prefs, callback); 477 prefs, callback);
343 previous_input_method_.Init(prefs::kLanguagePreviousInputMethod, 478 previous_input_method_.Init(prefs::kLanguagePreviousInputMethod,
344 prefs, callback); 479 prefs, callback);
345 480
346 xkb_auto_repeat_enabled_.Init( 481 xkb_auto_repeat_enabled_.Init(
347 prefs::kLanguageXkbAutoRepeatEnabled, prefs, callback); 482 prefs::kLanguageXkbAutoRepeatEnabled, prefs, callback);
348 xkb_auto_repeat_delay_pref_.Init( 483 xkb_auto_repeat_delay_pref_.Init(
349 prefs::kLanguageXkbAutoRepeatDelay, prefs, callback); 484 prefs::kLanguageXkbAutoRepeatDelay, prefs, callback);
350 xkb_auto_repeat_interval_pref_.Init( 485 xkb_auto_repeat_interval_pref_.Init(
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 default_download_to_drive); 645 default_download_to_drive);
511 else if (reason == REASON_INITIALIZATION) 646 else if (reason == REASON_INITIALIZATION)
512 UMA_HISTOGRAM_BOOLEAN( 647 UMA_HISTOGRAM_BOOLEAN(
513 "FileBrowser.DownloadDestination.IsGoogleDrive.Started", 648 "FileBrowser.DownloadDestination.IsGoogleDrive.Started",
514 default_download_to_drive); 649 default_download_to_drive);
515 } 650 }
516 if (reason != REASON_PREF_CHANGED || 651 if (reason != REASON_PREF_CHANGED ||
517 pref_name == prefs::kTouchHudProjectionEnabled) { 652 pref_name == prefs::kTouchHudProjectionEnabled) {
518 if (user_is_active) { 653 if (user_is_active) {
519 const bool enabled = touch_hud_projection_enabled_.GetValue(); 654 const bool enabled = touch_hud_projection_enabled_.GetValue();
520 ash::Shell::GetInstance()->SetTouchHudProjectionEnabled(enabled); 655 // There may not be a shell, e.g., in some unit tests.
656 if (ash::Shell::HasInstance())
657 ash::Shell::GetInstance()->SetTouchHudProjectionEnabled(enabled);
521 } 658 }
522 } 659 }
523 660
524 if (reason != REASON_PREF_CHANGED || 661 if (reason != REASON_PREF_CHANGED ||
525 pref_name == prefs::kLanguageXkbAutoRepeatEnabled) { 662 pref_name == prefs::kLanguageXkbAutoRepeatEnabled) {
526 if (user_is_active) { 663 if (user_is_active) {
527 const bool enabled = xkb_auto_repeat_enabled_.GetValue(); 664 const bool enabled = xkb_auto_repeat_enabled_.GetValue();
528 input_method::InputMethodManager::Get() 665 input_method::InputMethodManager::Get()
529 ->GetImeKeyboard() 666 ->GetImeKeyboard()
530 ->SetAutoRepeatEnabled(enabled); 667 ->SetAutoRepeatEnabled(enabled);
531 } 668 }
532 } 669 }
533 if (reason != REASON_PREF_CHANGED || 670 if (reason != REASON_PREF_CHANGED ||
534 pref_name == prefs::kLanguageXkbAutoRepeatDelay || 671 pref_name == prefs::kLanguageXkbAutoRepeatDelay ||
535 pref_name == prefs::kLanguageXkbAutoRepeatInterval) { 672 pref_name == prefs::kLanguageXkbAutoRepeatInterval) {
536 if (user_is_active) 673 if (user_is_active)
537 UpdateAutoRepeatRate(); 674 UpdateAutoRepeatRate();
538 } 675 }
539 676
677 if (reason == REASON_PREF_CHANGED &&
678 pref_name == prefs::kLanguagePreferredLanguages)
679 SetSyncableInputMethodPrefs();
680
540 if (reason != REASON_PREF_CHANGED && user_is_active) { 681 if (reason != REASON_PREF_CHANGED && user_is_active) {
541 SetInputMethodList(); 682 SetInputMethodList();
542 } else if (pref_name == prefs::kLanguagePreloadEngines && user_is_active) { 683 } else if (pref_name == prefs::kLanguagePreloadEngines) {
543 SetLanguageConfigStringListAsCSV(language_prefs::kGeneralSectionName, 684 if (user_is_active) {
544 language_prefs::kPreloadEnginesConfigName, 685 SetLanguageConfigStringListAsCSV(
545 preload_engines_.GetValue()); 686 language_prefs::kGeneralSectionName,
687 language_prefs::kPreloadEnginesConfigName,
688 preload_engines_.GetValue());
689 }
690 SetSyncableInputMethodPrefs();
546 } 691 }
547 692
548 if (reason != REASON_PREF_CHANGED || 693 if (reason != REASON_PREF_CHANGED ||
549 pref_name == prefs::kLanguageEnabledExtensionImes) { 694 pref_name == prefs::kLanguageEnabledExtensionImes) {
550 if (user_is_active) { 695 if (user_is_active)
551 std::string value(enabled_extension_imes_.GetValue()); 696 SetEnabledExtensionImes();
552 697 if (reason == REASON_PREF_CHANGED)
553 std::vector<std::string> split_values; 698 SetSyncableInputMethodPrefs();
554 if (!value.empty())
555 base::SplitString(value, ',', &split_values);
556
557 input_method_manager_->SetEnabledExtensionImes(&split_values);
558 }
559 } 699 }
560 700
561 if (user_is_active) { 701 if (user_is_active) {
562 system::InputDeviceSettings::Get()->UpdateTouchpadSettings( 702 system::InputDeviceSettings::Get()->UpdateTouchpadSettings(
563 touchpad_settings); 703 touchpad_settings);
564 system::InputDeviceSettings::Get()->UpdateMouseSettings(mouse_settings); 704 system::InputDeviceSettings::Get()->UpdateMouseSettings(mouse_settings);
565 } 705 }
566 } 706 }
567 707
568 void Preferences::OnIsSyncingChanged() { 708 void Preferences::OnIsSyncingChanged() {
569 DVLOG(1) << "OnIsSyncingChanged"; 709 DVLOG(1) << "OnIsSyncingChanged";
570 ForceNaturalScrollDefault(); 710 ForceNaturalScrollDefault();
711 if (prefs_->GetBoolean(prefs::kLanguageShouldMergeInputMethods) &&
712 prefs_->IsSyncing()) {
713 MergeSyncedInputMethods();
714 }
571 } 715 }
572 716
573 void Preferences::ForceNaturalScrollDefault() { 717 void Preferences::ForceNaturalScrollDefault() {
574 DVLOG(1) << "ForceNaturalScrollDefault"; 718 DVLOG(1) << "ForceNaturalScrollDefault";
575 if (CommandLine::ForCurrentProcess()->HasSwitch( 719 if (CommandLine::ForCurrentProcess()->HasSwitch(
576 switches::kNaturalScrollDefault) && 720 switches::kNaturalScrollDefault) &&
577 prefs_->IsSyncing() && 721 prefs_->IsSyncing() &&
578 !prefs_->GetUserPrefValue(prefs::kNaturalScroll)) { 722 !prefs_->GetUserPrefValue(prefs::kNaturalScroll)) {
579 DVLOG(1) << "Natural scroll forced to true"; 723 DVLOG(1) << "Natural scroll forced to true";
580 natural_scroll_.SetValue(true); 724 natural_scroll_.SetValue(true);
(...skipping 14 matching lines...) Expand all
595 if (input_method_manager_->MigrateInputMethods(&split_values)) 739 if (input_method_manager_->MigrateInputMethods(&split_values))
596 preload_engines_.SetValue(JoinString(split_values, ',')); 740 preload_engines_.SetValue(JoinString(split_values, ','));
597 741
598 if (section == std::string(language_prefs::kGeneralSectionName) && 742 if (section == std::string(language_prefs::kGeneralSectionName) &&
599 name == std::string(language_prefs::kPreloadEnginesConfigName)) { 743 name == std::string(language_prefs::kPreloadEnginesConfigName)) {
600 input_method_manager_->ReplaceEnabledInputMethods(split_values); 744 input_method_manager_->ReplaceEnabledInputMethods(split_values);
601 return; 745 return;
602 } 746 }
603 } 747 }
604 748
749 void Preferences::SetPreferredLanguages(scoped_ptr<std::string> languages) {
750 // Since this only removes locales that are unsupported on this system, we
751 // don't need to update the syncable prefs. If the local preference changes
752 // later, the sync server will lose the values we dropped, but that's okay
753 // since the values from this device would become the new defaults anyway.
754 if (*languages != preferred_languages_.GetValue())
755 preferred_languages_.SetValue(*languages);
756 }
757
605 void Preferences::SetInputMethodList() { 758 void Preferences::SetInputMethodList() {
606 // When |preload_engines_| are set, InputMethodManager::ChangeInputMethod() 759 // When |preload_engines_| are set, InputMethodManager::ChangeInputMethod()
607 // might be called to change the current input method to the first one in the 760 // might be called to change the current input method to the first one in the
608 // |preload_engines_| list. This also updates previous/current input method 761 // |preload_engines_| list. This also updates previous/current input method
609 // prefs. That's why GetValue() calls are placed before the 762 // prefs. That's why GetValue() calls are placed before the
610 // SetLanguageConfigStringListAsCSV() call below. 763 // SetLanguageConfigStringListAsCSV() call below.
611 const std::string previous_input_method_id = 764 const std::string previous_input_method_id =
612 previous_input_method_.GetValue(); 765 previous_input_method_.GetValue();
613 const std::string current_input_method_id = current_input_method_.GetValue(); 766 const std::string current_input_method_id = current_input_method_.GetValue();
614 SetLanguageConfigStringListAsCSV(language_prefs::kGeneralSectionName, 767 SetLanguageConfigStringListAsCSV(language_prefs::kGeneralSectionName,
615 language_prefs::kPreloadEnginesConfigName, 768 language_prefs::kPreloadEnginesConfigName,
616 preload_engines_.GetValue()); 769 preload_engines_.GetValue());
617 770
618 // ChangeInputMethod() has to be called AFTER the value of |preload_engines_| 771 // ChangeInputMethod() has to be called AFTER the value of |preload_engines_|
619 // is sent to the InputMethodManager. Otherwise, the ChangeInputMethod request 772 // is sent to the InputMethodManager. Otherwise, the ChangeInputMethod request
620 // might be ignored as an invalid input method ID. The ChangeInputMethod() 773 // might be ignored as an invalid input method ID. The ChangeInputMethod()
621 // calls are also necessary to restore the previous/current input method prefs 774 // calls are also necessary to restore the previous/current input method prefs
622 // which could have been modified by the SetLanguageConfigStringListAsCSV call 775 // which could have been modified by the SetLanguageConfigStringListAsCSV call
623 // above to the original state. 776 // above to the original state.
624 if (!previous_input_method_id.empty()) 777 if (!previous_input_method_id.empty())
625 input_method_manager_->ChangeInputMethod(previous_input_method_id); 778 input_method_manager_->ChangeInputMethod(previous_input_method_id);
626 if (!current_input_method_id.empty()) 779 if (!current_input_method_id.empty())
627 input_method_manager_->ChangeInputMethod(current_input_method_id); 780 input_method_manager_->ChangeInputMethod(current_input_method_id);
628 } 781 }
629 782
783 void Preferences::SetEnabledExtensionImes() {
784 std::string value(enabled_extension_imes_.GetValue());
785 std::vector<std::string> split_values;
786 if (!value.empty())
787 base::SplitString(value, ',', &split_values);
788 input_method_manager_->SetEnabledExtensionImes(&split_values);
789 }
790
791 void Preferences::SetSyncableInputMethodPrefs() {
792 // Set the language and input prefs at the same time. Otherwise, we may,
793 // e.g., use a stale languages setting but push a new preload engines setting.
794 preferred_languages_syncable_.SetValue(preferred_languages_.GetValue());
795 enabled_extension_imes_syncable_.SetValue(
796 enabled_extension_imes_.GetValue());
797
798 // For preload engines, use legacy xkb IDs so the preference can sync
799 // across Chrome OS and Chromium OS.
800 std::vector<std::string> engines;
801 base::SplitString(preload_engines_.GetValue(), ',', &engines);
802 std::transform(engines.begin(), engines.end(), engines.begin(),
803 extension_ime_util::GetEngineIDByInputMethodID);
804 preload_engines_syncable_.SetValue(JoinString(engines, ','));
805 }
806
807 void Preferences::MergeSyncedInputMethods() {
808 // This should only be done on the first ever sync.
809 DCHECK(prefs_->GetBoolean(prefs::kLanguageShouldMergeInputMethods));
810 prefs_->SetBoolean(prefs::kLanguageShouldMergeInputMethods, false);
811
812 // Merge the values from the sync server into the local values.
813 preferred_languages_.SetValue(
814 AddSupportedInputMethodValues(preferred_languages_.GetValue(),
815 preferred_languages_syncable_.GetValue(),
816 prefs::kLanguagePreferredLanguages));
817 preload_engines_.SetValue(
818 AddSupportedInputMethodValues(preload_engines_.GetValue(),
819 preload_engines_syncable_.GetValue(),
820 prefs::kLanguagePreloadEngines));
821 enabled_extension_imes_.SetValue(
822 AddSupportedInputMethodValues(enabled_extension_imes_.GetValue(),
823 enabled_extension_imes_syncable_.GetValue(),
824 prefs::kLanguageEnabledExtensionImes));
825
826 // Apply the new values.
827 SetLanguageConfigStringListAsCSV(language_prefs::kGeneralSectionName,
828 language_prefs::kPreloadEnginesConfigName,
829 preload_engines_.GetValue());
830 SetEnabledExtensionImes();
831 SetSyncableInputMethodPrefs();
832
833 // Check the new list of preferred languages to remove unsupported locales.
834 scoped_ptr<std::string> languages(
835 new std::string(preferred_languages_.GetValue()));
836 content::BrowserThread::PostTaskAndReply(
837 content::BrowserThread::FILE,
838 FROM_HERE,
839 base::Bind(&CheckAndResolveLocales, languages.get()),
840 base::Bind(&Preferences::SetPreferredLanguages,
841 weak_factory_.GetWeakPtr(),
842 base::Passed(&languages)));
843 }
844
630 void Preferences::UpdateAutoRepeatRate() { 845 void Preferences::UpdateAutoRepeatRate() {
631 input_method::AutoRepeatRate rate; 846 input_method::AutoRepeatRate rate;
632 rate.initial_delay_in_ms = xkb_auto_repeat_delay_pref_.GetValue(); 847 rate.initial_delay_in_ms = xkb_auto_repeat_delay_pref_.GetValue();
633 rate.repeat_interval_in_ms = xkb_auto_repeat_interval_pref_.GetValue(); 848 rate.repeat_interval_in_ms = xkb_auto_repeat_interval_pref_.GetValue();
634 DCHECK(rate.initial_delay_in_ms > 0); 849 DCHECK(rate.initial_delay_in_ms > 0);
635 DCHECK(rate.repeat_interval_in_ms > 0); 850 DCHECK(rate.repeat_interval_in_ms > 0);
636 input_method::InputMethodManager::Get() 851 input_method::InputMethodManager::Get()
637 ->GetImeKeyboard() 852 ->GetImeKeyboard()
638 ->SetAutoRepeatRate(rate); 853 ->SetAutoRepeatRate(rate);
639 } 854 }
640 855
641 void Preferences::OnTouchHudProjectionToggled(bool enabled) { 856 void Preferences::OnTouchHudProjectionToggled(bool enabled) {
642 if (touch_hud_projection_enabled_.GetValue() == enabled) 857 if (touch_hud_projection_enabled_.GetValue() == enabled)
643 return; 858 return;
644 if (!user_->is_active()) 859 if (!user_->is_active())
645 return; 860 return;
646 touch_hud_projection_enabled_.SetValue(enabled); 861 touch_hud_projection_enabled_.SetValue(enabled);
647 } 862 }
648 863
649 void Preferences::ActiveUserChanged(const User* active_user) { 864 void Preferences::ActiveUserChanged(const User* active_user) {
650 if (active_user != user_) 865 if (active_user != user_)
651 return; 866 return;
652 ApplyPreferences(REASON_ACTIVE_USER_CHANGED, ""); 867 ApplyPreferences(REASON_ACTIVE_USER_CHANGED, "");
653 } 868 }
654 869
655 } // namespace chromeos 870 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698