Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 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/chromeos/policy/heartbeat_scheduler.h" | 5 #include "chrome/browser/chromeos/policy/heartbeat_scheduler.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | |
| 10 #include "base/bind_helpers.h" | |
| 9 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 10 #include "base/location.h" | 12 #include "base/location.h" |
| 11 #include "base/sequenced_task_runner.h" | 13 #include "base/sequenced_task_runner.h" |
| 12 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/time/time.h" | 15 #include "base/time/time.h" |
| 14 #include "chrome/common/chrome_switches.h" | 16 #include "chrome/common/chrome_switches.h" |
| 15 #include "components/gcm_driver/gcm_driver.h" | 17 #include "components/gcm_driver/gcm_driver.h" |
| 16 | 18 |
| 17 namespace { | 19 namespace { |
| 18 const int kMinHeartbeatIntervalMs = 30 * 1000; // 30 seconds | 20 const int kMinHeartbeatIntervalMs = 30 * 1000; // 30 seconds |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 153 case gcm::GCMClient::ASYNC_OPERATION_PENDING: | 155 case gcm::GCMClient::ASYNC_OPERATION_PENDING: |
| 154 case gcm::GCMClient::TTL_EXCEEDED: | 156 case gcm::GCMClient::TTL_EXCEEDED: |
| 155 default: | 157 default: |
| 156 NOTREACHED() << "Unexpected GCMDriver::Register() result: " << result; | 158 NOTREACHED() << "Unexpected GCMDriver::Register() result: " << result; |
| 157 break; | 159 break; |
| 158 } | 160 } |
| 159 } | 161 } |
| 160 | 162 |
| 161 HeartbeatScheduler::HeartbeatScheduler( | 163 HeartbeatScheduler::HeartbeatScheduler( |
| 162 gcm::GCMDriver* driver, | 164 gcm::GCMDriver* driver, |
| 165 policy::CloudPolicyClient* cloud_policy_client, | |
| 163 const std::string& enrollment_domain, | 166 const std::string& enrollment_domain, |
| 164 const std::string& device_id, | 167 const std::string& device_id, |
| 165 const scoped_refptr<base::SequencedTaskRunner>& task_runner) | 168 const scoped_refptr<base::SequencedTaskRunner>& task_runner) |
| 166 : task_runner_(task_runner), | 169 : task_runner_(task_runner), |
| 167 enrollment_domain_(enrollment_domain), | 170 enrollment_domain_(enrollment_domain), |
| 168 device_id_(device_id), | 171 device_id_(device_id), |
| 169 heartbeat_enabled_(false), | 172 heartbeat_enabled_(false), |
| 170 heartbeat_interval_(base::TimeDelta::FromMilliseconds( | 173 heartbeat_interval_( |
| 171 kDefaultHeartbeatIntervalMs)), | 174 base::TimeDelta::FromMilliseconds(kDefaultHeartbeatIntervalMs)), |
| 175 cloud_policy_client_(cloud_policy_client), | |
| 172 gcm_driver_(driver), | 176 gcm_driver_(driver), |
| 173 weak_factory_(this) { | 177 weak_factory_(this) { |
| 174 // If no GCMDriver (e.g. this is loaded as part of an unrelated unit test) | 178 // If no GCMDriver (e.g. this is loaded as part of an unrelated unit test) |
| 175 // do nothing as no heartbeats can be sent. | 179 // do nothing as no heartbeats can be sent. |
| 176 if (!gcm_driver_) | 180 if (!gcm_driver_) |
| 177 return; | 181 return; |
| 178 | 182 |
| 179 heartbeat_frequency_observer_ = | 183 heartbeat_frequency_observer_ = |
| 180 chromeos::CrosSettings::Get()->AddSettingsObserver( | 184 chromeos::CrosSettings::Get()->AddSettingsObserver( |
| 181 chromeos::kHeartbeatFrequency, | 185 chromeos::kHeartbeatFrequency, |
| 182 base::Bind(&HeartbeatScheduler::RefreshHeartbeatSettings, | 186 base::Bind(&HeartbeatScheduler::RefreshHeartbeatSettings, |
| 183 base::Unretained(this))); | 187 base::Unretained(this))); |
| 184 | 188 |
| 185 heartbeat_enabled_observer_ = | 189 heartbeat_enabled_observer_ = |
| 186 chromeos::CrosSettings::Get()->AddSettingsObserver( | 190 chromeos::CrosSettings::Get()->AddSettingsObserver( |
| 187 chromeos::kHeartbeatEnabled, | 191 chromeos::kHeartbeatEnabled, |
| 188 base::Bind(&HeartbeatScheduler::RefreshHeartbeatSettings, | 192 base::Bind(&HeartbeatScheduler::RefreshHeartbeatSettings, |
| 189 base::Unretained(this))); | 193 base::Unretained(this))); |
| 190 | 194 |
| 191 // Update the heartbeat frequency from settings. This will trigger a | 195 // Update the heartbeat frequency from settings. This will trigger a |
| 192 // heartbeat as appropriate once the settings have been refreshed. | 196 // heartbeat as appropriate once the settings have been refreshed. |
| 193 RefreshHeartbeatSettings(); | 197 RefreshHeartbeatSettings(); |
| 194 } | 198 } |
| 195 | 199 |
| 200 void HeartbeatScheduler::SetCloudPolicyClientForTesting( | |
| 201 policy::CloudPolicyClient* client) { | |
| 202 cloud_policy_client_ = client; | |
| 203 } | |
| 204 | |
| 196 void HeartbeatScheduler::RefreshHeartbeatSettings() { | 205 void HeartbeatScheduler::RefreshHeartbeatSettings() { |
| 197 // Attempt to fetch the current value of the reporting settings. | 206 // Attempt to fetch the current value of the reporting settings. |
| 198 // If trusted values are not available, register this function to be called | 207 // If trusted values are not available, register this function to be called |
| 199 // back when they are available. | 208 // back when they are available. |
| 200 chromeos::CrosSettings* settings = chromeos::CrosSettings::Get(); | 209 chromeos::CrosSettings* settings = chromeos::CrosSettings::Get(); |
| 201 if (chromeos::CrosSettingsProvider::TRUSTED != settings->PrepareTrustedValues( | 210 if (chromeos::CrosSettingsProvider::TRUSTED != settings->PrepareTrustedValues( |
| 202 base::Bind(&HeartbeatScheduler::RefreshHeartbeatSettings, | 211 base::Bind(&HeartbeatScheduler::RefreshHeartbeatSettings, |
| 203 weak_factory_.GetWeakPtr()))) { | 212 weak_factory_.GetWeakPtr()))) { |
| 204 return; | 213 return; |
| 205 } | 214 } |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 290 task_runner_->PostDelayedTask( | 299 task_runner_->PostDelayedTask( |
| 291 FROM_HERE, heartbeat_callback_.callback(), delay); | 300 FROM_HERE, heartbeat_callback_.callback(), delay); |
| 292 } | 301 } |
| 293 | 302 |
| 294 void HeartbeatScheduler::OnRegistrationComplete( | 303 void HeartbeatScheduler::OnRegistrationComplete( |
| 295 const std::string& registration_id) { | 304 const std::string& registration_id) { |
| 296 DCHECK(!registration_id.empty()); | 305 DCHECK(!registration_id.empty()); |
| 297 registration_helper_.reset(); | 306 registration_helper_.reset(); |
| 298 registration_id_ = registration_id; | 307 registration_id_ = registration_id; |
| 299 | 308 |
| 309 if (cloud_policy_client_) { | |
| 310 // TODO(binjin): Avoid sending the same GCM id to the server. | |
| 311 // See http://crbug.com/516375 | |
| 312 cloud_policy_client_->UpdateGcmIdMapping( | |
| 313 registration_id, | |
| 314 base::Bind(&HeartbeatScheduler::OnGcmIdMappingRequestSent, | |
| 315 weak_factory_.GetWeakPtr())); | |
| 316 } | |
| 317 | |
| 300 // Now that GCM registration is complete, start sending heartbeats. | 318 // Now that GCM registration is complete, start sending heartbeats. |
| 301 ScheduleNextHeartbeat(); | 319 ScheduleNextHeartbeat(); |
| 302 } | 320 } |
| 303 | 321 |
| 304 void HeartbeatScheduler::SendHeartbeat() { | 322 void HeartbeatScheduler::SendHeartbeat() { |
| 305 DCHECK(!registration_id_.empty()); | 323 DCHECK(!registration_id_.empty()); |
| 306 if (!gcm_driver_ || !heartbeat_enabled_) | 324 if (!gcm_driver_ || !heartbeat_enabled_) |
| 307 return; | 325 return; |
| 308 | 326 |
| 309 gcm::OutgoingMessage message; | 327 gcm::OutgoingMessage message; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 365 const std::string& app_id, | 383 const std::string& app_id, |
| 366 const gcm::GCMClient::SendErrorDetails& details) { | 384 const gcm::GCMClient::SendErrorDetails& details) { |
| 367 // Ignore send errors - we already are notified above in OnHeartbeatSent(). | 385 // Ignore send errors - we already are notified above in OnHeartbeatSent(). |
| 368 } | 386 } |
| 369 | 387 |
| 370 void HeartbeatScheduler::OnSendAcknowledged(const std::string& app_id, | 388 void HeartbeatScheduler::OnSendAcknowledged(const std::string& app_id, |
| 371 const std::string& message_id) { | 389 const std::string& message_id) { |
| 372 DVLOG(1) << "Heartbeat sent with message_id: " << message_id; | 390 DVLOG(1) << "Heartbeat sent with message_id: " << message_id; |
| 373 } | 391 } |
| 374 | 392 |
| 393 void HeartbeatScheduler::OnGcmIdMappingRequestSent(bool status) { | |
|
Andrew T Wilson (Slow)
2015/08/06 09:40:02
nit: rename status -> success to make it clear tha
binjin
2015/08/06 10:19:15
Done.
| |
| 394 // TODO(binjin): Handle the failure, probably by exponential backoff. | |
| 395 LOG_IF(WARNING, !status) << "Failed to send GCM id to DM server"; | |
| 396 } | |
| 397 | |
| 375 } // namespace policy | 398 } // namespace policy |
| OLD | NEW |