| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "webkit/glue/resource_request_body.h" | 5 #include "webkit/glue/resource_request_body.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "net/base/upload_data.h" | 8 #include "net/base/upload_data.h" |
| 9 #include "webkit/blob/blob_storage_controller.h" | 9 #include "webkit/blob/blob_storage_controller.h" |
| 10 | 10 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 void ResourceRequestBody::AppendFileSystemFileRange( | 39 void ResourceRequestBody::AppendFileSystemFileRange( |
| 40 const GURL& url, uint64 offset, uint64 length, | 40 const GURL& url, uint64 offset, uint64 length, |
| 41 const base::Time& expected_modification_time) { | 41 const base::Time& expected_modification_time) { |
| 42 elements_.push_back(Element()); | 42 elements_.push_back(Element()); |
| 43 elements_.back().SetToFileSystemUrlRange(url, offset, length, | 43 elements_.back().SetToFileSystemUrlRange(url, offset, length, |
| 44 expected_modification_time); | 44 expected_modification_time); |
| 45 } | 45 } |
| 46 | 46 |
| 47 net::UploadData* ResourceRequestBody::ResolveElementsAndCreateUploadData( | 47 net::UploadData* ResourceRequestBody::ResolveElementsAndCreateUploadData( |
| 48 BlobStorageController* blob_controller) { | 48 BlobStorageController* blob_controller) { |
| 49 // Resolve all blob elements. |
| 50 std::vector<const Element*> resolved_elements; |
| 51 for (size_t i = 0; i < elements_.size(); ++i) { |
| 52 const Element& element = elements_[i]; |
| 53 if (element.type() == Element::TYPE_BLOB) { |
| 54 ResolveBlobReference(blob_controller, element.url(), &resolved_elements); |
| 55 } else { |
| 56 // No need to resolve, just append the element. |
| 57 resolved_elements.push_back(&element); |
| 58 } |
| 59 } |
| 60 |
| 49 net::UploadData* upload_data = new net::UploadData; | 61 net::UploadData* upload_data = new net::UploadData; |
| 50 // We attach 'this' to UploadData so that we do not need to copy | 62 // We attach 'this' to UploadData so that we do not need to copy |
| 51 // bytes for TYPE_BYTES. | 63 // bytes for TYPE_BYTES. |
| 52 upload_data->SetUserData( | 64 upload_data->SetUserData( |
| 53 this, new base::UserDataAdapter<ResourceRequestBody>(this)); | 65 this, new base::UserDataAdapter<ResourceRequestBody>(this)); |
| 54 std::vector<net::UploadElement>* elements = | 66 std::vector<net::UploadElement>* elements = |
| 55 upload_data->elements_mutable(); | 67 upload_data->elements_mutable(); |
| 56 for (size_t i = 0; i < elements_.size(); ++i) { | 68 for (size_t i = 0; i < resolved_elements.size(); ++i) { |
| 57 const Element& element = elements_[i]; | 69 const Element& element = *resolved_elements[i]; |
| 58 switch (element.type()) { | 70 switch (element.type()) { |
| 59 case Element::TYPE_BYTES: | 71 case Element::TYPE_BYTES: |
| 60 elements->push_back(net::UploadElement()); | 72 elements->push_back(net::UploadElement()); |
| 61 elements->back().SetToSharedBytes(element.bytes(), element.length()); | 73 elements->back().SetToSharedBytes(element.bytes(), element.length()); |
| 62 break; | 74 break; |
| 63 case Element::TYPE_FILE: | 75 case Element::TYPE_FILE: |
| 64 elements->push_back(net::UploadElement()); | 76 elements->push_back(net::UploadElement()); |
| 65 elements->back().SetToFilePathRange( | 77 elements->back().SetToFilePathRange( |
| 66 element.path(), | 78 element.path(), |
| 67 element.offset(), | 79 element.offset(), |
| 68 element.length(), | 80 element.length(), |
| 69 element.expected_modification_time()); | 81 element.expected_modification_time()); |
| 70 break; | 82 break; |
| 71 case Element::TYPE_FILE_FILESYSTEM: | 83 case Element::TYPE_FILE_FILESYSTEM: |
| 72 // TODO(kinuko): Resolve FileSystemURL before creating UploadData. | 84 // TODO(kinuko): Resolve FileSystemURL before creating UploadData. |
| 73 NOTREACHED(); | 85 NOTREACHED(); |
| 74 break; | 86 break; |
| 75 case Element::TYPE_BLOB: | 87 case Element::TYPE_BLOB: |
| 76 ResolveBlobReference(blob_controller, element.url(), elements); | 88 // Blob elements should be resolved beforehand. |
| 89 NOTREACHED(); |
| 77 break; | 90 break; |
| 78 case Element::TYPE_UNKNOWN: | 91 case Element::TYPE_UNKNOWN: |
| 79 NOTREACHED(); | 92 NOTREACHED(); |
| 80 break; | 93 break; |
| 81 } | 94 } |
| 82 } | 95 } |
| 83 upload_data->set_identifier(identifier_); | 96 upload_data->set_identifier(identifier_); |
| 84 return upload_data; | 97 return upload_data; |
| 85 } | 98 } |
| 86 | 99 |
| 87 ResourceRequestBody::~ResourceRequestBody() {} | 100 ResourceRequestBody::~ResourceRequestBody() {} |
| 88 | 101 |
| 89 void ResourceRequestBody::ResolveBlobReference( | 102 void ResourceRequestBody::ResolveBlobReference( |
| 90 webkit_blob::BlobStorageController* blob_controller, | 103 webkit_blob::BlobStorageController* blob_controller, |
| 91 const GURL& blob_url, std::vector<net::UploadElement>* elements) { | 104 const GURL& blob_url, |
| 105 std::vector<const Element*>* resolved_elements) { |
| 92 DCHECK(blob_controller); | 106 DCHECK(blob_controller); |
| 93 BlobData* blob_data = blob_controller->GetBlobDataFromUrl(blob_url); | 107 BlobData* blob_data = blob_controller->GetBlobDataFromUrl(blob_url); |
| 94 DCHECK(blob_data); | 108 DCHECK(blob_data); |
| 95 if (!blob_data) | 109 if (!blob_data) |
| 96 return; | 110 return; |
| 97 | 111 |
| 98 // If there is no element in the referred blob data, just return true. | 112 // If there is no element in the referred blob data, just return. |
| 99 if (blob_data->items().empty()) | 113 if (blob_data->items().empty()) |
| 100 return; | 114 return; |
| 101 | 115 |
| 102 // Ensure the blob and any attached shareable files survive until | 116 // Ensure the blob and any attached shareable files survive until |
| 103 // upload completion. | 117 // upload completion. |
| 104 SetUserData(blob_data, new base::UserDataAdapter<BlobData>(blob_data)); | 118 SetUserData(blob_data, new base::UserDataAdapter<BlobData>(blob_data)); |
| 105 | 119 |
| 106 // Append the elements in the referred blob data. | 120 // Append the elements in the referred blob data. |
| 107 for (size_t i = 0; i < blob_data->items().size(); ++i) { | 121 for (size_t i = 0; i < blob_data->items().size(); ++i) { |
| 108 elements->push_back(net::UploadElement()); | |
| 109 net::UploadElement& element = elements->back(); | |
| 110 const BlobData::Item& item = blob_data->items().at(i); | 122 const BlobData::Item& item = blob_data->items().at(i); |
| 111 switch (item.type()) { | 123 DCHECK_NE(BlobData::Item::TYPE_BLOB, item.type()); |
| 112 case BlobData::Item::TYPE_BYTES: | 124 resolved_elements->push_back(&item); |
| 113 element.SetToSharedBytes( | |
| 114 item.bytes() + static_cast<int>(item.offset()), | |
| 115 static_cast<int>(item.length())); | |
| 116 break; | |
| 117 case BlobData::Item::TYPE_FILE: | |
| 118 element.SetToFilePathRange( | |
| 119 item.path(), | |
| 120 item.offset(), | |
| 121 item.length(), | |
| 122 item.expected_modification_time()); | |
| 123 break; | |
| 124 case BlobData::Item::TYPE_FILE_FILESYSTEM: | |
| 125 // TODO(kinuko): Resolve FileSystemURL before creating UploadData. | |
| 126 NOTREACHED(); | |
| 127 break; | |
| 128 default: | |
| 129 NOTREACHED(); | |
| 130 break; | |
| 131 } | |
| 132 } | 125 } |
| 133 } | 126 } |
| 134 | 127 |
| 135 } // namespace webkit_glue | 128 } // namespace webkit_glue |
| OLD | NEW |