| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "components/offline_pages/background/request_coordinator.h" | 5 #include "components/offline_pages/background/request_coordinator.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 return net::NetworkChangeNotifier::GetConnectionType(); | 200 return net::NetworkChangeNotifier::GetConnectionType(); |
| 201 } | 201 } |
| 202 | 202 |
| 203 void RequestCoordinator::AddRequestResultCallback( | 203 void RequestCoordinator::AddRequestResultCallback( |
| 204 RequestQueue::AddRequestResult result, | 204 RequestQueue::AddRequestResult result, |
| 205 const SavePageRequest& request) { | 205 const SavePageRequest& request) { |
| 206 NotifyAdded(request); | 206 NotifyAdded(request); |
| 207 // Inform the scheduler that we have an outstanding task.. | 207 // Inform the scheduler that we have an outstanding task.. |
| 208 scheduler_->Schedule(GetTriggerConditionsForUserRequest()); | 208 scheduler_->Schedule(GetTriggerConditionsForUserRequest()); |
| 209 | 209 |
| 210 // If it makes sense, start processing now. | 210 if (request.user_requested()) |
| 211 if (is_busy_) return; | 211 StartProcessingIfConnected(); |
| 212 | |
| 213 // Check for network | |
| 214 net::NetworkChangeNotifier::ConnectionType connection = GetConnectionType(); | |
| 215 | |
| 216 if ((connection != | |
| 217 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE) && | |
| 218 request.user_requested()) { | |
| 219 // Create device conditions. | |
| 220 DeviceConditions device_conditions(false, 0, connection); | |
| 221 | |
| 222 // Start processing if it makes sense. (net, user requested) | |
| 223 StartProcessing(device_conditions, base::Bind(&EmptySchedulerCallback)); | |
| 224 } | |
| 225 } | 212 } |
| 226 | 213 |
| 227 // Called in response to updating a request in the request queue. | 214 // Called in response to updating a request in the request queue. |
| 228 void RequestCoordinator::UpdateRequestCallback( | 215 void RequestCoordinator::UpdateRequestCallback( |
| 229 const ClientId& client_id, | 216 const ClientId& client_id, |
| 230 RequestQueue::UpdateRequestResult result) { | 217 RequestQueue::UpdateRequestResult result) { |
| 231 // If the request succeeded, nothing to do. If it failed, we can't really do | 218 // If the request succeeded, nothing to do. If it failed, we can't really do |
| 232 // much, so just log it. | 219 // much, so just log it. |
| 233 if (result != RequestQueue::UpdateRequestResult::SUCCESS) { | 220 if (result != RequestQueue::UpdateRequestResult::SUCCESS) { |
| 234 DVLOG(1) << "Failed to update request attempt details. " | 221 DVLOG(1) << "Failed to update request attempt details. " |
| 235 << static_cast<int>(result); | 222 << static_cast<int>(result); |
| 236 event_logger_.RecordUpdateRequestFailed(client_id.name_space, result); | 223 event_logger_.RecordUpdateRequestFailed(client_id.name_space, result); |
| 237 } | 224 } |
| 238 } | 225 } |
| 239 | 226 |
| 240 // Called in response to updating multiple requests in the request queue. | 227 // Called in response to updating multiple requests in the request queue. |
| 241 void RequestCoordinator::UpdateMultipleRequestsCallback( | 228 void RequestCoordinator::UpdateMultipleRequestsCallback( |
| 242 const RequestQueue::UpdateMultipleRequestResults& results, | 229 const RequestQueue::UpdateMultipleRequestResults& results, |
| 243 const std::vector<SavePageRequest>& requests) { | 230 const std::vector<SavePageRequest>& requests) { |
| 244 for (SavePageRequest request : requests) | 231 bool available_user_request = false; |
| 232 for (SavePageRequest request : requests) { |
| 245 NotifyChanged(request); | 233 NotifyChanged(request); |
| 234 if (!available_user_request && request.user_requested() && |
| 235 request.request_state() == SavePageRequest::RequestState::AVAILABLE) { |
| 236 // TODO(dougarnett): Consider avoiding prospect of N^2 in case |
| 237 // size of bulk requests can get large (perhaps with easier to consume |
| 238 // callback interface). |
| 239 for (std::pair<int64_t, RequestQueue::UpdateRequestResult> pair : |
| 240 results) { |
| 241 if (pair.first == request.request_id() && |
| 242 pair.second == RequestQueue::UpdateRequestResult::SUCCESS) { |
| 243 // We have a successfully updated, available, user request. |
| 244 available_user_request = true; |
| 245 } |
| 246 } |
| 247 } |
| 248 } |
| 249 |
| 250 if (available_user_request) |
| 251 StartProcessingIfConnected(); |
| 246 } | 252 } |
| 247 | 253 |
| 248 void RequestCoordinator::HandleRemovedRequestsAndCallback( | 254 void RequestCoordinator::HandleRemovedRequestsAndCallback( |
| 249 const RemoveRequestsCallback& callback, | 255 const RemoveRequestsCallback& callback, |
| 250 SavePageStatus status, | 256 SavePageStatus status, |
| 251 const RequestQueue::UpdateMultipleRequestResults& results, | 257 const RequestQueue::UpdateMultipleRequestResults& results, |
| 252 const std::vector<SavePageRequest>& requests) { | 258 const std::vector<SavePageRequest>& requests) { |
| 253 callback.Run(results); | 259 callback.Run(results); |
| 254 HandleRemovedRequests(status, results, requests); | 260 HandleRemovedRequests(status, results, requests); |
| 255 } | 261 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 283 operation_start_time_ = base::Time::Now(); | 289 operation_start_time_ = base::Time::Now(); |
| 284 | 290 |
| 285 is_stopped_ = false; | 291 is_stopped_ = false; |
| 286 scheduler_callback_ = callback; | 292 scheduler_callback_ = callback; |
| 287 | 293 |
| 288 TryNextRequest(); | 294 TryNextRequest(); |
| 289 | 295 |
| 290 return true; | 296 return true; |
| 291 } | 297 } |
| 292 | 298 |
| 299 void RequestCoordinator::StartProcessingIfConnected() { |
| 300 // Makes sure not already busy processing. |
| 301 if (is_busy_) return; |
| 302 |
| 303 // Check for network connectivity. |
| 304 net::NetworkChangeNotifier::ConnectionType connection = GetConnectionType(); |
| 305 |
| 306 if ((connection != |
| 307 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE)) { |
| 308 // Create conservative device conditions for the connectivity |
| 309 // (assume no battery). |
| 310 DeviceConditions device_conditions(false, 0, connection); |
| 311 StartProcessing(device_conditions, base::Bind(&EmptySchedulerCallback)); |
| 312 } |
| 313 } |
| 314 |
| 293 void RequestCoordinator::TryNextRequest() { | 315 void RequestCoordinator::TryNextRequest() { |
| 294 // If there is no time left in the budget, return to the scheduler. | 316 // If there is no time left in the budget, return to the scheduler. |
| 295 // We do not remove the pending task that was set up earlier in case | 317 // We do not remove the pending task that was set up earlier in case |
| 296 // we run out of time, so the background scheduler will return to us | 318 // we run out of time, so the background scheduler will return to us |
| 297 // at the next opportunity to run background tasks. | 319 // at the next opportunity to run background tasks. |
| 298 if (base::Time::Now() - operation_start_time_ > | 320 if (base::Time::Now() - operation_start_time_ > |
| 299 base::TimeDelta::FromSeconds( | 321 base::TimeDelta::FromSeconds( |
| 300 policy_->GetBackgroundProcessingTimeBudgetSeconds())) { | 322 policy_->GetBackgroundProcessingTimeBudgetSeconds())) { |
| 301 // Let the scheduler know we are done processing. | 323 // Let the scheduler know we are done processing. |
| 302 scheduler_callback_.Run(true); | 324 scheduler_callback_.Run(true); |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 FOR_EACH_OBSERVER(Observer, observers_, OnChanged(request)); | 505 FOR_EACH_OBSERVER(Observer, observers_, OnChanged(request)); |
| 484 } | 506 } |
| 485 | 507 |
| 486 void RequestCoordinator::GetOffliner() { | 508 void RequestCoordinator::GetOffliner() { |
| 487 if (!offliner_) { | 509 if (!offliner_) { |
| 488 offliner_ = factory_->GetOffliner(policy_.get()); | 510 offliner_ = factory_->GetOffliner(policy_.get()); |
| 489 } | 511 } |
| 490 } | 512 } |
| 491 | 513 |
| 492 } // namespace offline_pages | 514 } // namespace offline_pages |
| OLD | NEW |