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
3 // found in the LICENSE file.
5 #include "chrome/browser/chromeos/extensions/info_private_api.h"
7 #include "base/basictypes.h"
8 #include "base/prefs/pref_service.h"
9 #include "base/sys_info.h"
10 #include "base/values.h"
11 #include "chrome/browser/app_mode/app_mode_utils.h"
12 #include "chrome/browser/browser_process.h"
13 #include "chrome/browser/chromeos/login/startup_utils.h"
14 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
15 #include "chrome/browser/chromeos/settings/cros_settings.h"
16 #include "chrome/browser/chromeos/system/timezone_util.h"
17 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/common/pref_names.h"
19 #include "chromeos/network/device_state.h"
20 #include "chromeos/network/network_handler.h"
21 #include "chromeos/network/network_state_handler.h"
22 #include "chromeos/settings/cros_settings_names.h"
23 #include "chromeos/system/statistics_provider.h"
24 #include "components/metrics/metrics_service.h"
25 #include "components/user_manager/user_manager.h"
26 #include "extensions/common/error_utils.h"
27 #include "third_party/cros_system_api/dbus/service_constants.h"
29 using chromeos::NetworkHandler
;
31 namespace extensions
{
35 // Key which corresponds to the HWID setting.
36 const char kPropertyHWID
[] = "hwid";
38 // Key which corresponds to the customization ID setting.
39 const char kPropertyCustomizationID
[] = "customizationId";
41 // Key which corresponds to the home provider property.
42 const char kPropertyHomeProvider
[] = "homeProvider";
44 // Key which corresponds to the initial_locale property.
45 const char kPropertyInitialLocale
[] = "initialLocale";
47 // Key which corresponds to the board property in JS.
48 const char kPropertyBoard
[] = "board";
50 // Key which corresponds to the isOwner property in JS.
51 const char kPropertyOwner
[] = "isOwner";
53 // Key which corresponds to the clientId property in JS.
54 const char kPropertyClientId
[] = "clientId";
56 // Key which corresponds to the timezone property in JS.
57 const char kPropertyTimezone
[] = "timezone";
59 // Key which corresponds to the timezone property in JS.
60 const char kPropertySupportedTimezones
[] = "supportedTimezones";
62 // Key which corresponds to the large cursor A11Y property in JS.
63 const char kPropertyLargeCursorEnabled
[] = "a11yLargeCursorEnabled";
65 // Key which corresponds to the sticky keys A11Y property in JS.
66 const char kPropertyStickyKeysEnabled
[] = "a11yStickyKeysEnabled";
68 // Key which corresponds to the spoken feedback A11Y property in JS.
69 const char kPropertySpokenFeedbackEnabled
[] = "a11ySpokenFeedbackEnabled";
71 // Key which corresponds to the high contrast mode A11Y property in JS.
72 const char kPropertyHighContrastEnabled
[] = "a11yHighContrastEnabled";
74 // Key which corresponds to the screen magnifier A11Y property in JS.
75 const char kPropertyScreenMagnifierEnabled
[] = "a11yScreenMagnifierEnabled";
77 // Key which corresponds to the auto click A11Y property in JS.
78 const char kPropertyAutoclickEnabled
[] = "a11yAutoClickEnabled";
80 // Key which corresponds to the auto click A11Y property in JS.
81 const char kPropertyVirtualKeyboardEnabled
[] = "a11yVirtualKeyboardEnabled";
83 // Key which corresponds to the send-function-keys property in JS.
84 const char kPropertySendFunctionsKeys
[] = "sendFunctionKeys";
86 // Property not found error message.
87 const char kPropertyNotFound
[] = "Property '*' does not exist.";
91 const char* preference_name
;
92 } kPreferencesMap
[] = {
93 {kPropertyLargeCursorEnabled
, prefs::kAccessibilityLargeCursorEnabled
},
94 {kPropertyStickyKeysEnabled
, prefs::kAccessibilityStickyKeysEnabled
},
95 {kPropertySpokenFeedbackEnabled
,
96 prefs::kAccessibilitySpokenFeedbackEnabled
},
97 {kPropertyHighContrastEnabled
, prefs::kAccessibilityHighContrastEnabled
},
98 {kPropertyScreenMagnifierEnabled
,
99 prefs::kAccessibilityScreenMagnifierEnabled
},
100 {kPropertyAutoclickEnabled
, prefs::kAccessibilityAutoclickEnabled
},
101 {kPropertyVirtualKeyboardEnabled
,
102 prefs::kAccessibilityVirtualKeyboardEnabled
},
103 {kPropertySendFunctionsKeys
, prefs::kLanguageSendFunctionKeys
}};
105 const char* GetBoolPrefNameForApiProperty(const char* api_name
) {
107 i
< (sizeof(kPreferencesMap
)/sizeof(*kPreferencesMap
));
109 if (strcmp(kPreferencesMap
[i
].api_name
, api_name
) == 0)
110 return kPreferencesMap
[i
].preference_name
;
116 bool IsEnterpriseKiosk() {
117 if (!chrome::IsRunningInForcedAppMode())
120 policy::BrowserPolicyConnectorChromeOS
* connector
=
121 g_browser_process
->platform_part()->browser_policy_connector_chromeos();
122 return connector
->IsEnterpriseManaged();
125 std::string
GetClientId() {
126 return IsEnterpriseKiosk()
127 ? g_browser_process
->metrics_service()->GetClientId()
133 ChromeosInfoPrivateGetFunction::ChromeosInfoPrivateGetFunction() {
136 ChromeosInfoPrivateGetFunction::~ChromeosInfoPrivateGetFunction() {
139 bool ChromeosInfoPrivateGetFunction::RunAsync() {
140 base::ListValue
* list
= NULL
;
141 EXTENSION_FUNCTION_VALIDATE(args_
->GetList(0, &list
));
142 scoped_ptr
<base::DictionaryValue
> result(new base::DictionaryValue());
143 for (size_t i
= 0; i
< list
->GetSize(); ++i
) {
144 std::string property_name
;
145 EXTENSION_FUNCTION_VALIDATE(list
->GetString(i
, &property_name
));
146 base::Value
* value
= GetValue(property_name
);
148 result
->Set(property_name
, value
);
150 SetResult(result
.release());
155 base::Value
* ChromeosInfoPrivateGetFunction::GetValue(
156 const std::string
& property_name
) {
157 if (property_name
== kPropertyHWID
) {
159 chromeos::system::StatisticsProvider
* provider
=
160 chromeos::system::StatisticsProvider::GetInstance();
161 provider
->GetMachineStatistic(chromeos::system::kHardwareClassKey
, &hwid
);
162 return new base::StringValue(hwid
);
163 } else if (property_name
== kPropertyCustomizationID
) {
164 std::string customization_id
;
165 chromeos::system::StatisticsProvider
* provider
=
166 chromeos::system::StatisticsProvider::GetInstance();
167 provider
->GetMachineStatistic(chromeos::system::kCustomizationIdKey
,
169 return new base::StringValue(customization_id
);
170 } else if (property_name
== kPropertyHomeProvider
) {
171 const chromeos::DeviceState
* cellular_device
=
172 NetworkHandler::Get()->network_state_handler()->GetDeviceStateByType(
173 chromeos::NetworkTypePattern::Cellular());
174 std::string home_provider_id
;
176 home_provider_id
= cellular_device
->home_provider_id();
177 return new base::StringValue(home_provider_id
);
178 } else if (property_name
== kPropertyInitialLocale
) {
179 return new base::StringValue(
180 chromeos::StartupUtils::GetInitialLocale());
181 } else if (property_name
== kPropertyBoard
) {
182 return new base::StringValue(base::SysInfo::GetLsbReleaseBoard());
183 } else if (property_name
== kPropertyOwner
) {
184 return new base::FundamentalValue(
185 user_manager::UserManager::Get()->IsCurrentUserOwner());
186 } else if (property_name
== kPropertyClientId
) {
187 return new base::StringValue(GetClientId());
188 } else if (property_name
== kPropertyTimezone
) {
189 return chromeos::CrosSettings::Get()->GetPref(
190 chromeos::kSystemTimezone
)->DeepCopy();
191 } else if (property_name
== kPropertySupportedTimezones
) {
192 scoped_ptr
<base::ListValue
> values
= chromeos::system::GetTimezoneList();
193 return values
.release();
195 const char* pref_name
=
196 GetBoolPrefNameForApiProperty(property_name
.c_str());
198 return new base::FundamentalValue(
199 Profile::FromBrowserContext(context_
)->GetPrefs()->GetBoolean(
204 DLOG(ERROR
) << "Unknown property request: " << property_name
;
208 ChromeosInfoPrivateSetFunction::ChromeosInfoPrivateSetFunction() {
211 ChromeosInfoPrivateSetFunction::~ChromeosInfoPrivateSetFunction() {
214 bool ChromeosInfoPrivateSetFunction::RunSync() {
215 std::string param_name
;
216 EXTENSION_FUNCTION_VALIDATE(args_
->GetString(0, ¶m_name
));
217 if (param_name
== kPropertyTimezone
) {
218 std::string param_value
;
219 EXTENSION_FUNCTION_VALIDATE(args_
->GetString(1, ¶m_value
));
220 chromeos::CrosSettings::Get()->Set(chromeos::kSystemTimezone
,
221 base::StringValue(param_value
));
223 const char* pref_name
= GetBoolPrefNameForApiProperty(param_name
.c_str());
226 EXTENSION_FUNCTION_VALIDATE(args_
->GetBoolean(1, ¶m_value
));
227 Profile::FromBrowserContext(context_
)->GetPrefs()->SetBoolean(
231 error_
= ErrorUtils::FormatErrorMessage(kPropertyNotFound
, param_name
);
239 } // namespace extensions