Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(735)

Unified Diff: content/browser/service_worker/service_worker_url_request_job.cc

Issue 810403004: [Storage] Blob Storage Refactoring pt 1 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: memory leak fixed Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698