Chromium Code Reviews| Index: components/offline_pages/background/request_coordinator.cc |
| diff --git a/components/offline_pages/background/request_coordinator.cc b/components/offline_pages/background/request_coordinator.cc |
| index 8f257a0490b68315e661c656d14a4f3a4166fcb1..691382c00791e9fecd7a96e6c2bff15569179dc1 100644 |
| --- a/components/offline_pages/background/request_coordinator.cc |
| +++ b/components/offline_pages/background/request_coordinator.cc |
| @@ -77,7 +77,9 @@ bool RequestCoordinator::SavePageLater( |
| return false; |
| } |
| - // TODO(petewil): We need a robust scheme for allocating new IDs. |
| + // TODO(petewil): Use an int64_t random number for this, pass it to the |
| + // offliner, and eventually use it as the offline_id - that way the client |
| + // uses offline_id everywhere. |
| static int64_t id = 0; |
| // Build a SavePageRequest. |
| @@ -88,6 +90,7 @@ bool RequestCoordinator::SavePageLater( |
| queue_->AddRequest(request, |
| base::Bind(&RequestCoordinator::AddRequestResultCallback, |
| weak_ptr_factory_.GetWeakPtr())); |
| + NotifyAdded(request); |
| return true; |
| } |
| void RequestCoordinator::GetQueuedRequests( |
| @@ -119,9 +122,10 @@ void RequestCoordinator::GetQueuedRequestsCallback( |
| void RequestCoordinator::RemoveRequests( |
| const std::vector<ClientId>& client_ids) { |
| + std::vector<int64_t> placeholder; |
| queue_->RemoveRequestsByClientId( |
| client_ids, base::Bind(&RequestCoordinator::UpdateMultipleRequestCallback, |
| - weak_ptr_factory_.GetWeakPtr())); |
| + weak_ptr_factory_.GetWeakPtr(), placeholder)); |
| } |
| void RequestCoordinator::PauseRequests( |
| @@ -129,7 +133,7 @@ void RequestCoordinator::PauseRequests( |
| queue_->ChangeRequestsState( |
| request_ids, SavePageRequest::RequestState::PAUSED, |
| base::Bind(&RequestCoordinator::UpdateMultipleRequestCallback, |
| - weak_ptr_factory_.GetWeakPtr())); |
| + weak_ptr_factory_.GetWeakPtr(), request_ids)); |
| } |
| void RequestCoordinator::ResumeRequests( |
| @@ -137,14 +141,13 @@ void RequestCoordinator::ResumeRequests( |
| queue_->ChangeRequestsState( |
| request_ids, SavePageRequest::RequestState::AVAILABLE, |
| base::Bind(&RequestCoordinator::UpdateMultipleRequestCallback, |
| - weak_ptr_factory_.GetWeakPtr())); |
| + weak_ptr_factory_.GetWeakPtr(), request_ids)); |
| // TODO: Should we also schedule a task, in case there is not one scheduled? |
| } |
| void RequestCoordinator::AddRequestResultCallback( |
| RequestQueue::AddRequestResult result, |
| const SavePageRequest& request) { |
| - |
| // Inform the scheduler that we have an outstanding task.. |
| scheduler_->Schedule(GetTriggerConditionsForUserRequest()); |
| } |
| @@ -164,12 +167,33 @@ void RequestCoordinator::UpdateRequestCallback( |
| // Called in response to updating multiple requests in the request queue. |
| void RequestCoordinator::UpdateMultipleRequestCallback( |
|
Dmitry Titov
2016/08/11 03:41:55
UpdateMultipleRequestCallback and SendNotifyChange
Pete Williamson
2016/08/13 03:20:34
Done.
|
| + const std::vector<int64_t>& request_ids, |
| RequestQueue::UpdateRequestResult result) { |
| // If the request succeeded, nothing to do. If it failed, we can't really do |
|
Dmitry Titov
2016/08/11 03:41:55
This comment seems needs updating, because "nothin
Pete Williamson
2016/08/13 03:20:34
Done.
|
| // much, so just log it. |
| if (result != RequestQueue::UpdateRequestResult::SUCCESS) { |
| DVLOG(1) << "Failed to update request attempt details. " |
| << static_cast<int>(result); |
| + } else { |
| + SendNotifyChangeForRequestIdList(request_ids); |
| + } |
| +} |
| + |
| +// Called in response to updating multiple requests in the request queue. |
| +void RequestCoordinator::NotifyChangedListCallback( |
| + const std::vector<int64_t>& request_ids, |
| + RequestQueue::GetRequestsResult result, |
| + const std::vector<SavePageRequest>& requests) { |
| + std::vector<ClientId> client_ids; |
| + |
| + // For each item in request_ids, find it in requests and send a changed |
| + // notification for that request. |
| + std::unordered_set<int64_t> changed_ids(request_ids.begin(), |
| + request_ids.end()); |
| + for (const SavePageRequest& request : requests) { |
| + // If we find a match, send a notification. |
| + if (changed_ids.count(request.request_id()) > 0) |
| + NotifyChanged(request); |
| } |
| } |
| @@ -318,19 +342,28 @@ void RequestCoordinator::OfflinerDoneCallback(const SavePageRequest& request, |
| base::Bind(&RequestCoordinator::UpdateRequestCallback, |
| weak_ptr_factory_.GetWeakPtr(), |
| updated_request.client_id())); |
| + NotifyFailed(updated_request, SavePageStatus::FOREGROUND_CANCELED); |
| - } else if (status == Offliner::RequestStatus::SAVED || |
| - request.completed_attempt_count() + 1 >= |
| - policy_->GetMaxCompletedTries()) { |
| - // Remove the request from the queue if it either succeeded or exceeded the |
| - // max number of retries. The +1 represents the request that just |
| - // completed. Since we call MarkAttemptCompleted within the if branches, |
| - // the completed_attempt_count has not yet been updated when we are checking |
| - // the if condition. |
| + } else if (status == Offliner::RequestStatus::SAVED) { |
| + // Remove the request from the queue if it succeeded. |
| + queue_->RemoveRequest( |
| + request.request_id(), |
| + base::Bind(&RequestCoordinator::UpdateRequestCallback, |
| + weak_ptr_factory_.GetWeakPtr(), request.client_id())); |
| + // TODO: We don't have an offline ID to return. Modify the prerenderer |
| + // callback to pass it. |
| + NotifySucceeded(request, 0); |
| + } else if (request.completed_attempt_count() + 1 >= |
| + policy_->GetMaxCompletedTries()) { |
| + // Remove from the request queue if we exceeeded max retries. The +1 |
| + // represents the request that just completed. Since we call |
| + // MarkAttemptCompleted within the if branches, the completed_attempt_count |
| + // has not yet been updated when we are checking the if condition. |
| queue_->RemoveRequest( |
| request.request_id(), |
| base::Bind(&RequestCoordinator::UpdateRequestCallback, |
| weak_ptr_factory_.GetWeakPtr(), request.client_id())); |
| + NotifyFailed(request, SavePageStatus::RETRY_COUNT_EXCEEDED); |
| } else { |
| // If we failed, but are not over the limit, update the request in the |
| // queue. |
| @@ -340,6 +373,7 @@ void RequestCoordinator::OfflinerDoneCallback(const SavePageRequest& request, |
| base::Bind(&RequestCoordinator::UpdateRequestCallback, |
| weak_ptr_factory_.GetWeakPtr(), |
| updated_request.client_id())); |
| + NotifyChanged(updated_request); |
| } |
| // Determine whether we might try another request in this |
| @@ -375,6 +409,41 @@ RequestCoordinator::GetTriggerConditionsForUserRequest() { |
| return trigger_conditions; |
| } |
| +void RequestCoordinator::AddObserver(Observer* observer) { |
| + DCHECK(observer); |
| + observers_.AddObserver(observer); |
| +} |
| + |
| +void RequestCoordinator::RemoveObserver(Observer* observer) { |
| + observers_.RemoveObserver(observer); |
| +} |
| + |
| +void RequestCoordinator::NotifyAdded(const SavePageRequest& request) { |
| + FOR_EACH_OBSERVER(Observer, observers_, OnAdded(request)); |
| +} |
| + |
| +void RequestCoordinator::NotifySucceeded(const SavePageRequest& request, |
| + int64_t offline_id) { |
| + FOR_EACH_OBSERVER(Observer, observers_, OnSucceeded(request, offline_id)); |
| +} |
| + |
| +void RequestCoordinator::NotifyFailed(const SavePageRequest& request, |
| + SavePageStatus status) { |
| + FOR_EACH_OBSERVER(Observer, observers_, OnFailed(request, status)); |
| +} |
| + |
| +void RequestCoordinator::NotifyChanged(const SavePageRequest& request) { |
| + FOR_EACH_OBSERVER(Observer, observers_, OnChanged(request)); |
| +} |
| + |
| +void RequestCoordinator::SendNotifyChangeForRequestIdList( |
| + const std::vector<int64_t> request_ids) { |
| + // Bind the request_ids onto our callback parameter list, the work will be |
| + // done in the callback. |
| + queue_->GetRequests(base::Bind(&RequestCoordinator::NotifyChangedListCallback, |
|
Dmitry Titov
2016/08/11 03:41:55
It is unfortunate that we need to go do the SQL qu
Pete Williamson
2016/08/13 03:20:34
Done.
|
| + weak_ptr_factory_.GetWeakPtr(), request_ids)); |
| +} |
| + |
| void RequestCoordinator::GetOffliner() { |
| if (!offliner_) { |
| offliner_ = factory_->GetOffliner(policy_.get()); |