| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/chromeos/extensions/info_private_api.h" |
| |
| #include <stddef.h> |
| |
| #include <utility> |
| |
| #include "base/sys_info.h" |
| #include "base/values.h" |
| #include "chrome/browser/app_mode/app_mode_utils.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/chromeos/login/startup_utils.h" |
| #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" |
| #include "chrome/browser/chromeos/settings/cros_settings.h" |
| #include "chrome/browser/chromeos/system/timezone_util.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/common/pref_names.h" |
| #include "chromeos/network/device_state.h" |
| #include "chromeos/network/network_handler.h" |
| #include "chromeos/network/network_state_handler.h" |
| #include "chromeos/settings/cros_settings_names.h" |
| #include "chromeos/system/statistics_provider.h" |
| #include "components/metrics/metrics_service.h" |
| #include "components/prefs/pref_service.h" |
| #include "components/user_manager/user_manager.h" |
| #include "extensions/common/error_utils.h" |
| #include "third_party/cros_system_api/dbus/service_constants.h" |
| |
| using chromeos::NetworkHandler; |
| |
| namespace extensions { |
| |
| namespace { |
| |
| // Key which corresponds to the HWID setting. |
| const char kPropertyHWID[] = "hwid"; |
| |
| // Key which corresponds to the customization ID setting. |
| const char kPropertyCustomizationID[] = "customizationId"; |
| |
| // Key which corresponds to the home provider property. |
| const char kPropertyHomeProvider[] = "homeProvider"; |
| |
| // Key which corresponds to the initial_locale property. |
| const char kPropertyInitialLocale[] = "initialLocale"; |
| |
| // Key which corresponds to the board property in JS. |
| const char kPropertyBoard[] = "board"; |
| |
| // Key which corresponds to the isOwner property in JS. |
| const char kPropertyOwner[] = "isOwner"; |
| |
| // Key which corresponds to the clientId property in JS. |
| const char kPropertyClientId[] = "clientId"; |
| |
| // Key which corresponds to the timezone property in JS. |
| const char kPropertyTimezone[] = "timezone"; |
| |
| // Key which corresponds to the timezone property in JS. |
| const char kPropertySupportedTimezones[] = "supportedTimezones"; |
| |
| // Key which corresponds to the large cursor A11Y property in JS. |
| const char kPropertyLargeCursorEnabled[] = "a11yLargeCursorEnabled"; |
| |
| // Key which corresponds to the sticky keys A11Y property in JS. |
| const char kPropertyStickyKeysEnabled[] = "a11yStickyKeysEnabled"; |
| |
| // Key which corresponds to the spoken feedback A11Y property in JS. |
| const char kPropertySpokenFeedbackEnabled[] = "a11ySpokenFeedbackEnabled"; |
| |
| // Key which corresponds to the high contrast mode A11Y property in JS. |
| const char kPropertyHighContrastEnabled[] = "a11yHighContrastEnabled"; |
| |
| // Key which corresponds to the screen magnifier A11Y property in JS. |
| const char kPropertyScreenMagnifierEnabled[] = "a11yScreenMagnifierEnabled"; |
| |
| // Key which corresponds to the auto click A11Y property in JS. |
| const char kPropertyAutoclickEnabled[] = "a11yAutoClickEnabled"; |
| |
| // Key which corresponds to the auto click A11Y property in JS. |
| const char kPropertyVirtualKeyboardEnabled[] = "a11yVirtualKeyboardEnabled"; |
| |
| // Key which corresponds to the caret highlight A11Y property in JS. |
| const char kPropertyCaretHighlightEnabled[] = "a11yCaretHighlightEnabled"; |
| |
| // Key which corresponds to the cursor highlight A11Y property in JS. |
| const char kPropertyCursorHighlightEnabled[] = "a11yCursorHighlightEnabled"; |
| |
| // Key which corresponds to the focus highlight A11Y property in JS. |
| const char kPropertyFocusHighlightEnabled[] = "a11yFocusHighlightEnabled"; |
| |
| // Key which corresponds to the select-to-speak A11Y property in JS. |
| const char kPropertySelectToSpeakEnabled[] = "a11ySelectToSpeakEnabled"; |
| |
| // Key which corresponds to the switch access A11Y property in JS. |
| const char kPropertySwitchAccessEnabled[] = "a11ySwitchAccessEnabled"; |
| |
| // Key which corresponds to the send-function-keys property in JS. |
| const char kPropertySendFunctionsKeys[] = "sendFunctionKeys"; |
| |
| // Property not found error message. |
| const char kPropertyNotFound[] = "Property '*' does not exist."; |
| |
| const struct { |
| const char* api_name; |
| const char* preference_name; |
| } kPreferencesMap[] = { |
| {kPropertyLargeCursorEnabled, prefs::kAccessibilityLargeCursorEnabled}, |
| {kPropertyStickyKeysEnabled, prefs::kAccessibilityStickyKeysEnabled}, |
| {kPropertySpokenFeedbackEnabled, |
| prefs::kAccessibilitySpokenFeedbackEnabled}, |
| {kPropertyHighContrastEnabled, prefs::kAccessibilityHighContrastEnabled}, |
| {kPropertyScreenMagnifierEnabled, |
| prefs::kAccessibilityScreenMagnifierEnabled}, |
| {kPropertyAutoclickEnabled, prefs::kAccessibilityAutoclickEnabled}, |
| {kPropertyVirtualKeyboardEnabled, |
| prefs::kAccessibilityVirtualKeyboardEnabled}, |
| {kPropertyCaretHighlightEnabled, |
| prefs::kAccessibilityCaretHighlightEnabled}, |
| {kPropertyCursorHighlightEnabled, |
| prefs::kAccessibilityCursorHighlightEnabled}, |
| {kPropertyFocusHighlightEnabled, |
| prefs::kAccessibilityFocusHighlightEnabled}, |
| {kPropertySelectToSpeakEnabled, prefs::kAccessibilitySelectToSpeakEnabled}, |
| {kPropertySwitchAccessEnabled, prefs::kAccessibilitySwitchAccessEnabled}, |
| {kPropertySendFunctionsKeys, prefs::kLanguageSendFunctionKeys}}; |
| |
| const char* GetBoolPrefNameForApiProperty(const char* api_name) { |
| for (size_t i = 0; |
| i < (sizeof(kPreferencesMap)/sizeof(*kPreferencesMap)); |
| i++) { |
| if (strcmp(kPreferencesMap[i].api_name, api_name) == 0) |
| return kPreferencesMap[i].preference_name; |
| } |
| |
| return NULL; |
| } |
| |
| bool IsEnterpriseKiosk() { |
| if (!chrome::IsRunningInForcedAppMode()) |
| return false; |
| |
| policy::BrowserPolicyConnectorChromeOS* connector = |
| g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
| return connector->IsEnterpriseManaged(); |
| } |
| |
| std::string GetClientId() { |
| return IsEnterpriseKiosk() |
| ? g_browser_process->metrics_service()->GetClientId() |
| : std::string(); |
| } |
| |
| } // namespace |
| |
| ChromeosInfoPrivateGetFunction::ChromeosInfoPrivateGetFunction() { |
| } |
| |
| ChromeosInfoPrivateGetFunction::~ChromeosInfoPrivateGetFunction() { |
| } |
| |
| bool ChromeosInfoPrivateGetFunction::RunAsync() { |
| base::ListValue* list = NULL; |
| EXTENSION_FUNCTION_VALIDATE(args_->GetList(0, &list)); |
| std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue()); |
| for (size_t i = 0; i < list->GetSize(); ++i) { |
| std::string property_name; |
| EXTENSION_FUNCTION_VALIDATE(list->GetString(i, &property_name)); |
| base::Value* value = GetValue(property_name); |
| if (value) |
| result->Set(property_name, value); |
| } |
| SetResult(std::move(result)); |
| SendResponse(true); |
| return true; |
| } |
| |
| base::Value* ChromeosInfoPrivateGetFunction::GetValue( |
| const std::string& property_name) { |
| if (property_name == kPropertyHWID) { |
| std::string hwid; |
| chromeos::system::StatisticsProvider* provider = |
| chromeos::system::StatisticsProvider::GetInstance(); |
| provider->GetMachineStatistic(chromeos::system::kHardwareClassKey, &hwid); |
| return new base::StringValue(hwid); |
| } else if (property_name == kPropertyCustomizationID) { |
| std::string customization_id; |
| chromeos::system::StatisticsProvider* provider = |
| chromeos::system::StatisticsProvider::GetInstance(); |
| provider->GetMachineStatistic(chromeos::system::kCustomizationIdKey, |
| &customization_id); |
| return new base::StringValue(customization_id); |
| } else if (property_name == kPropertyHomeProvider) { |
| const chromeos::DeviceState* cellular_device = |
| NetworkHandler::Get()->network_state_handler()->GetDeviceStateByType( |
| chromeos::NetworkTypePattern::Cellular()); |
| std::string home_provider_id; |
| if (cellular_device) |
| home_provider_id = cellular_device->home_provider_id(); |
| return new base::StringValue(home_provider_id); |
| } else if (property_name == kPropertyInitialLocale) { |
| return new base::StringValue( |
| chromeos::StartupUtils::GetInitialLocale()); |
| } else if (property_name == kPropertyBoard) { |
| return new base::StringValue(base::SysInfo::GetLsbReleaseBoard()); |
| } else if (property_name == kPropertyOwner) { |
| return new base::FundamentalValue( |
| user_manager::UserManager::Get()->IsCurrentUserOwner()); |
| } else if (property_name == kPropertyClientId) { |
| return new base::StringValue(GetClientId()); |
| } else if (property_name == kPropertyTimezone) { |
| return chromeos::CrosSettings::Get()->GetPref( |
| chromeos::kSystemTimezone)->DeepCopy(); |
| } else if (property_name == kPropertySupportedTimezones) { |
| std::unique_ptr<base::ListValue> values = |
| chromeos::system::GetTimezoneList(); |
| return values.release(); |
| } else { |
| const char* pref_name = |
| GetBoolPrefNameForApiProperty(property_name.c_str()); |
| if (pref_name) { |
| return new base::FundamentalValue( |
| Profile::FromBrowserContext(context_)->GetPrefs()->GetBoolean( |
| pref_name)); |
| } |
| } |
| |
| DLOG(ERROR) << "Unknown property request: " << property_name; |
| return NULL; |
| } |
| |
| ChromeosInfoPrivateSetFunction::ChromeosInfoPrivateSetFunction() { |
| } |
| |
| ChromeosInfoPrivateSetFunction::~ChromeosInfoPrivateSetFunction() { |
| } |
| |
| bool ChromeosInfoPrivateSetFunction::RunSync() { |
| std::string param_name; |
| EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, ¶m_name)); |
| if (param_name == kPropertyTimezone) { |
| std::string param_value; |
| EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, ¶m_value)); |
| chromeos::CrosSettings::Get()->Set(chromeos::kSystemTimezone, |
| base::StringValue(param_value)); |
| } else { |
| const char* pref_name = GetBoolPrefNameForApiProperty(param_name.c_str()); |
| if (pref_name) { |
| bool param_value; |
| EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(1, ¶m_value)); |
| Profile::FromBrowserContext(context_)->GetPrefs()->SetBoolean( |
| pref_name, |
| param_value); |
| } else { |
| error_ = ErrorUtils::FormatErrorMessage(kPropertyNotFound, param_name); |
| return false; |
| } |
| } |
| |
| return true; |
| } |
| |
| } // namespace extensions |