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