Chromium Code Reviews| Index: webkit/glue/resource_request_body.cc |
| diff --git a/webkit/glue/resource_request_body.cc b/webkit/glue/resource_request_body.cc |
| index 215dbde08f02a851899228704aecaf2ae2a869e1..1abf700a14b46b76a0a56e1b5631be9e007a0cc8 100644 |
| --- a/webkit/glue/resource_request_body.cc |
| +++ b/webkit/glue/resource_request_body.cc |
| @@ -5,7 +5,9 @@ |
| #include "webkit/glue/resource_request_body.h" |
| #include "base/logging.h" |
| -#include "net/base/upload_data.h" |
| +#include "net/base/upload_bytes_element_reader.h" |
| +#include "net/base/upload_data_stream.h" |
| +#include "net/base/upload_file_element_reader.h" |
| #include "webkit/blob/blob_storage_controller.h" |
| using webkit_blob::BlobData; |
| @@ -13,6 +15,49 @@ using webkit_blob::BlobStorageController; |
| namespace webkit_glue { |
| +namespace { |
| + |
| +// A subclass of net::UploadBytesElementReader which owns ResourceRequestBody. |
| +class BytesElementReader : public net::UploadBytesElementReader { |
| + public: |
| + BytesElementReader(ResourceRequestBody* resource_request_body, |
| + const ResourceRequestBody::Element& element) |
| + : net::UploadBytesElementReader(element.bytes(), element.length()), |
| + resource_request_body_(resource_request_body) { |
| + DCHECK_EQ(ResourceRequestBody::Element::TYPE_BYTES, element.type()); |
| + } |
| + |
| + virtual ~BytesElementReader() {} |
| + |
| + private: |
| + scoped_refptr<ResourceRequestBody> resource_request_body_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(BytesElementReader); |
| +}; |
| + |
| +// A subclass of net::UploadFileElementReader which owns ResourceRequestBody. |
| +class FileElementReader : public net::UploadFileElementReader { |
|
mmenke
2012/12/12 19:26:41
This class isn't needed, is it? UploadFileElement
hashimoto
2012/12/13 03:58:47
This class is needed to keep BlobData attached to
kinuko
2012/12/13 06:05:47
Can we have a comment about that?
hashimoto
2012/12/13 06:17:51
Done.
|
| + public: |
| + FileElementReader(ResourceRequestBody* resource_request_body, |
| + const ResourceRequestBody::Element& element) |
| + : net::UploadFileElementReader(element.path(), |
| + element.offset(), |
| + element.length(), |
| + element.expected_modification_time()), |
| + resource_request_body_(resource_request_body) { |
| + DCHECK_EQ(ResourceRequestBody::Element::TYPE_FILE, element.type()); |
| + } |
| + |
| + virtual ~FileElementReader() {} |
| + |
| + private: |
| + scoped_refptr<ResourceRequestBody> resource_request_body_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(FileElementReader); |
| +}; |
| + |
| +} // namespace |
| + |
| ResourceRequestBody::ResourceRequestBody() : identifier_(0) {} |
| void ResourceRequestBody::AppendBytes(const char* bytes, int bytes_len) { |
| @@ -44,7 +89,8 @@ void ResourceRequestBody::AppendFileSystemFileRange( |
| expected_modification_time); |
| } |
| -net::UploadData* ResourceRequestBody::ResolveElementsAndCreateUploadData( |
| +net::UploadDataStream* |
| +ResourceRequestBody::ResolveElementsAndCreateUploadDataStream( |
| BlobStorageController* blob_controller) { |
| // Resolve all blob elements. |
| std::vector<const Element*> resolved_elements; |
| @@ -58,27 +104,15 @@ net::UploadData* ResourceRequestBody::ResolveElementsAndCreateUploadData( |
| } |
| } |
| - net::UploadData* upload_data = new net::UploadData; |
| - // We attach 'this' to UploadData so that we do not need to copy |
| - // bytes for TYPE_BYTES. |
| - upload_data->SetUserData( |
| - this, new base::UserDataAdapter<ResourceRequestBody>(this)); |
| - ScopedVector<net::UploadElement>* elements = |
| - upload_data->elements_mutable(); |
| + ScopedVector<net::UploadElementReader> element_readers; |
| for (size_t i = 0; i < resolved_elements.size(); ++i) { |
| const Element& element = *resolved_elements[i]; |
| switch (element.type()) { |
| case Element::TYPE_BYTES: |
| - elements->push_back(new net::UploadElement()); |
| - elements->back()->SetToSharedBytes(element.bytes(), element.length()); |
| + element_readers.push_back(new BytesElementReader(this, element)); |
| break; |
| case Element::TYPE_FILE: |
| - elements->push_back(new net::UploadElement()); |
| - elements->back()->SetToFilePathRange( |
| - element.path(), |
| - element.offset(), |
| - element.length(), |
| - element.expected_modification_time()); |
| + element_readers.push_back(new FileElementReader(this, element)); |
| break; |
| case Element::TYPE_FILE_FILESYSTEM: |
| // TODO(kinuko): Resolve FileSystemURL before creating UploadData. |
| @@ -93,8 +127,7 @@ net::UploadData* ResourceRequestBody::ResolveElementsAndCreateUploadData( |
| break; |
| } |
| } |
| - upload_data->set_identifier(identifier_); |
| - return upload_data; |
| + return new net::UploadDataStream(&element_readers, identifier_); |
| } |
| ResourceRequestBody::~ResourceRequestBody() {} |