Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(979)

Unified Diff: webkit/glue/resource_request_body.cc

Issue 10917127: webkit: Resolve blob elements early in ResourceRequestBody::ResolveElementsAndCreateUploadData() to… (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: _ Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/glue/resource_request_body.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/glue/resource_request_body.cc
diff --git a/webkit/glue/resource_request_body.cc b/webkit/glue/resource_request_body.cc
index 48dc9cda17e88e289a5e863dc2dc97081eedcd23..347af0efd925ac9af4d4e4a5e7c38da2fdcca5fb 100644
--- a/webkit/glue/resource_request_body.cc
+++ b/webkit/glue/resource_request_body.cc
@@ -46,6 +46,18 @@ void ResourceRequestBody::AppendFileSystemFileRange(
net::UploadData* ResourceRequestBody::ResolveElementsAndCreateUploadData(
BlobStorageController* blob_controller) {
+ // Resolve all blob elements.
+ std::vector<const Element*> resolved_elements;
+ for (size_t i = 0; i < elements_.size(); ++i) {
+ const Element& element = elements_[i];
+ if (element.type() == Element::TYPE_BLOB) {
+ ResolveBlobReference(blob_controller, element.url(), &resolved_elements);
+ } else {
+ // No need to resolve, just append the element.
+ resolved_elements.push_back(&element);
+ }
+ }
+
net::UploadData* upload_data = new net::UploadData;
// We attach 'this' to UploadData so that we do not need to copy
// bytes for TYPE_BYTES.
@@ -53,8 +65,8 @@ net::UploadData* ResourceRequestBody::ResolveElementsAndCreateUploadData(
this, new base::UserDataAdapter<ResourceRequestBody>(this));
std::vector<net::UploadElement>* elements =
upload_data->elements_mutable();
- for (size_t i = 0; i < elements_.size(); ++i) {
- const Element& element = elements_[i];
+ 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(net::UploadElement());
@@ -73,7 +85,8 @@ net::UploadData* ResourceRequestBody::ResolveElementsAndCreateUploadData(
NOTREACHED();
break;
case Element::TYPE_BLOB:
- ResolveBlobReference(blob_controller, element.url(), elements);
+ // Blob elements should be resolved beforehand.
+ NOTREACHED();
break;
case Element::TYPE_UNKNOWN:
NOTREACHED();
@@ -88,14 +101,15 @@ ResourceRequestBody::~ResourceRequestBody() {}
void ResourceRequestBody::ResolveBlobReference(
webkit_blob::BlobStorageController* blob_controller,
- const GURL& blob_url, std::vector<net::UploadElement>* elements) {
+ const GURL& blob_url,
+ std::vector<const Element*>* resolved_elements) {
DCHECK(blob_controller);
BlobData* blob_data = blob_controller->GetBlobDataFromUrl(blob_url);
DCHECK(blob_data);
if (!blob_data)
return;
- // If there is no element in the referred blob data, just return true.
+ // If there is no element in the referred blob data, just return.
if (blob_data->items().empty())
return;
@@ -105,30 +119,9 @@ void ResourceRequestBody::ResolveBlobReference(
// Append the elements in the referred blob data.
for (size_t i = 0; i < blob_data->items().size(); ++i) {
- elements->push_back(net::UploadElement());
- net::UploadElement& element = elements->back();
const BlobData::Item& item = blob_data->items().at(i);
- switch (item.type()) {
- case BlobData::Item::TYPE_BYTES:
- element.SetToSharedBytes(
- item.bytes() + static_cast<int>(item.offset()),
- static_cast<int>(item.length()));
- break;
- case BlobData::Item::TYPE_FILE:
- element.SetToFilePathRange(
- item.path(),
- item.offset(),
- item.length(),
- item.expected_modification_time());
- break;
- case BlobData::Item::TYPE_FILE_FILESYSTEM:
- // TODO(kinuko): Resolve FileSystemURL before creating UploadData.
- NOTREACHED();
- break;
- default:
- NOTREACHED();
- break;
- }
+ DCHECK_NE(BlobData::Item::TYPE_BLOB, item.type());
+ resolved_elements->push_back(&item);
}
}
« no previous file with comments | « webkit/glue/resource_request_body.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698