Index: content/browser/service_worker/service_worker_url_request_job.cc |
diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc |
index b2d836b947d3d99e65539ed5fb1ac42d556b6f75..d88aae6d41ec0847aef1a7a625cdb6011c5f94e1 100644 |
--- a/content/browser/service_worker/service_worker_url_request_job.cc |
+++ b/content/browser/service_worker/service_worker_url_request_job.cc |
@@ -10,6 +10,7 @@ |
#include "base/bind.h" |
#include "base/guid.h" |
+#include "base/memory/scoped_vector.h" |
#include "base/profiler/scoped_tracker.h" |
#include "base/strings/stringprintf.h" |
#include "base/time/time.h" |
@@ -409,27 +410,30 @@ bool ServiceWorkerURLRequestJob::CreateRequestBodyBlob(std::string* blob_uuid, |
if (!body_.get() || !blob_storage_context_) |
return false; |
+ // To ensure the blobs stick around until the end of the reading. |
+ ScopedVector<storage::BlobDataSnapshotHandle> handles; |
std::vector<const ResourceRequestBody::Element*> resolved_elements; |
- for (size_t i = 0; i < body_->elements()->size(); ++i) { |
- const ResourceRequestBody::Element& element = (*body_->elements())[i]; |
+ for (const ResourceRequestBody::Element& element : (*body_->elements())) { |
if (element.type() != ResourceRequestBody::Element::TYPE_BLOB) { |
resolved_elements.push_back(&element); |
continue; |
} |
- scoped_ptr<storage::BlobDataHandle> handle = |
+ scoped_ptr<storage::BlobDataSnapshotHandle> handle = |
blob_storage_context_->GetBlobDataFromUUID(element.blob_uuid()); |
if (handle->data()->items().empty()) |
continue; |
- for (size_t i = 0; i < handle->data()->items().size(); ++i) { |
- const storage::BlobData::Item& item = handle->data()->items().at(i); |
- DCHECK_NE(storage::BlobData::Item::TYPE_BLOB, item.type()); |
- resolved_elements.push_back(&item); |
+ const auto& items = handle->data()->items(); |
+ for (const auto& item : items) { |
+ DCHECK_NE(storage::DataElement::TYPE_BLOB, item->type()); |
+ resolved_elements.push_back(item->data_element_ptr()); |
} |
+ handles.push_back(handle.release()); |
} |
const std::string uuid(base::GenerateGUID()); |
uint64 total_size = 0; |
- scoped_refptr<storage::BlobData> blob_data = new storage::BlobData(uuid); |
+ scoped_ptr<storage::BlobDataBuilder> blob_data( |
+ new storage::BlobDataBuilder(uuid)); |
for (size_t i = 0; i < resolved_elements.size(); ++i) { |
const ResourceRequestBody::Element& element = *resolved_elements[i]; |
if (total_size != kuint64max && element.length() != kuint64max) |
@@ -441,10 +445,10 @@ bool ServiceWorkerURLRequestJob::CreateRequestBodyBlob(std::string* blob_uuid, |
blob_data->AppendData(element.bytes(), element.length()); |
break; |
case ResourceRequestBody::Element::TYPE_FILE: |
- blob_data->AppendFile(element.path(), |
- element.offset(), |
+ blob_data->AppendFile(element.path(), element.offset(), |
element.length(), |
- element.expected_modification_time()); |
+ element.expected_modification_time(), |
+ scoped_refptr<storage::ShareableFileReference>()); |
break; |
case ResourceRequestBody::Element::TYPE_BLOB: |
// Blob elements should be resolved beforehand. |
@@ -462,7 +466,7 @@ bool ServiceWorkerURLRequestJob::CreateRequestBodyBlob(std::string* blob_uuid, |
} |
request_body_blob_data_handle_ = |
- blob_storage_context_->AddFinishedBlob(blob_data.get()); |
+ blob_storage_context_->AddFinishedBlob(*blob_data.get()); |
*blob_uuid = uuid; |
*blob_size = total_size; |
return true; |
@@ -550,7 +554,7 @@ void ServiceWorkerURLRequestJob::DidDispatchFetchEvent( |
} |
// Set up a request for reading the blob. |
if (!response.blob_uuid.empty() && blob_storage_context_) { |
- scoped_ptr<storage::BlobDataHandle> blob_data_handle = |
+ scoped_ptr<storage::BlobDataSnapshotHandle> blob_data_handle = |
blob_storage_context_->GetBlobDataFromUUID(response.blob_uuid); |
if (!blob_data_handle) { |
// The renderer gave us a bad blob UUID. |