15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/system_private/system_private_api.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/event_router_forwarder.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/extensions/api/system_private.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "google_apis/google_api_keys.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/update_engine_client.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/upgrade_detector.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maps prefs::kIncognitoModeAvailability values (0 = enabled, ...) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to strings exposed to extensions. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kIncognitoModeAvailabilityStrings[] = { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "enabled", 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "disabled", 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "forced" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property keys. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kBrightnessKey[] = "brightness"; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDownloadProgressKey[] = "downloadProgress"; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kIsVolumeMutedKey[] = "isVolumeMuted"; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kStateKey[] = "state"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUserInitiatedKey[] = "userInitiated"; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kVolumeKey[] = "volume"; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// System update states. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNotAvailableState[] = "NotAvailable"; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNeedRestartState[] = "NeedRestart"; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_CHROMEOS) 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kUpdatingState[] = "Updating"; 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dispatches an extension event with |argument| 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DispatchEvent(const std::string& event_name, base::Value* argument) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::ListValue> list_args(new base::ListValue()); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (argument) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_args->Append(argument); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process->extension_event_router_forwarder()-> 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BroadcastEventToRenderers(event_name, list_args.Pass(), GURL()); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace system_private = api::system_private; 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool SystemPrivateGetIncognitoModeAvailabilityFunction::RunSync() { 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PrefService* prefs = GetProfile()->GetPrefs(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int value = prefs->GetInteger(prefs::kIncognitoModeAvailability); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE( 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value >= 0 && 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value < static_cast<int>(arraysize(kIncognitoModeAvailabilityStrings))); 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetResult(new base::StringValue(kIncognitoModeAvailabilityStrings[value])); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool SystemPrivateGetUpdateStatusFunction::RunSync() { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string state; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double download_progress = 0; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With UpdateEngineClient, we can provide more detailed information about 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // system updates on ChromeOS. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const chromeos::UpdateEngineClient::Status status = 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()-> 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLastStatus(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |download_progress| is set to 1 after download finishes 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (i.e. verify, finalize and need-reboot phase) to indicate the progress 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // even though |status.download_progress| is 0 in these phases. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (status.status) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::UpdateEngineClient::UPDATE_STATUS_ERROR: 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = kNotAvailableState; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::UpdateEngineClient::UPDATE_STATUS_IDLE: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = kNotAvailableState; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = kNotAvailableState; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE: 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = kUpdatingState; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::UpdateEngineClient::UPDATE_STATUS_DOWNLOADING: 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = kUpdatingState; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_progress = status.download_progress; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::UpdateEngineClient::UPDATE_STATUS_VERIFYING: 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = kUpdatingState; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_progress = 1; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::UpdateEngineClient::UPDATE_STATUS_FINALIZING: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = kUpdatingState; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_progress = 1; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = kNeedRestartState; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_progress = 1; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::UpdateEngineClient::UPDATE_STATUS_REPORTING_ERROR_EVENT: 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case chromeos::UpdateEngineClient::UPDATE_STATUS_ATTEMPTING_ROLLBACK: 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = kNotAvailableState; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (UpgradeDetector::GetInstance()->notify_upgrade()) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = kNeedRestartState; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_progress = 1; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = kNotAvailableState; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* dict = new base::DictionaryValue(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString(kStateKey, state); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetDouble(kDownloadProgressKey, download_progress); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetResult(dict); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool SystemPrivateGetApiKeyFunction::RunSync() { 1380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SetResult(new base::StringValue(google_apis::GetAPIKey())); 1390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return true; 1400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 1410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DispatchVolumeChangedEvent(double volume, bool is_volume_muted) { 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* dict = new base::DictionaryValue(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetDouble(kVolumeKey, volume); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetBoolean(kIsVolumeMutedKey, is_volume_muted); 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DispatchEvent(system_private::OnVolumeChanged::kEventName, dict); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DispatchBrightnessChangedEvent(int brightness, bool user_initiated) { 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* dict = new base::DictionaryValue(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetInteger(kBrightnessKey, brightness); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetBoolean(kUserInitiatedKey, user_initiated); 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DispatchEvent(system_private::OnBrightnessChanged::kEventName, dict); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DispatchScreenUnlockedEvent() { 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DispatchEvent(system_private::OnScreenUnlocked::kEventName, NULL); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DispatchWokeUpEvent() { 1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DispatchEvent(system_private::OnWokeUp::kEventName, NULL); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 165