| 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() {}
|
|
|