Chromium Code Reviews| 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 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 123 // Get all matching requests from the request queue, send them to our | 123 // Get all matching requests from the request queue, send them to our |
| 124 // callback. We bind the namespace and callback to the front of the callback | 124 // callback. We bind the namespace and callback to the front of the callback |
| 125 // param set. | 125 // param set. |
| 126 queue_->GetRequests(base::Bind(&RequestCoordinator::GetQueuedRequestsCallback, | 126 queue_->GetRequests(base::Bind(&RequestCoordinator::GetQueuedRequestsCallback, |
| 127 weak_ptr_factory_.GetWeakPtr(), callback)); | 127 weak_ptr_factory_.GetWeakPtr(), callback)); |
| 128 } | 128 } |
| 129 | 129 |
| 130 void RequestCoordinator::GetQueuedRequestsCallback( | 130 void RequestCoordinator::GetQueuedRequestsCallback( |
| 131 const GetRequestsCallback& callback, | 131 const GetRequestsCallback& callback, |
| 132 RequestQueue::GetRequestsResult result, | 132 RequestQueue::GetRequestsResult result, |
| 133 const std::vector<SavePageRequest>& requests) { | 133 std::vector<std::unique_ptr<SavePageRequest>> requests) { |
| 134 callback.Run(requests); | 134 callback.Run(std::move(requests)); |
| 135 } | 135 } |
| 136 | 136 |
| 137 void RequestCoordinator::StopPrerendering() { | 137 void RequestCoordinator::StopPrerendering() { |
| 138 if (offliner_ && is_busy_) { | 138 if (offliner_ && is_busy_) { |
| 139 DCHECK(active_request_.get()); | 139 DCHECK(active_request_.get()); |
| 140 offliner_->Cancel(); | 140 offliner_->Cancel(); |
| 141 AbortRequestAttempt(active_request_.get()); | 141 AbortRequestAttempt(active_request_.get()); |
| 142 } | 142 } |
| 143 | 143 |
| 144 // Stopping offliner means it will not call callback. | 144 // Stopping offliner means it will not call callback. |
| 145 last_offlining_status_ = | 145 last_offlining_status_ = |
| 146 Offliner::RequestStatus::REQUEST_COORDINATOR_CANCELED; | 146 Offliner::RequestStatus::REQUEST_COORDINATOR_CANCELED; |
| 147 | 147 |
| 148 if (active_request_) { | 148 if (active_request_) { |
| 149 RecordOfflinerResultUMA(active_request_->client_id(), | 149 RecordOfflinerResultUMA(active_request_->client_id(), |
| 150 last_offlining_status_); | 150 last_offlining_status_); |
| 151 is_busy_ = false; | 151 is_busy_ = false; |
| 152 active_request_.reset(); | 152 active_request_.reset(); |
| 153 } | 153 } |
| 154 | 154 |
| 155 } | 155 } |
| 156 | 156 |
| 157 void RequestCoordinator::GetRequestsForSchedulingCallback( | 157 void RequestCoordinator::GetRequestsForSchedulingCallback( |
| 158 RequestQueue::GetRequestsResult result, | 158 RequestQueue::GetRequestsResult result, |
| 159 const std::vector<SavePageRequest>& requests) { | 159 std::vector<std::unique_ptr<SavePageRequest>> requests) { |
| 160 bool user_requested = false; | 160 bool user_requested = false; |
| 161 | 161 |
| 162 // Examine all requests, if we find a user requested one, we will use the less | 162 // Examine all requests, if we find a user requested one, we will use the less |
| 163 // restrictive conditions for user_requested requests. Otherwise we will use | 163 // restrictive conditions for user_requested requests. Otherwise we will use |
| 164 // the more restrictive non-user-requested conditions. | 164 // the more restrictive non-user-requested conditions. |
| 165 for (const SavePageRequest& request : requests) { | 165 for (const auto& request : requests) { |
| 166 if (request.user_requested()) { | 166 if (request->user_requested()) { |
| 167 user_requested = true; | 167 user_requested = true; |
| 168 break; | 168 break; |
| 169 } | 169 } |
| 170 } | 170 } |
| 171 | 171 |
| 172 // In the get callback, determine the least restrictive, and call | 172 // In the get callback, determine the least restrictive, and call |
| 173 // GetTriggerConditions based on that. | 173 // GetTriggerConditions based on that. |
| 174 scheduler_->Schedule(GetTriggerConditions(user_requested)); | 174 scheduler_->Schedule(GetTriggerConditions(user_requested)); |
| 175 } | 175 } |
| 176 | 176 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 277 if (result != RequestQueue::UpdateRequestResult::SUCCESS) { | 277 if (result != RequestQueue::UpdateRequestResult::SUCCESS) { |
| 278 DVLOG(1) << "Failed to update request attempt details. " | 278 DVLOG(1) << "Failed to update request attempt details. " |
| 279 << static_cast<int>(result); | 279 << static_cast<int>(result); |
| 280 event_logger_.RecordUpdateRequestFailed(client_id.name_space, result); | 280 event_logger_.RecordUpdateRequestFailed(client_id.name_space, result); |
| 281 } | 281 } |
| 282 } | 282 } |
| 283 | 283 |
| 284 // Called in response to updating multiple requests in the request queue. | 284 // Called in response to updating multiple requests in the request queue. |
| 285 void RequestCoordinator::UpdateMultipleRequestsCallback( | 285 void RequestCoordinator::UpdateMultipleRequestsCallback( |
| 286 const RequestQueue::UpdateMultipleRequestResults& results, | 286 const RequestQueue::UpdateMultipleRequestResults& results, |
| 287 const std::vector<SavePageRequest>& requests) { | 287 std::vector<std::unique_ptr<SavePageRequest>> requests) { |
| 288 bool available_user_request = false; | 288 bool available_user_request = false; |
| 289 for (SavePageRequest request : requests) { | 289 for (const auto& request : requests) { |
| 290 NotifyChanged(request); | 290 NotifyChanged(*(request)); |
| 291 if (!available_user_request && request.user_requested() && | 291 if (!available_user_request && request->user_requested() && |
| 292 request.request_state() == SavePageRequest::RequestState::AVAILABLE) { | 292 request->request_state() == SavePageRequest::RequestState::AVAILABLE) { |
| 293 // TODO(dougarnett): Consider avoiding prospect of N^2 in case | 293 // TODO(dougarnett): Consider avoiding prospect of N^2 in case |
| 294 // size of bulk requests can get large (perhaps with easier to consume | 294 // size of bulk requests can get large (perhaps with easier to consume |
| 295 // callback interface). | 295 // callback interface). |
| 296 for (std::pair<int64_t, RequestQueue::UpdateRequestResult> pair : | 296 for (std::pair<int64_t, RequestQueue::UpdateRequestResult> pair : |
| 297 results) { | 297 results) { |
| 298 if (pair.first == request.request_id() && | 298 if (pair.first == request->request_id() && |
| 299 pair.second == RequestQueue::UpdateRequestResult::SUCCESS) { | 299 pair.second == RequestQueue::UpdateRequestResult::SUCCESS) { |
| 300 // We have a successfully updated, available, user request. | 300 // We have a successfully updated, available, user request. |
| 301 available_user_request = true; | 301 available_user_request = true; |
| 302 } | 302 } |
| 303 } | 303 } |
| 304 } | 304 } |
| 305 } | 305 } |
| 306 | 306 |
| 307 if (available_user_request) | 307 if (available_user_request) |
| 308 StartProcessingIfConnected(); | 308 StartProcessingIfConnected(); |
| 309 } | 309 } |
| 310 | 310 |
| 311 void RequestCoordinator::HandleRemovedRequestsAndCallback( | 311 void RequestCoordinator::HandleRemovedRequestsAndCallback( |
| 312 const RemoveRequestsCallback& callback, | 312 const RemoveRequestsCallback& callback, |
| 313 BackgroundSavePageResult status, | 313 BackgroundSavePageResult status, |
| 314 const RequestQueue::UpdateMultipleRequestResults& results, | 314 const RequestQueue::UpdateMultipleRequestResults& results, |
| 315 const std::vector<SavePageRequest>& requests) { | 315 std::vector<std::unique_ptr<SavePageRequest>> requests) { |
| 316 callback.Run(results); | 316 callback.Run(results); |
| 317 HandleRemovedRequests(status, results, requests); | 317 HandleRemovedRequests(status, results, std::move(requests)); |
| 318 } | 318 } |
| 319 | 319 |
| 320 void RequestCoordinator::HandleRemovedRequests( | 320 void RequestCoordinator::HandleRemovedRequests( |
| 321 BackgroundSavePageResult status, | 321 BackgroundSavePageResult status, |
| 322 const RequestQueue::UpdateMultipleRequestResults& results, | 322 const RequestQueue::UpdateMultipleRequestResults& results, |
| 323 const std::vector<SavePageRequest>& requests) { | 323 std::vector<std::unique_ptr<SavePageRequest>> requests) { |
| 324 for (SavePageRequest request : requests) | 324 std::vector<std::unique_ptr<SavePageRequest>>::iterator request; |
| 325 NotifyCompleted(request, status); | 325 for (request = requests.begin(); request != requests.end(); ++request) |
|
Bernhard Bauer
2016/09/07 10:13:41
Why this style of loop?
Pete Williamson
2016/09/07 20:21:01
I was having problems getting the type right for a
| |
| 326 NotifyCompleted(*(request->get()), status); | |
| 326 } | 327 } |
| 327 | 328 |
| 328 void RequestCoordinator::ScheduleAsNeeded() { | 329 void RequestCoordinator::ScheduleAsNeeded() { |
| 329 // Get all requests from queue (there is no filtering mechanism). | 330 // Get all requests from queue (there is no filtering mechanism). |
| 330 queue_->GetRequests( | 331 queue_->GetRequests( |
| 331 base::Bind(&RequestCoordinator::GetRequestsForSchedulingCallback, | 332 base::Bind(&RequestCoordinator::GetRequestsForSchedulingCallback, |
| 332 weak_ptr_factory_.GetWeakPtr())); | 333 weak_ptr_factory_.GetWeakPtr())); |
| 333 } | 334 } |
| 334 | 335 |
| 335 void RequestCoordinator::StopProcessing() { | 336 void RequestCoordinator::StopProcessing() { |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 562 FOR_EACH_OBSERVER(Observer, observers_, OnChanged(request)); | 563 FOR_EACH_OBSERVER(Observer, observers_, OnChanged(request)); |
| 563 } | 564 } |
| 564 | 565 |
| 565 void RequestCoordinator::GetOffliner() { | 566 void RequestCoordinator::GetOffliner() { |
| 566 if (!offliner_) { | 567 if (!offliner_) { |
| 567 offliner_ = factory_->GetOffliner(policy_.get()); | 568 offliner_ = factory_->GetOffliner(policy_.get()); |
| 568 } | 569 } |
| 569 } | 570 } |
| 570 | 571 |
| 571 } // namespace offline_pages | 572 } // namespace offline_pages |
| OLD | NEW |