Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/webui/help/version_updater_chromeos.h" | 5 #include "chrome/browser/ui/webui/help/version_updater_chromeos.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 11 #include "base/strings/string_number_conversions.h" | |
| 11 #include "chrome/browser/browser_process.h" | 12 #include "chrome/browser/browser_process.h" |
| 12 #include "chrome/browser/chromeos/login/startup_utils.h" | 13 #include "chrome/browser/chromeos/login/startup_utils.h" |
| 13 #include "chrome/browser/chromeos/login/wizard_controller.h" | 14 #include "chrome/browser/chromeos/login/wizard_controller.h" |
| 14 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" | 15 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" |
| 15 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_fact ory.h" | 16 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_fact ory.h" |
| 16 #include "chrome/browser/chromeos/settings/cros_settings.h" | 17 #include "chrome/browser/chromeos/settings/cros_settings.h" |
| 17 #include "chrome/browser/ui/webui/help/help_utils_chromeos.h" | 18 #include "chrome/browser/ui/webui/help/help_utils_chromeos.h" |
| 18 #include "chrome/grit/generated_resources.h" | 19 #include "chrome/grit/generated_resources.h" |
| 19 #include "chromeos/dbus/dbus_thread_manager.h" | 20 #include "chromeos/dbus/dbus_thread_manager.h" |
| 20 #include "chromeos/dbus/power_manager_client.h" | 21 #include "chromeos/dbus/power_manager_client.h" |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 42 NETWORK_STATUS_DISALLOWED, | 43 NETWORK_STATUS_DISALLOWED, |
| 43 // Device is in offline state. | 44 // Device is in offline state. |
| 44 NETWORK_STATUS_OFFLINE | 45 NETWORK_STATUS_OFFLINE |
| 45 }; | 46 }; |
| 46 | 47 |
| 47 const bool kDefaultAutoUpdateDisabled = false; | 48 const bool kDefaultAutoUpdateDisabled = false; |
| 48 | 49 |
| 49 NetworkStatus GetNetworkStatus(const chromeos::NetworkState* network) { | 50 NetworkStatus GetNetworkStatus(const chromeos::NetworkState* network) { |
| 50 if (!network || !network->IsConnectedState()) // Offline state. | 51 if (!network || !network->IsConnectedState()) // Offline state. |
| 51 return NETWORK_STATUS_OFFLINE; | 52 return NETWORK_STATUS_OFFLINE; |
| 52 | |
| 53 // The connection type checking strategy must be the same as the one | 53 // The connection type checking strategy must be the same as the one |
| 54 // used in update engine. | 54 // used in update engine. |
| 55 if (network->type() == shill::kTypeBluetooth) | 55 if (network->type() == shill::kTypeBluetooth) |
| 56 return NETWORK_STATUS_DISALLOWED; | 56 return NETWORK_STATUS_DISALLOWED; |
| 57 if (network->type() == shill::kTypeCellular && | 57 // Allow updates over cellular by default in chrome, as update engine still |
| 58 !help_utils_chromeos::IsUpdateOverCellularAllowed()) { | 58 // need to check device policy and user preferences during checking for update |
| 59 return NETWORK_STATUS_DISALLOWED; | 59 // to decide whether to proceed to downloading. |
| 60 } | |
| 61 return NETWORK_STATUS_ALLOWED; | 60 return NETWORK_STATUS_ALLOWED; |
| 62 } | 61 } |
| 63 | 62 |
| 64 // Returns true if auto-update is disabled by the system administrator. | 63 // Returns true if auto-update is disabled by the system administrator. |
| 65 bool IsAutoUpdateDisabled() { | 64 bool IsAutoUpdateDisabled() { |
| 66 bool update_disabled = kDefaultAutoUpdateDisabled; | 65 bool update_disabled = kDefaultAutoUpdateDisabled; |
| 67 chromeos::CrosSettings* settings = chromeos::CrosSettings::Get(); | 66 chromeos::CrosSettings* settings = chromeos::CrosSettings::Get(); |
| 68 if (!settings) | 67 if (!settings) |
| 69 return update_disabled; | 68 return update_disabled; |
| 70 const base::Value* update_disabled_value = | 69 const base::Value* update_disabled_value = |
| 71 settings->GetPref(chromeos::kUpdateDisabled); | 70 settings->GetPref(chromeos::kUpdateDisabled); |
| 72 if (update_disabled_value) | 71 if (update_disabled_value) |
| 73 CHECK(update_disabled_value->GetAsBoolean(&update_disabled)); | 72 CHECK(update_disabled_value->GetAsBoolean(&update_disabled)); |
| 74 return update_disabled; | 73 return update_disabled; |
| 75 } | 74 } |
| 76 | 75 |
| 77 // Returns whether an update is allowed. If not, it calls the callback with | 76 // Returns whether an update is allowed. If not, it calls the callback with |
| 78 // the appropriate status. | 77 // the appropriate status. |
| 79 bool EnsureCanUpdate(const VersionUpdater::StatusCallback& callback) { | 78 bool EnsureCanUpdate(const VersionUpdater::StatusCallback& callback) { |
| 80 if (IsAutoUpdateDisabled()) { | 79 if (IsAutoUpdateDisabled()) { |
| 81 callback.Run(VersionUpdater::DISABLED_BY_ADMIN, 0, | 80 callback.Run(VersionUpdater::DISABLED_BY_ADMIN, 0, std::string(), 0, |
| 82 l10n_util::GetStringUTF16(IDS_UPGRADE_DISABLED_BY_POLICY)); | 81 l10n_util::GetStringUTF16(IDS_UPGRADE_DISABLED_BY_POLICY)); |
| 83 return false; | 82 return false; |
| 84 } | 83 } |
| 85 | 84 |
| 86 chromeos::NetworkStateHandler* network_state_handler = | 85 chromeos::NetworkStateHandler* network_state_handler = |
| 87 chromeos::NetworkHandler::Get()->network_state_handler(); | 86 chromeos::NetworkHandler::Get()->network_state_handler(); |
| 88 const chromeos::NetworkState* network = | 87 const chromeos::NetworkState* network = |
| 89 network_state_handler->DefaultNetwork(); | 88 network_state_handler->DefaultNetwork(); |
| 90 | 89 |
| 91 // Don't allow an update if we're currently offline or connected | 90 // Don't allow an update if we're currently offline or connected |
| 92 // to a network for which updates are disallowed. | 91 // to a network for which updates are disallowed. |
| 93 NetworkStatus status = GetNetworkStatus(network); | 92 NetworkStatus status = GetNetworkStatus(network); |
| 94 if (status == NETWORK_STATUS_OFFLINE) { | 93 if (status == NETWORK_STATUS_OFFLINE) { |
| 95 callback.Run(VersionUpdater::FAILED_OFFLINE, 0, | 94 callback.Run(VersionUpdater::FAILED_OFFLINE, 0, std::string(), 0, |
| 96 l10n_util::GetStringUTF16(IDS_UPGRADE_OFFLINE)); | 95 l10n_util::GetStringUTF16(IDS_UPGRADE_OFFLINE)); |
| 97 return false; | 96 return false; |
| 98 } else if (status == NETWORK_STATUS_DISALLOWED) { | 97 } else if (status == NETWORK_STATUS_DISALLOWED) { |
| 99 base::string16 message = | 98 base::string16 message = |
| 100 l10n_util::GetStringFUTF16( | 99 l10n_util::GetStringFUTF16( |
| 101 IDS_UPGRADE_DISALLOWED, | 100 IDS_UPGRADE_DISALLOWED, |
| 102 help_utils_chromeos::GetConnectionTypeAsUTF16(network->type())); | 101 help_utils_chromeos::GetConnectionTypeAsUTF16(network->type())); |
| 103 callback.Run(VersionUpdater::FAILED_CONNECTION_TYPE_DISALLOWED, 0, message); | 102 callback.Run(VersionUpdater::FAILED_CONNECTION_TYPE_DISALLOWED, 0, |
| 103 std::string(), 0, message); | |
| 104 return false; | 104 return false; |
| 105 } | 105 } |
| 106 | 106 |
| 107 return true; | 107 return true; |
| 108 } | 108 } |
| 109 | 109 |
| 110 } // namespace | 110 } // namespace |
| 111 | 111 |
| 112 VersionUpdater* VersionUpdater::Create(content::WebContents* web_contents) { | 112 VersionUpdater* VersionUpdater::Create(content::WebContents* web_contents) { |
| 113 return new VersionUpdaterCros(web_contents); | 113 return new VersionUpdaterCros(web_contents); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 162 ? OwnerSettingsServiceChromeOSFactory::GetInstance() | 162 ? OwnerSettingsServiceChromeOSFactory::GetInstance() |
| 163 ->GetForBrowserContext(context_) | 163 ->GetForBrowserContext(context_) |
| 164 : nullptr; | 164 : nullptr; |
| 165 // For local owner set the field in the policy blob. | 165 // For local owner set the field in the policy blob. |
| 166 if (service) | 166 if (service) |
| 167 service->SetString(chromeos::kReleaseChannel, channel); | 167 service->SetString(chromeos::kReleaseChannel, channel); |
| 168 DBusThreadManager::Get()->GetUpdateEngineClient()-> | 168 DBusThreadManager::Get()->GetUpdateEngineClient()-> |
| 169 SetChannel(channel, is_powerwash_allowed); | 169 SetChannel(channel, is_powerwash_allowed); |
| 170 } | 170 } |
| 171 | 171 |
| 172 void VersionUpdaterCros::SetUpdateOverCellularTarget( | |
| 173 const StatusCallback& callback, | |
| 174 const std::string& target_version, | |
| 175 int64_t target_size) { | |
| 176 callback_ = callback; | |
| 177 DBusThreadManager::Get() | |
| 178 ->GetUpdateEngineClient() | |
| 179 ->SetUpdateOverCellularTarget( | |
| 180 target_version, target_size, | |
| 181 base::Bind(&VersionUpdaterCros::OnSetUpdateOverCellularTarget, | |
| 182 weak_ptr_factory_.GetWeakPtr())); | |
| 183 } | |
| 184 | |
| 185 void VersionUpdaterCros::OnSetUpdateOverCellularTarget(bool success) { | |
| 186 if (success) | |
| 187 // Target is set successfully, so we can proceed to update. | |
| 188 CheckForUpdate(callback_, VersionUpdater::PromoteCallback()); | |
| 189 else | |
| 190 // TODO(weidongg/691108): invoke callback to signal about page to show | |
| 191 // appropriate error message. | |
| 192 LOG(ERROR) << "Error setting update over cellular target."; | |
|
stevenjb
2017/05/10 23:29:05
{}
weidongg
2017/05/11 16:34:06
Done.
| |
| 193 } | |
| 194 | |
| 172 void VersionUpdaterCros::GetChannel(bool get_current_channel, | 195 void VersionUpdaterCros::GetChannel(bool get_current_channel, |
| 173 const ChannelCallback& cb) { | 196 const ChannelCallback& cb) { |
| 174 UpdateEngineClient* update_engine_client = | 197 UpdateEngineClient* update_engine_client = |
| 175 DBusThreadManager::Get()->GetUpdateEngineClient(); | 198 DBusThreadManager::Get()->GetUpdateEngineClient(); |
| 176 | 199 |
| 177 // Request the channel information. Bind to a weak_ptr bound method rather | 200 // Request the channel information. Bind to a weak_ptr bound method rather |
| 178 // than passing |cb| directly so that |cb| does not outlive |this|. | 201 // than passing |cb| directly so that |cb| does not outlive |this|. |
| 179 update_engine_client->GetChannel( | 202 update_engine_client->GetChannel( |
| 180 get_current_channel, base::Bind(&VersionUpdaterCros::OnGetChannel, | 203 get_current_channel, base::Bind(&VersionUpdaterCros::OnGetChannel, |
| 181 weak_ptr_factory_.GetWeakPtr(), cb)); | 204 weak_ptr_factory_.GetWeakPtr(), cb)); |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 211 VersionUpdaterCros::~VersionUpdaterCros() { | 234 VersionUpdaterCros::~VersionUpdaterCros() { |
| 212 UpdateEngineClient* update_engine_client = | 235 UpdateEngineClient* update_engine_client = |
| 213 DBusThreadManager::Get()->GetUpdateEngineClient(); | 236 DBusThreadManager::Get()->GetUpdateEngineClient(); |
| 214 update_engine_client->RemoveObserver(this); | 237 update_engine_client->RemoveObserver(this); |
| 215 } | 238 } |
| 216 | 239 |
| 217 void VersionUpdaterCros::UpdateStatusChanged( | 240 void VersionUpdaterCros::UpdateStatusChanged( |
| 218 const UpdateEngineClient::Status& status) { | 241 const UpdateEngineClient::Status& status) { |
| 219 Status my_status = UPDATED; | 242 Status my_status = UPDATED; |
| 220 int progress = 0; | 243 int progress = 0; |
| 244 std::string version = status.new_version; | |
| 245 int64_t size = status.new_size; | |
| 221 base::string16 message; | 246 base::string16 message; |
| 222 | 247 |
| 223 // If the updater is currently idle, just show the last operation (unless it | 248 // If the updater is currently idle, just show the last operation (unless it |
| 224 // was previously checking for an update -- in that case, the system is | 249 // was previously checking for an update -- in that case, the system is |
| 225 // up to date now). See http://crbug.com/120063 for details. | 250 // up to date now). See http://crbug.com/120063 for details. |
| 226 UpdateEngineClient::UpdateStatusOperation operation_to_show = status.status; | 251 UpdateEngineClient::UpdateStatusOperation operation_to_show = status.status; |
| 227 if (status.status == UpdateEngineClient::UPDATE_STATUS_IDLE && | 252 if (status.status == UpdateEngineClient::UPDATE_STATUS_IDLE && |
| 228 last_operation_ != | 253 last_operation_ != |
| 229 UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE) { | 254 UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE) { |
| 230 operation_to_show = last_operation_; | 255 operation_to_show = last_operation_; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 241 break; | 266 break; |
| 242 case UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE: | 267 case UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE: |
| 243 my_status = CHECKING; | 268 my_status = CHECKING; |
| 244 break; | 269 break; |
| 245 case UpdateEngineClient::UPDATE_STATUS_DOWNLOADING: | 270 case UpdateEngineClient::UPDATE_STATUS_DOWNLOADING: |
| 246 progress = static_cast<int>(round(status.download_progress * 100)); | 271 progress = static_cast<int>(round(status.download_progress * 100)); |
| 247 // Fall through. | 272 // Fall through. |
| 248 case UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE: | 273 case UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE: |
| 249 my_status = UPDATING; | 274 my_status = UPDATING; |
| 250 break; | 275 break; |
| 276 case UpdateEngineClient::UPDATE_STATUS_NEED_PERMISSION_TO_UPDATE: | |
| 277 my_status = NEED_PERMISSION_TO_UPDATE; | |
| 278 message = base::Int64ToString16(status.new_size); | |
| 279 break; | |
| 251 case UpdateEngineClient::UPDATE_STATUS_VERIFYING: | 280 case UpdateEngineClient::UPDATE_STATUS_VERIFYING: |
| 252 case UpdateEngineClient::UPDATE_STATUS_FINALIZING: | 281 case UpdateEngineClient::UPDATE_STATUS_FINALIZING: |
| 253 // Once the download is finished, keep the progress at 100; it shouldn't | 282 // Once the download is finished, keep the progress at 100; it shouldn't |
| 254 // go down while the status is the same. | 283 // go down while the status is the same. |
| 255 progress = 100; | 284 progress = 100; |
| 256 my_status = UPDATING; | 285 my_status = UPDATING; |
| 257 break; | 286 break; |
| 258 case UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT: | 287 case UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT: |
| 259 my_status = NEARLY_UPDATED; | 288 my_status = NEARLY_UPDATED; |
| 260 break; | 289 break; |
| 261 default: | 290 default: |
| 262 break; | 291 break; |
| 263 } | 292 } |
| 264 | 293 |
| 265 callback_.Run(my_status, progress, message); | 294 callback_.Run(my_status, progress, version, size, message); |
| 266 last_operation_ = status.status; | 295 last_operation_ = status.status; |
| 267 | 296 |
| 268 if (check_for_update_when_idle_ && | 297 if (check_for_update_when_idle_ && |
| 269 status.status == UpdateEngineClient::UPDATE_STATUS_IDLE) { | 298 status.status == UpdateEngineClient::UPDATE_STATUS_IDLE) { |
| 270 CheckForUpdate(callback_, VersionUpdater::PromoteCallback()); | 299 CheckForUpdate(callback_, VersionUpdater::PromoteCallback()); |
| 271 } | 300 } |
| 272 } | 301 } |
| 273 | 302 |
| 274 void VersionUpdaterCros::OnUpdateCheck( | 303 void VersionUpdaterCros::OnUpdateCheck( |
| 275 UpdateEngineClient::UpdateCheckResult result) { | 304 UpdateEngineClient::UpdateCheckResult result) { |
| 276 // If version updating is not implemented, this binary is the most up-to-date | 305 // If version updating is not implemented, this binary is the most up-to-date |
| 277 // possible with respect to automatic updating. | 306 // possible with respect to automatic updating. |
| 278 if (result == UpdateEngineClient::UPDATE_RESULT_NOTIMPLEMENTED) | 307 if (result == UpdateEngineClient::UPDATE_RESULT_NOTIMPLEMENTED) |
| 279 callback_.Run(UPDATED, 0, base::string16()); | 308 callback_.Run(UPDATED, 0, std::string(), 0, base::string16()); |
| 280 } | 309 } |
| OLD | NEW |