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 fe6e83232f8ec02c884ccf425d749dbe62e2e4d0..6d0824db9a4b263ef1ee4bf6b14173266858047c 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::GetAllRequests(const GetRequestsCallback& callback) { |
@@ -116,7 +119,7 @@ void RequestCoordinator::PauseRequests( |
const std::vector<int64_t>& request_ids) { |
queue_->ChangeRequestsState( |
request_ids, SavePageRequest::RequestState::PAUSED, |
- base::Bind(&RequestCoordinator::UpdateMultipleRequestCallback, |
+ base::Bind(&RequestCoordinator::UpdateMultipleRequestsCallback, |
weak_ptr_factory_.GetWeakPtr())); |
} |
@@ -124,7 +127,7 @@ void RequestCoordinator::ResumeRequests( |
const std::vector<int64_t>& request_ids) { |
queue_->ChangeRequestsState( |
request_ids, SavePageRequest::RequestState::AVAILABLE, |
- base::Bind(&RequestCoordinator::UpdateMultipleRequestCallback, |
+ base::Bind(&RequestCoordinator::UpdateMultipleRequestsCallback, |
weak_ptr_factory_.GetWeakPtr())); |
// TODO: Should we also schedule a task, in case there is not one scheduled? |
} |
@@ -132,7 +135,6 @@ void RequestCoordinator::ResumeRequests( |
void RequestCoordinator::AddRequestResultCallback( |
RequestQueue::AddRequestResult result, |
const SavePageRequest& request) { |
- |
// Inform the scheduler that we have an outstanding task.. |
scheduler_->Schedule(GetTriggerConditionsForUserRequest()); |
} |
@@ -151,21 +153,18 @@ void RequestCoordinator::UpdateRequestCallback( |
} |
// Called in response to updating multiple requests in the request queue. |
-void RequestCoordinator::UpdateMultipleRequestCallback( |
- RequestQueue::UpdateRequestResult result) { |
- // If the request succeeded, nothing to do. If it failed, we can't really do |
- // much, so just log it. |
- if (result != RequestQueue::UpdateRequestResult::SUCCESS) { |
- DVLOG(1) << "Failed to update request attempt details. " |
- << static_cast<int>(result); |
- } |
+void RequestCoordinator::UpdateMultipleRequestsCallback( |
+ const RequestQueue::UpdateMultipleRequestResults& results, |
+ const std::vector<SavePageRequest>& requests) { |
+ for (SavePageRequest request : requests) |
+ NotifyChanged(request); |
} |
void RequestCoordinator::RemoveRequestsCallback( |
- const RequestQueue::UpdateMultipleRequestResults& results) { |
- // TODO(petewil): Today the RemoveRequests API does not come with a callback. |
- // Should we add one? Perhaps the notifications from the observer will be |
- // sufficient. |
+ const RequestQueue::UpdateMultipleRequestResults& results, |
+ const std::vector<SavePageRequest>& requests) { |
+ for (SavePageRequest request : requests) |
+ NotifyRemoved(request); |
} |
void RequestCoordinator::StopProcessing() { |
@@ -313,20 +312,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. |
+ std::vector<int64_t> remove_requests; |
+ remove_requests.push_back(request.request_id()); |
+ queue_->RemoveRequests( |
+ remove_requests, base::Bind(&RequestCoordinator::RemoveRequestsCallback, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ NotifySucceeded(request); |
+ } 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. |
std::vector<int64_t> remove_requests; |
remove_requests.push_back(request.request_id()); |
queue_->RemoveRequests( |
remove_requests, base::Bind(&RequestCoordinator::RemoveRequestsCallback, |
weak_ptr_factory_.GetWeakPtr())); |
+ NotifyFailed(request, SavePageStatus::RETRY_COUNT_EXCEEDED); |
} else { |
// If we failed, but are not over the limit, update the request in the |
// queue. |
@@ -336,6 +343,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 |
@@ -371,6 +379,37 @@ 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) { |
+ FOR_EACH_OBSERVER(Observer, observers_, OnSucceeded(request)); |
+} |
+ |
+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::NotifyRemoved(const SavePageRequest& request) { |
+ FOR_EACH_OBSERVER(Observer, observers_, |
+ OnRemoved(request, SavePageStatus::REMOVED_BY_CLIENT)); |
+} |
+ |
void RequestCoordinator::GetOffliner() { |
if (!offliner_) { |
offliner_ = factory_->GetOffliner(policy_.get()); |