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. 4 5 #include "chrome/browser/extensions/api/system_private/system_private_api.h" 6 7 #include "base/prefs/pref_service.h" 8 #include "base/values.h" 9 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/extensions/event_router_forwarder.h" 11 #include "chrome/browser/profiles/profile.h" 12 #include "chrome/common/pref_names.h" 13 14 #if defined(OS_CHROMEOS) 15 #include "chromeos/dbus/dbus_thread_manager.h" 16 #include "chromeos/dbus/update_engine_client.h" 17 #else 18 #include "chrome/browser/upgrade_detector.h" 19 #endif 20 21 namespace { 22 23 // Maps prefs::kIncognitoModeAvailability values (0 = enabled, ...) 24 // to strings exposed to extensions. 25 const char* kIncognitoModeAvailabilityStrings[] = { 26 "enabled", 27 "disabled", 28 "forced" 29 }; 30 31 // Property keys. 32 const char kBrightnessKey[] = "brightness"; 33 const char kDownloadProgressKey[] = "downloadProgress"; 34 const char kIsVolumeMutedKey[] = "isVolumeMuted"; 35 const char kStateKey[] = "state"; 36 const char kUserInitiatedKey[] = "userInitiated"; 37 const char kVolumeKey[] = "volume"; 38 39 // System update states. 40 const char kNotAvailableState[] = "NotAvailable"; 41 const char kUpdatingState[] = "Updating"; 42 const char kNeedRestartState[] = "NeedRestart"; 43 44 // Event names. 45 const char kOnBrightnessChanged[] = "systemPrivate.onBrightnessChanged"; 46 const char kOnVolumeChanged[] = "systemPrivate.onVolumeChanged"; 47 const char kOnScreenUnlocked[] = "systemPrivate.onScreenUnlocked"; 48 const char kOnWokeUp[] = "systemPrivate.onWokeUp"; 49 50 // Dispatches an extension event with |argument| 51 void DispatchEvent(const std::string& event_name, base::Value* argument) { 52 scoped_ptr<base::ListValue> list_args(new base::ListValue()); 53 if (argument) { 54 list_args->Append(argument); 55 } 56 g_browser_process->extension_event_router_forwarder()-> 57 BroadcastEventToRenderers(event_name, list_args.Pass(), GURL()); 58 } 59 60 } // namespace 61 62 namespace extensions { 63 64 bool SystemPrivateGetIncognitoModeAvailabilityFunction::RunImpl() { 65 PrefService* prefs = profile_->GetPrefs(); 66 int value = prefs->GetInteger(prefs::kIncognitoModeAvailability); 67 EXTENSION_FUNCTION_VALIDATE( 68 value >= 0 && 69 value < static_cast<int>(arraysize(kIncognitoModeAvailabilityStrings))); 70 SetResult(Value::CreateStringValue(kIncognitoModeAvailabilityStrings[value])); 71 return true; 72 } 73 74 bool SystemPrivateGetUpdateStatusFunction::RunImpl() { 75 std::string state; 76 double download_progress = 0; 77 #if defined(OS_CHROMEOS) 78 // With UpdateEngineClient, we can provide more detailed information about 79 // system updates on ChromeOS. 80 const chromeos::UpdateEngineClient::Status status = 81 chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()-> 82 GetLastStatus(); 83 // |download_progress| is set to 1 after download finishes 84 // (i.e. verify, finalize and need-reboot phase) to indicate the progress 85 // even though |status.download_progress| is 0 in these phases. 86 switch (status.status) { 87 case chromeos::UpdateEngineClient::UPDATE_STATUS_ERROR: 88 state = kNotAvailableState; 89 break; 90 case chromeos::UpdateEngineClient::UPDATE_STATUS_IDLE: 91 state = kNotAvailableState; 92 break; 93 case chromeos::UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE: 94 state = kNotAvailableState; 95 break; 96 case chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE: 97 state = kUpdatingState; 98 break; 99 case chromeos::UpdateEngineClient::UPDATE_STATUS_DOWNLOADING: 100 state = kUpdatingState; 101 download_progress = status.download_progress; 102 break; 103 case chromeos::UpdateEngineClient::UPDATE_STATUS_VERIFYING: 104 state = kUpdatingState; 105 download_progress = 1; 106 break; 107 case chromeos::UpdateEngineClient::UPDATE_STATUS_FINALIZING: 108 state = kUpdatingState; 109 download_progress = 1; 110 break; 111 case chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT: 112 state = kNeedRestartState; 113 download_progress = 1; 114 break; 115 case chromeos::UpdateEngineClient::UPDATE_STATUS_REPORTING_ERROR_EVENT: 116 state = kNotAvailableState; 117 break; 118 } 119 #else 120 if (UpgradeDetector::GetInstance()->notify_upgrade()) { 121 state = kNeedRestartState; 122 download_progress = 1; 123 } else { 124 state = kNotAvailableState; 125 } 126 #endif 127 base::DictionaryValue* dict = new base::DictionaryValue(); 128 dict->SetString(kStateKey, state); 129 dict->SetDouble(kDownloadProgressKey, download_progress); 130 SetResult(dict); 131 132 return true; 133 } 134 135 void DispatchVolumeChangedEvent(double volume, bool is_volume_muted) { 136 base::DictionaryValue* dict = new base::DictionaryValue(); 137 dict->SetDouble(kVolumeKey, volume); 138 dict->SetBoolean(kIsVolumeMutedKey, is_volume_muted); 139 DispatchEvent(kOnVolumeChanged, dict); 140 } 141 142 void DispatchBrightnessChangedEvent(int brightness, bool user_initiated) { 143 base::DictionaryValue* dict = new base::DictionaryValue(); 144 dict->SetInteger(kBrightnessKey, brightness); 145 dict->SetBoolean(kUserInitiatedKey, user_initiated); 146 DispatchEvent(kOnBrightnessChanged, dict); 147 } 148 149 void DispatchScreenUnlockedEvent() { 150 DispatchEvent(kOnScreenUnlocked, NULL); 151 } 152 153 void DispatchWokeUpEvent() { 154 DispatchEvent(kOnWokeUp, NULL); 155 } 156 157 } // namespace extensions 158