Chromium Code Reviews| Index: content/browser/loader/upload_data_stream_builder.cc |
| diff --git a/content/browser/loader/upload_data_stream_builder.cc b/content/browser/loader/upload_data_stream_builder.cc |
| index cab3a104572e3811b5c85d948c299b94b5bf33fb..ad276d7555828de6e04dc2124a813cd9995b92f6 100644 |
| --- a/content/browser/loader/upload_data_stream_builder.cc |
| +++ b/content/browser/loader/upload_data_stream_builder.cc |
| @@ -4,6 +4,7 @@ |
| #include "content/browser/loader/upload_data_stream_builder.h" |
| +#include <limits> |
| #include <utility> |
| #include <vector> |
| @@ -13,11 +14,11 @@ |
| #include "content/common/resource_request_body.h" |
| #include "net/base/elements_upload_data_stream.h" |
| #include "net/base/upload_bytes_element_reader.h" |
| -#include "net/base/upload_disk_cache_entry_element_reader.h" |
| #include "net/base/upload_file_element_reader.h" |
| #include "storage/browser/blob/blob_data_handle.h" |
| -#include "storage/browser/blob/blob_data_snapshot.h" |
| +#include "storage/browser/blob/blob_reader.h" |
| #include "storage/browser/blob/blob_storage_context.h" |
| +#include "storage/browser/blob/upload_blob_element_reader.h" |
| namespace disk_cache { |
| class Entry; |
| @@ -69,89 +70,15 @@ class FileElementReader : public net::UploadFileElementReader { |
| DISALLOW_COPY_AND_ASSIGN(FileElementReader); |
| }; |
| -// This owns the provided ResourceRequestBody. This is necessary to ensure the |
| -// BlobData and open disk cache entries survive until upload completion. |
| -class DiskCacheElementReader : public net::UploadDiskCacheEntryElementReader { |
| - public: |
| - DiskCacheElementReader(ResourceRequestBody* resource_request_body, |
| - disk_cache::Entry* disk_cache_entry, |
| - int disk_cache_stream_index, |
| - const ResourceRequestBody::Element& element) |
| - : net::UploadDiskCacheEntryElementReader(disk_cache_entry, |
| - disk_cache_stream_index, |
| - element.offset(), |
| - element.length()), |
| - resource_request_body_(resource_request_body) { |
| - DCHECK_EQ(ResourceRequestBody::Element::TYPE_DISK_CACHE_ENTRY, |
| - element.type()); |
| - } |
| - |
| - ~DiskCacheElementReader() override {} |
| - |
| - private: |
| - scoped_refptr<ResourceRequestBody> resource_request_body_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(DiskCacheElementReader); |
| -}; |
| - |
| -void ResolveBlobReference( |
| - ResourceRequestBody* body, |
| - storage::BlobStorageContext* blob_context, |
| - const ResourceRequestBody::Element& element, |
| - std::vector<std::pair<const ResourceRequestBody::Element*, |
| - const storage::BlobDataItem*>>* resolved_elements) { |
| - DCHECK(blob_context); |
| - scoped_ptr<storage::BlobDataHandle> handle = |
| - blob_context->GetBlobDataFromUUID(element.blob_uuid()); |
| - DCHECK(handle); |
| - if (!handle) |
| - return; |
| - |
| - // TODO(dmurph): Create a reader for blobs instead of decomposing the blob |
| - // and storing the snapshot on the request to keep the resources around. |
| - // Currently a handle is attached to the request in the resource dispatcher |
| - // host, so we know the blob won't go away, but it's not very clear or useful. |
| - scoped_ptr<storage::BlobDataSnapshot> snapshot = handle->CreateSnapshot(); |
| - // If there is no element in the referred blob data, just return. |
| - if (snapshot->items().empty()) |
| - return; |
| - |
| - // Append the elements in the referenced blob data. |
| - for (const auto& item : snapshot->items()) { |
| - DCHECK_NE(storage::DataElement::TYPE_BLOB, item->type()); |
| - resolved_elements->push_back( |
| - std::make_pair(item->data_element_ptr(), item.get())); |
| - } |
| - const void* key = snapshot.get(); |
| - body->SetUserData(key, snapshot.release()); |
| -} |
| - |
| } // namespace |
| scoped_ptr<net::UploadDataStream> UploadDataStreamBuilder::Build( |
| ResourceRequestBody* body, |
| storage::BlobStorageContext* blob_context, |
| storage::FileSystemContext* file_system_context, |
| - base::TaskRunner* file_task_runner) { |
| - // Resolve all blob elements. |
| - std::vector<std::pair<const ResourceRequestBody::Element*, |
| - const storage::BlobDataItem*>> resolved_elements; |
| - for (size_t i = 0; i < body->elements()->size(); ++i) { |
| - const ResourceRequestBody::Element& element = (*body->elements())[i]; |
| - if (element.type() == ResourceRequestBody::Element::TYPE_BLOB) { |
| - ResolveBlobReference(body, blob_context, element, &resolved_elements); |
| - } else if (element.type() != |
| - ResourceRequestBody::Element::TYPE_DISK_CACHE_ENTRY) { |
| - resolved_elements.push_back(std::make_pair(&element, nullptr)); |
| - } else { |
| - NOTREACHED(); |
| - } |
| - } |
| - |
| + base::SingleThreadTaskRunner* file_task_runner) { |
| ScopedVector<net::UploadElementReader> element_readers; |
| - for (const auto& element_and_blob_item_pair : resolved_elements) { |
| - const ResourceRequestBody::Element& element = |
| - *element_and_blob_item_pair.first; |
| + for (const auto& element : *body->elements()) { |
| switch (element.type()) { |
| case ResourceRequestBody::Element::TYPE_BYTES: |
| element_readers.push_back(new BytesElementReader(body, element)); |
| @@ -172,22 +99,20 @@ scoped_ptr<net::UploadDataStream> UploadDataStreamBuilder::Build( |
| element.length(), |
| element.expected_modification_time())); |
| break; |
| - case ResourceRequestBody::Element::TYPE_BLOB: |
| - // Blob elements should be resolved beforehand. |
| - // TODO(dmurph): Create blob reader and store the snapshot in there. |
| - NOTREACHED(); |
| - break; |
| - case ResourceRequestBody::Element::TYPE_DISK_CACHE_ENTRY: { |
| - // TODO(gavinp): If Build() is called with a DataElement of |
| - // TYPE_DISK_CACHE_ENTRY then this code won't work because we won't call |
| - // ResolveBlobReference() and so we won't find |item|. Is this OK? |
| - const storage::BlobDataItem* item = element_and_blob_item_pair.second; |
| - element_readers.push_back( |
| - new DiskCacheElementReader(body, item->disk_cache_entry(), |
| - item->disk_cache_stream_index(), |
| - element)); |
| + case ResourceRequestBody::Element::TYPE_BLOB: { |
| + // Modify the UploadBlobElementReader if offsets and length are |
| + // needed. |
|
michaeln
2015/09/28 21:52:07
The comment is a little confusing. It's describing
dmurph
2015/09/29 21:29:21
Done.
|
| + DCHECK_EQ(std::numeric_limits<uint64_t>::max(), element.length()); |
| + DCHECK_EQ(0ul, element.offset()); |
| + scoped_ptr<storage::BlobDataHandle> handle = |
| + blob_context->GetBlobDataFromUUID(element.blob_uuid()); |
| + storage::BlobDataHandle* handle_ptr = handle.get(); |
| + element_readers.push_back(new storage::UploadBlobElementReader( |
| + handle_ptr->CreateReader(file_system_context, file_task_runner), |
| + handle.Pass())); |
| break; |
| } |
| + case ResourceRequestBody::Element::TYPE_DISK_CACHE_ENTRY: |
| case ResourceRequestBody::Element::TYPE_UNKNOWN: |
| NOTREACHED(); |
| break; |