Index: chrome/browser/extensions/system/system_api.cc |
diff --git a/chrome/browser/extensions/system/system_api.cc b/chrome/browser/extensions/system/system_api.cc |
index 719adeb860c55e897dff6a5655601375230c3dfb..1704523733bf279a8519a36cfdf9799d989567fb 100644 |
--- a/chrome/browser/extensions/system/system_api.cc |
+++ b/chrome/browser/extensions/system/system_api.cc |
@@ -9,6 +9,13 @@ |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/common/pref_names.h" |
+#if defined(OS_CHROMEOS) |
+#include "chrome/browser/chromeos/dbus/dbus_thread_manager.h" |
+#include "chrome/browser/chromeos/dbus/update_engine_client.h" |
+#else |
+#include "chrome/browser/upgrade_detector.h" |
+#endif |
+ |
namespace { |
// Maps prefs::kIncognitoModeAvailability values (0 = enabled, ...) |
@@ -19,13 +26,19 @@ const char* kIncognitoModeAvailabilityStrings[] = { |
"forced" |
}; |
+// Property keys. |
+const char kStateKey[] = "state"; |
+const char kDownloadProgressKey[] = "download_progress"; |
+ |
+// System update states. |
+const char kNotAvailableState[] = "NotAvailable"; |
+const char kUpdatingState[] = "Updating"; |
+const char kNeedRestartState[] = "NeedRestart"; |
+ |
} // namespace |
namespace extensions { |
-GetIncognitoModeAvailabilityFunction::~GetIncognitoModeAvailabilityFunction() { |
-} |
- |
bool GetIncognitoModeAvailabilityFunction::RunImpl() { |
PrefService* prefs = profile_->GetPrefs(); |
int value = prefs->GetInteger(prefs::kIncognitoModeAvailability); |
@@ -37,4 +50,65 @@ bool GetIncognitoModeAvailabilityFunction::RunImpl() { |
return true; |
} |
+bool GetUpdateStatusFunction::RunImpl() { |
+ std::string state; |
+ double download_progress = 0; |
+#if defined(OS_CHROMEOS) |
+ // With UpdateEngineClient, we can provide more detailed information about |
+ // system updates on ChromeOS. |
+ const chromeos::UpdateEngineClient::Status status = |
+ chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()-> |
+ GetLastStatus(); |
+ // |download_progress| is set to 1 after download finishes |
+ // (i.e. verify, finalize and need-reboot phase) to indicate the progress |
+ // even though |status.download_progress| is 0 in these phases. |
+ switch (status.status) { |
+ case chromeos::UpdateEngineClient::UPDATE_STATUS_ERROR: |
+ state = kNotAvailableState; |
+ break; |
+ case chromeos::UpdateEngineClient::UPDATE_STATUS_IDLE: |
+ state = kNotAvailableState; |
+ break; |
+ case chromeos::UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE: |
+ state = kNotAvailableState; |
+ break; |
+ case chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE: |
+ state = kUpdatingState; |
+ break; |
+ case chromeos::UpdateEngineClient::UPDATE_STATUS_DOWNLOADING: |
+ state = kUpdatingState; |
+ download_progress = status.download_progress; |
+ break; |
+ case chromeos::UpdateEngineClient::UPDATE_STATUS_VERIFYING: |
+ state = kUpdatingState; |
+ download_progress = 1; |
+ break; |
+ case chromeos::UpdateEngineClient::UPDATE_STATUS_FINALIZING: |
+ state = kUpdatingState; |
+ download_progress = 1; |
+ break; |
+ case chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT: |
+ state = kNeedRestartState; |
+ download_progress = 1; |
+ break; |
+ case chromeos::UpdateEngineClient::UPDATE_STATUS_REPORTING_ERROR_EVENT: |
+ state = kNotAvailableState; |
+ break; |
+ } |
+#else |
+ if (UpgradeDetector::GetInstance()->notify_upgrade()) { |
+ state = kNeedRestartState; |
+ download_progress = 1; |
+ } else { |
+ state = kNotAvailableState; |
+ } |
+#endif |
+ DictionaryValue* dict = new DictionaryValue(); |
+ dict->SetString(kStateKey, state); |
+ dict->SetDouble(kDownloadProgressKey, download_progress); |
+ result_.reset(dict); |
+ |
+ return true; |
+} |
+ |
} // namespace extensions |