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 for (std::pair<int64_t, RequestQueue::UpdateRequestResult> pair : | |
237 results) { | |
Pete Williamson
2016/08/26 21:23:55
What if we resume a large batch of results? If so
dougarnett
2016/08/26 21:40:51
Yeah, bulk Pause looks like N^2 - bulk Resume does
| |
238 if (pair.first == request.request_id() && | |
239 pair.second == RequestQueue::UpdateRequestResult::SUCCESS) { | |
240 // We have a successfully updated, available, user request. | |
241 available_user_request = true; | |
Dmitry Titov
2016/08/26 21:46:57
+1 to what Pete says, we could load all request_id
dougarnett
2016/08/26 22:33:44
I added a TODO for the moment to flag the topic in
Pete Williamson
2016/08/26 23:38:02
It's really pretty easy. I think I'd prefer to fi
Pete Williamson
2016/08/26 23:48:59
DougArnett pointed out that the UI only supports p
| |
242 } | |
243 } | |
244 } | |
245 } | |
246 | |
247 if (available_user_request) | |
248 StartProcessingIfConnected(); | |
246 } | 249 } |
247 | 250 |
248 void RequestCoordinator::HandleRemovedRequestsAndCallback( | 251 void RequestCoordinator::HandleRemovedRequestsAndCallback( |
249 const RemoveRequestsCallback& callback, | 252 const RemoveRequestsCallback& callback, |
250 SavePageStatus status, | 253 SavePageStatus status, |
251 const RequestQueue::UpdateMultipleRequestResults& results, | 254 const RequestQueue::UpdateMultipleRequestResults& results, |
252 const std::vector<SavePageRequest>& requests) { | 255 const std::vector<SavePageRequest>& requests) { |
253 callback.Run(results); | 256 callback.Run(results); |
254 HandleRemovedRequests(status, results, requests); | 257 HandleRemovedRequests(status, results, requests); |
255 } | 258 } |
(...skipping 27 matching lines...) Expand all Loading... | |
283 operation_start_time_ = base::Time::Now(); | 286 operation_start_time_ = base::Time::Now(); |
284 | 287 |
285 is_stopped_ = false; | 288 is_stopped_ = false; |
286 scheduler_callback_ = callback; | 289 scheduler_callback_ = callback; |
287 | 290 |
288 TryNextRequest(); | 291 TryNextRequest(); |
289 | 292 |
290 return true; | 293 return true; |
291 } | 294 } |
292 | 295 |
296 void RequestCoordinator::StartProcessingIfConnected() { | |
297 // Makes sure not already busy processing. | |
298 if (is_busy_) return; | |
299 | |
300 // Check for network connectivity. | |
301 net::NetworkChangeNotifier::ConnectionType connection = GetConnectionType(); | |
302 | |
303 if ((connection != | |
304 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE)) { | |
305 // Create conservative device conditions for the connectivity | |
306 // (assume no battery). | |
307 DeviceConditions device_conditions(false, 0, connection); | |
308 StartProcessing(device_conditions, base::Bind(&EmptySchedulerCallback)); | |
309 } | |
310 } | |
311 | |
293 void RequestCoordinator::TryNextRequest() { | 312 void RequestCoordinator::TryNextRequest() { |
294 // If there is no time left in the budget, return to the scheduler. | 313 // 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 | 314 // 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 | 315 // we run out of time, so the background scheduler will return to us |
297 // at the next opportunity to run background tasks. | 316 // at the next opportunity to run background tasks. |
298 if (base::Time::Now() - operation_start_time_ > | 317 if (base::Time::Now() - operation_start_time_ > |
299 base::TimeDelta::FromSeconds( | 318 base::TimeDelta::FromSeconds( |
300 policy_->GetBackgroundProcessingTimeBudgetSeconds())) { | 319 policy_->GetBackgroundProcessingTimeBudgetSeconds())) { |
301 // Let the scheduler know we are done processing. | 320 // Let the scheduler know we are done processing. |
302 scheduler_callback_.Run(true); | 321 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)); | 502 FOR_EACH_OBSERVER(Observer, observers_, OnChanged(request)); |
484 } | 503 } |
485 | 504 |
486 void RequestCoordinator::GetOffliner() { | 505 void RequestCoordinator::GetOffliner() { |
487 if (!offliner_) { | 506 if (!offliner_) { |
488 offliner_ = factory_->GetOffliner(policy_.get()); | 507 offliner_ = factory_->GetOffliner(policy_.get()); |
489 } | 508 } |
490 } | 509 } |
491 | 510 |
492 } // namespace offline_pages | 511 } // namespace offline_pages |
OLD | NEW |