1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler.h" 6 7 #include <string> 8 9 #include "base/string_number_conversions.h" 10 #include "base/string_util.h" 11 #include "chrome/browser/chromeos/cros_settings.h" 12 #include "chrome/browser/metrics/user_metrics.h" 13 #include "content/common/notification_details.h" 14 #include "content/common/notification_source.h" 15 16 namespace chromeos { 17 18 CoreChromeOSOptionsHandler::CoreChromeOSOptionsHandler() 19 : handling_change_(false) { 20 } 21 22 Value* CoreChromeOSOptionsHandler::FetchPref(const std::string& pref_name) { 23 if (!CrosSettings::IsCrosSettings(pref_name)) 24 return ::CoreOptionsHandler::FetchPref(pref_name); 25 26 Value* pref_value = NULL; 27 CrosSettings::Get()->Get(pref_name, &pref_value); 28 return pref_value ? pref_value : Value::CreateNullValue(); 29 } 30 31 void CoreChromeOSOptionsHandler::ObservePref(const std::string& pref_name) { 32 if (!CrosSettings::IsCrosSettings(pref_name)) 33 return ::CoreOptionsHandler::ObservePref(pref_name); 34 35 // TODO(xiyuan): Change this when CrosSettings supports observers. 36 CrosSettings::Get()->AddSettingsObserver(pref_name.c_str(), this); 37 } 38 39 void CoreChromeOSOptionsHandler::SetPref(const std::string& pref_name, 40 const Value* value, 41 const std::string& metric) { 42 if (!CrosSettings::IsCrosSettings(pref_name)) 43 return ::CoreOptionsHandler::SetPref(pref_name, value, metric); 44 handling_change_ = true; 45 // CrosSettings takes ownership of its value so we need to copy it. 46 Value* pref_value = value->DeepCopy(); 47 CrosSettings::Get()->Set(pref_name, pref_value); 48 handling_change_ = false; 49 50 ProcessUserMetric(value, metric); 51 } 52 53 void CoreChromeOSOptionsHandler::StopObservingPref(const std::string& path) { 54 // Unregister this instance from observing prefs of chrome os settings. 55 if (CrosSettings::IsCrosSettings(path)) 56 CrosSettings::Get()->RemoveSettingsObserver(path.c_str(), this); 57 else // Call base class to handle regular preferences. 58 ::CoreOptionsHandler::StopObservingPref(path); 59 } 60 61 void CoreChromeOSOptionsHandler::Observe(NotificationType type, 62 const NotificationSource& source, 63 const NotificationDetails& details) { 64 // Ignore the notification if this instance had caused it. 65 if (handling_change_) 66 return; 67 if (type == NotificationType::SYSTEM_SETTING_CHANGED) { 68 NotifySettingsChanged(Details<std::string>(details).ptr()); 69 return; 70 } 71 ::CoreOptionsHandler::Observe(type, source, details); 72 } 73 74 void CoreChromeOSOptionsHandler::NotifySettingsChanged( 75 const std::string* setting_name) { 76 DCHECK(web_ui_); 77 DCHECK(CrosSettings::Get()->IsCrosSettings(*setting_name)); 78 Value* value = NULL; 79 if (!CrosSettings::Get()->Get(*setting_name, &value)) { 80 NOTREACHED(); 81 if (value) 82 delete value; 83 return; 84 } 85 for (PreferenceCallbackMap::const_iterator iter = 86 pref_callback_map_.find(*setting_name); 87 iter != pref_callback_map_.end(); ++iter) { 88 const std::wstring& callback_function = iter->second; 89 ListValue result_value; 90 result_value.Append(Value::CreateStringValue(setting_name->c_str())); 91 result_value.Append(value->DeepCopy()); 92 web_ui_->CallJavascriptFunction(WideToASCII(callback_function), 93 result_value); 94 } 95 if (value) 96 delete value; 97 } 98 99 } // namespace chromeos 100