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..b75666f55afe045e2249124ef1e752dd4730dc1e 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,51 @@ 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. |
+// This class is necessary to ensure the BlobData and any attached shareable |
+// files survive until upload completion. |
+class FileElementReader : public net::UploadFileElementReader { |
+ 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 +91,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 +106,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 +129,7 @@ net::UploadData* ResourceRequestBody::ResolveElementsAndCreateUploadData( |
break; |
} |
} |
- upload_data->set_identifier(identifier_); |
- return upload_data; |
+ return new net::UploadDataStream(&element_readers, identifier_); |
} |
ResourceRequestBody::~ResourceRequestBody() {} |