core_chromeos_options_handler.cc revision ddb351dbec246cf1fab5ec20d2d5520909041de1
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
16namespace chromeos {
17
18CoreChromeOSOptionsHandler::CoreChromeOSOptionsHandler()
19    : handling_change_(false) {
20}
21
22Value* 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
31void 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
39void 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
53void 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
61void 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
74void 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