system_private_api.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
1689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira// Use of this source code is governed by a BSD-style license that can be 3689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira// found in the LICENSE file. 4689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira 5689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/browser/extensions/api/system_private/system_private_api.h" 6689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira 7689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "base/prefs/pref_service.h" 8689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "base/values.h" 9689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/browser/browser_process.h" 10689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/browser/extensions/event_router_forwarder.h" 11689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/browser/profiles/profile.h" 12689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/common/extensions/api/system_private.h" 13689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/common/pref_names.h" 14689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "google_apis/google_api_keys.h" 15689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira 16689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#if defined(OS_CHROMEOS) 17689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chromeos/dbus/dbus_thread_manager.h" 18689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chromeos/dbus/update_engine_client.h" 19689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#else 20689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#include "chrome/browser/upgrade_detector.h" 21689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#endif 22689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira 23689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiranamespace { 24689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira 25689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira// Maps prefs::kIncognitoModeAvailability values (0 = enabled, ...) 26689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira// to strings exposed to extensions. 27689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiraconst char* kIncognitoModeAvailabilityStrings[] = { 28689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira "enabled", 29689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira "disabled", 30689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira "forced" 3174437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira}; 32689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira 33689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira// Property keys. 34689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiraconst char kBrightnessKey[] = "brightness"; 35689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiraconst char kDownloadProgressKey[] = "downloadProgress"; 36689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiraconst char kIsVolumeMutedKey[] = "isVolumeMuted"; 37d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereiraconst char kStateKey[] = "state"; 38d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereiraconst char kUserInitiatedKey[] = "userInitiated"; 39689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiraconst char kVolumeKey[] = "volume"; 40689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira 4174437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira// System update states. 42d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereiraconst char kNotAvailableState[] = "NotAvailable"; 43d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereiraconst char kNeedRestartState[] = "NeedRestart"; 44689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira 45689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#if defined(OS_CHROMEOS) 46689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiraconst char kUpdatingState[] = "Updating"; 47689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#endif // defined(OS_CHROMEOS) 48dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira 49dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira// Dispatches an extension event with |argument| 50689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiravoid DispatchEvent(const std::string& event_name, base::Value* argument) { 51689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira scoped_ptr<base::ListValue> list_args(new base::ListValue()); 52689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira if (argument) { 53689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira list_args->Append(argument); 54689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira } 55dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira g_browser_process->extension_event_router_forwarder()-> 56689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira BroadcastEventToRenderers(event_name, list_args.Pass(), GURL()); 57d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira} 58dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira 59d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira} // namespace 60689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira 61689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiranamespace extensions { 62689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira 63689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiranamespace system_private = api::system_private; 64689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira 65689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereirabool SystemPrivateGetIncognitoModeAvailabilityFunction::RunImpl() { 6674437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira PrefService* prefs = GetProfile()->GetPrefs(); 67dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira int value = prefs->GetInteger(prefs::kIncognitoModeAvailability); 68dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira EXTENSION_FUNCTION_VALIDATE( 69689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira value >= 0 && 70689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira value < static_cast<int>(arraysize(kIncognitoModeAvailabilityStrings))); 71dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira SetResult(new base::StringValue(kIncognitoModeAvailabilityStrings[value])); 72dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira return true; 73dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira} 74689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira 75689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereirabool SystemPrivateGetUpdateStatusFunction::RunImpl() { 76689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira std::string state; 77689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira double download_progress = 0; 78689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#if defined(OS_CHROMEOS) 79689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira // With UpdateEngineClient, we can provide more detailed information about 80689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira // system updates on ChromeOS. 81689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira const chromeos::UpdateEngineClient::Status status = 82689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()-> 83689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira GetLastStatus(); 84689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira // |download_progress| is set to 1 after download finishes 85689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira // (i.e. verify, finalize and need-reboot phase) to indicate the progress 86689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira // even though |status.download_progress| is 0 in these phases. 87689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira switch (status.status) { 88689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira case chromeos::UpdateEngineClient::UPDATE_STATUS_ERROR: 89689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira state = kNotAvailableState; 90689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira break; 91689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira case chromeos::UpdateEngineClient::UPDATE_STATUS_IDLE: 92689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira state = kNotAvailableState; 9374437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira break; 9474437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira case chromeos::UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE: 9574437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira state = kNotAvailableState; 96dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira break; 97dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira case chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE: 98dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira state = kUpdatingState; 99dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira break; 100dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira case chromeos::UpdateEngineClient::UPDATE_STATUS_DOWNLOADING: 101dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira state = kUpdatingState; 10274437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira download_progress = status.download_progress; 103689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira break; 104689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira case chromeos::UpdateEngineClient::UPDATE_STATUS_VERIFYING: 105689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira state = kUpdatingState; 106689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira download_progress = 1; 107689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira break; 108689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira case chromeos::UpdateEngineClient::UPDATE_STATUS_FINALIZING: 109fa77943ee3d8ef33abf4f8288875783de623b4d9Mindy Pereira state = kUpdatingState; 110689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira download_progress = 1; 111689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira break; 112689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira case chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT: 113689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira state = kNeedRestartState; 114689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira download_progress = 1; 115689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira break; 116112ae3627e7f32991822b3fd2001fe7239f1d3eaMindy Pereira case chromeos::UpdateEngineClient::UPDATE_STATUS_REPORTING_ERROR_EVENT: 117689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira state = kNotAvailableState; 118dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira break; 119689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira } 120689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#else 121689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira if (UpgradeDetector::GetInstance()->notify_upgrade()) { 122dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira state = kNeedRestartState; 123dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira download_progress = 1; 124689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira } else { 125689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira state = kNotAvailableState; 126689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira } 127689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira#endif 128689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira base::DictionaryValue* dict = new base::DictionaryValue(); 129689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira dict->SetString(kStateKey, state); 130dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira dict->SetDouble(kDownloadProgressKey, download_progress); 131dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira SetResult(dict); 132d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira 133dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira return true; 134dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira} 135689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira 136689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereirabool SystemPrivateGetApiKeyFunction::RunImpl() { 137d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira SetResult(new base::StringValue(google_apis::GetAPIKey())); 138d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira return true; 139d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira} 140d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira 141dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereiravoid DispatchVolumeChangedEvent(double volume, bool is_volume_muted) { 142dc943d6192dab40df68b6b583c84e64045ea1bc8Mindy Pereira base::DictionaryValue* dict = new base::DictionaryValue(); 143d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira dict->SetDouble(kVolumeKey, volume); 144dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira dict->SetBoolean(kIsVolumeMutedKey, is_volume_muted); 145689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira DispatchEvent(system_private::OnVolumeChanged::kEventName, dict); 146dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira} 147dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira 148689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereiravoid DispatchBrightnessChangedEvent(int brightness, bool user_initiated) { 149dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira base::DictionaryValue* dict = new base::DictionaryValue(); 150dd27d55a5152f86c07758067e587bdd5b719abafMindy Pereira dict->SetInteger(kBrightnessKey, brightness); 151689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira dict->SetBoolean(kUserInitiatedKey, user_initiated); 152689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira DispatchEvent(system_private::OnBrightnessChanged::kEventName, dict); 153689ab224266f62aefb35ef0b80af6edf66eb8972Mindy Pereira} 154d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira 155d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereiravoid DispatchScreenUnlockedEvent() { 156d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira DispatchEvent(system_private::OnScreenUnlocked::kEventName, NULL); 15774437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira} 15874437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira 15974437a01478b39230bb5b4657b74480ede53ae94Mindy Pereiravoid DispatchWokeUpEvent() { 16074437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira DispatchEvent(system_private::OnWokeUp::kEventName, NULL); 161d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira} 162d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira 163d08402a890f1ac4d3de832a9a781cbc5ebde804fMindy Pereira} // namespace extensions 16474437a01478b39230bb5b4657b74480ede53ae94Mindy Pereira