172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <string> 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/string_util.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros_settings.h" 123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/metrics/user_metrics.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_details.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_source.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos { 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 183345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickCoreChromeOSOptionsHandler::CoreChromeOSOptionsHandler() 193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : handling_change_(false) { 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 223345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickValue* CoreChromeOSOptionsHandler::FetchPref(const std::string& pref_name) { 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!CrosSettings::IsCrosSettings(pref_name)) 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return ::CoreOptionsHandler::FetchPref(pref_name); 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Value* pref_value = NULL; 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CrosSettings::Get()->Get(pref_name, &pref_value); 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return pref_value ? pref_value : Value::CreateNullValue(); 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreChromeOSOptionsHandler::ObservePref(const std::string& pref_name) { 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!CrosSettings::IsCrosSettings(pref_name)) 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return ::CoreOptionsHandler::ObservePref(pref_name); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(xiyuan): Change this when CrosSettings supports observers. 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CrosSettings::Get()->AddSettingsObserver(pref_name.c_str(), this); 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreChromeOSOptionsHandler::SetPref(const std::string& pref_name, 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const Value* value, 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& metric) { 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!CrosSettings::IsCrosSettings(pref_name)) 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return ::CoreOptionsHandler::SetPref(pref_name, value, metric); 443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick handling_change_ = true; 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // CrosSettings takes ownership of its value so we need to copy it. 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Value* pref_value = value->DeepCopy(); 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CrosSettings::Get()->Set(pref_name, pref_value); 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick handling_change_ = false; 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ProcessUserMetric(value, metric); 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreChromeOSOptionsHandler::StopObservingPref(const std::string& path) { 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Unregister this instance from observing prefs of chrome os settings. 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (CrosSettings::IsCrosSettings(path)) 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CrosSettings::Get()->RemoveSettingsObserver(path.c_str(), this); 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen else // Call base class to handle regular preferences. 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ::CoreOptionsHandler::StopObservingPref(path); 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreChromeOSOptionsHandler::Observe(NotificationType type, 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const NotificationSource& source, 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const NotificationDetails& details) { 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Ignore the notification if this instance had caused it. 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (handling_change_) 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (type == NotificationType::SYSTEM_SETTING_CHANGED) { 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NotifySettingsChanged(Details<std::string>(details).ptr()); 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ::CoreOptionsHandler::Observe(type, source, details); 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreChromeOSOptionsHandler::NotifySettingsChanged( 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string* setting_name) { 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(web_ui_); 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CrosSettings::Get()->IsCrosSettings(*setting_name)); 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Value* value = NULL; 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!CrosSettings::Get()->Get(*setting_name, &value)) { 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NOTREACHED(); 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (value) 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick delete value; 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (PreferenceCallbackMap::const_iterator iter = 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick pref_callback_map_.find(*setting_name); 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick iter != pref_callback_map_.end(); ++iter) { 883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::wstring& callback_function = iter->second; 893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ListValue result_value; 903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick result_value.Append(Value::CreateStringValue(setting_name->c_str())); 913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick result_value.Append(value->DeepCopy()); 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction(WideToASCII(callback_function), 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen result_value); 943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (value) 963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick delete value; 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace chromeos 100