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