Chromium Code Reviews| Index: components/offline_pages/background/request_queue.cc |
| diff --git a/components/offline_pages/background/request_queue.cc b/components/offline_pages/background/request_queue.cc |
| index 5fbd0baeda553a858c2a6abfb333574c695aef68..49b54ca62c80ff4aa44779be1b5fb442afd56a7c 100644 |
| --- a/components/offline_pages/background/request_queue.cc |
| +++ b/components/offline_pages/background/request_queue.cc |
| @@ -38,6 +38,17 @@ void AddRequestDone(const RequestQueue::AddRequestCallback& callback, |
| callback.Run(result, request); |
| } |
| +// Completes the update request call. |
| +void UpdateRequestDone(const RequestQueue::UpdateRequestCallback& callback, |
| + RequestQueueStore::UpdateStatus status) { |
| + RequestQueue::UpdateRequestResult result = |
| + (status == RequestQueueStore::UpdateStatus::UPDATED) |
| + ? RequestQueue::UpdateRequestResult::SUCCESS |
| + : RequestQueue::UpdateRequestResult::STORE_FAILURE; |
| + callback.Run(result); |
| +} |
| + |
| + |
| // Completes the remove request call. |
| void RemoveRequestDone(const RequestQueue::UpdateRequestCallback& callback, |
| bool success, |
| @@ -51,7 +62,7 @@ void RemoveRequestDone(const RequestQueue::UpdateRequestCallback& callback, |
| } // namespace |
| RequestQueue::RequestQueue(std::unique_ptr<RequestQueueStore> store) |
| - : store_(std::move(store)) {} |
| + : store_(std::move(store)), weak_ptr_factory_(this) {} |
| RequestQueue::~RequestQueue() {} |
| @@ -67,8 +78,39 @@ void RequestQueue::AddRequest(const SavePageRequest& request, |
| base::Bind(&AddRequestDone, callback, request)); |
| } |
| -void RequestQueue::UpdateRequest(const SavePageRequest& request, |
| - const UpdateRequestCallback& callback) {} |
| +void RequestQueue::UpdateRequest(const SavePageRequest& update_request, |
| + const UpdateRequestCallback& update_callback) { |
| + // We have to pass the update_callback *through* the get callback. We do this |
| + // by currying the update_callback as a parameter to be used when calling |
| + // GetForUpdateDone. The actual request queue store get operation will not |
| + // see this bound parameter, but just pass it along. GetForUpdateDone then |
| + // passes it into the AddOrUpdateRequest method, where it ends up calling back |
| + // to the request queue client. |
| + store_->GetRequests(base::Bind( |
|
fgorski
2016/07/22 16:14:58
This is probably going to be more efficient if we
Pete Williamson
2016/07/22 18:27:00
TODO added. crbug.com/630657.
|
| + &RequestQueue::GetForUpdateDone, weak_ptr_factory_.GetWeakPtr(), |
| + update_callback, update_request)); |
| +} |
| + |
| +// We need a different version of the GetCallback that can take the curried |
| +// update_callback as a parameter, and call back into the request queue store |
| +// implementation. This must be a member function because we need access to |
| +// the store pointer to call AddOrUpdateRequest. |
| +void RequestQueue::GetForUpdateDone( |
| + const UpdateRequestCallback& update_callback, |
| + const SavePageRequest& update_request, |
| + bool success, |
| + const std::vector<SavePageRequest>& found_requests) { |
| + // If the result was not found, return now. |
| + if (!success) { |
|
fgorski
2016/07/22 16:14:58
what about the case where found_request does not c
Pete Williamson
2016/07/22 18:27:00
Added case.
|
| + update_callback.Run( |
| + RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST); |
| + return; |
| + } |
| + |
| + // Since the request exists, update it. |
| + store_->AddOrUpdateRequest(update_request, |
| + base::Bind(&UpdateRequestDone, update_callback)); |
| +} |
| void RequestQueue::RemoveRequest(int64_t request_id, |
| const UpdateRequestCallback& callback) { |