Home | History | Annotate | Download | only in chromeos
      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