Index: content/browser/background_fetch/background_fetch_data_manager.cc |
diff --git a/content/browser/background_fetch/background_fetch_data_manager.cc b/content/browser/background_fetch/background_fetch_data_manager.cc |
index 06a82d4d31bbe50e3dc5b571bb0faabaf35dac1e..647b43b84f9470e8c64ad45ddb57f677723ba839 100644 |
--- a/content/browser/background_fetch/background_fetch_data_manager.cc |
+++ b/content/browser/background_fetch/background_fetch_data_manager.cc |
@@ -5,6 +5,7 @@ |
#include "content/browser/background_fetch/background_fetch_data_manager.h" |
#include "content/browser/background_fetch/background_fetch_context.h" |
+#include "content/browser/background_fetch/batch_request.h" |
#include "content/browser/background_fetch/fetch_request.h" |
namespace content { |
@@ -16,20 +17,79 @@ BackgroundFetchDataManager::BackgroundFetchDataManager( |
// TODO(harkness) Read from persistent storage and recreate requests. |
} |
-BackgroundFetchDataManager::~BackgroundFetchDataManager() {} |
+BackgroundFetchDataManager::~BackgroundFetchDataManager() { |
+ // TODO(harkness): Either require that the BackgroundFetchDataManager is |
+ // always destructed after the BatchManager or do ref counting on the |
+ // BatchData objects that are allocated. |
+ for (auto pair : batch_map_) { |
Peter Beverloo
2017/02/24 02:05:16
note: this'll go away because of std::unique_ptr<>
harkness
2017/02/24 11:47:10
Removed it.
|
+ delete pair.second; |
+ } |
+} |
+ |
+BackgroundFetchDataManager::BatchData* |
+BackgroundFetchDataManager::CreateRequest( |
+ const BatchRequest& batch_request, |
+ const std::vector<FetchRequest>& fetch_requests) { |
+ BatchIdentifier id(batch_request.service_worker_registration_id(), |
+ batch_request.tag()); |
+ if (service_worker_tag_map_.find(id) != service_worker_tag_map_.end()) { |
+ DLOG(ERROR) << "Origin " << batch_request.origin() |
+ << " has already created a batch request with tag " |
+ << batch_request.tag(); |
+ // TODO(harkness) Figure out how to return errors like this. |
+ return nullptr; |
+ } |
-void BackgroundFetchDataManager::CreateRequest( |
- const FetchRequest& fetch_request) { |
- FetchIdentifier id(fetch_request.service_worker_registration_id(), |
- fetch_request.tag()); |
- if (fetch_map_.find(id) != fetch_map_.end()) { |
- DLOG(ERROR) << "Origin " << fetch_request.origin() |
- << " has already created a fetch request with tag " |
- << fetch_request.tag(); |
+ if (batch_map_.find(batch_request.guid()) != batch_map_.end()) { |
+ DLOG(ERROR) << "Batch with UID " << batch_request.guid() |
+ << " already exists."; |
// TODO(harkness) Figure out how to return errors like this. |
- return; |
+ return nullptr; |
} |
- fetch_map_[id] = fetch_request; |
+ |
+ service_worker_tag_map_[id] = batch_request.guid(); |
+ BatchData* batch_data = new BatchData(batch_request, fetch_requests); |
Peter Beverloo
2017/02/24 02:05:15
new -> std::MakeUnique<>
harkness
2017/02/24 11:47:10
Done.
|
+ batch_map_.insert(std::make_pair(batch_request.guid(), batch_data)); |
+ return batch_data; |
+} |
+ |
+BackgroundFetchDataManager::BatchData::BatchData( |
+ const BatchRequest& batch_request, |
+ const FetchRequests& fetch_requests) |
+ : fetch_requests_(std::move(fetch_requests)) {} |
Peter Beverloo
2017/02/24 02:05:15
How can we *move* a const& vector? Moving invalida
harkness
2017/02/24 11:47:10
I've removed the const-ness of the vector for now,
|
+ |
+BackgroundFetchDataManager::BatchData::~BatchData() {} |
+ |
+BackgroundFetchDataManager::BatchData::BatchData() = default; |
+ |
+// TODO(harkness): Provide more detail about status and where the returned data |
+// is now available. |
+bool BackgroundFetchDataManager::BatchData::FetchRequestComplete( |
+ const std::string& fetch_guid) { |
+ DCHECK(fetch_request_index_.find(fetch_guid) != fetch_request_index_.end()); |
+ fetch_requests_[fetch_request_index_[fetch_guid]].set_complete(true); |
+ fetch_request_index_.erase(fetch_guid); |
Peter Beverloo
2017/02/24 02:05:15
This does three lookups in fetch_request_index_. I
harkness
2017/02/24 11:47:11
Personally, I find the bracket syntax more readabl
|
+ return next_fetch_request_ != fetch_requests_.size(); |
+} |
+ |
+const FetchRequest& |
+BackgroundFetchDataManager::BatchData::GetNextFetchRequest() { |
+ DCHECK(next_fetch_request_ != fetch_requests_.size()); |
Peter Beverloo
2017/02/24 02:05:16
DCHECK_NE
harkness
2017/02/24 11:47:10
Done.
|
+ |
+ const FetchRequest& next_request = fetch_requests_[next_fetch_request_]; |
+ DCHECK(!next_request.complete()); |
+ fetch_request_index_[next_request.guid()] = next_fetch_request_++; |
+ |
+ return next_request; |
+} |
+ |
+bool BackgroundFetchDataManager::BatchData::IsComplete() const { |
+ return ((next_fetch_request_ == fetch_requests_.size()) && |
+ fetch_request_index_.empty()); |
+} |
+ |
+bool BackgroundFetchDataManager::BatchData::HasRequestsRemaining() const { |
+ return next_fetch_request_ != fetch_requests_.size(); |
} |
} // namespace content |