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..12b4b80c9cf06bb5c2a0a22cf0eaff2dd6978a43 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,18 @@ 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: { |
+ 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; |