Chromium Code Reviews| Index: content/common/webblobregistry_impl.cc |
| =================================================================== |
| --- content/common/webblobregistry_impl.cc (revision 102191) |
| +++ content/common/webblobregistry_impl.cc (working copy) |
| @@ -10,6 +10,7 @@ |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h" |
| #include "webkit/blob/blob_data.h" |
| +#include "webkit/glue/webkit_glue.h" |
| using WebKit::WebBlobData; |
| using WebKit::WebString; |
| @@ -24,9 +25,50 @@ |
| void WebBlobRegistryImpl::registerBlobURL( |
| const WebURL& url, WebBlobData& data) { |
| - scoped_refptr<webkit_blob::BlobData> blob_data( |
| - new webkit_blob::BlobData(data)); |
| - sender_->Send(new BlobHostMsg_RegisterBlobUrl(url, blob_data)); |
| + sender_->Send(new BlobHostMsg_RegisterUnfinalizedBlobUrl(url)); |
| + size_t i = 0; |
| + WebBlobData::Item data_item; |
| + while (data.itemAt(i++, data_item)) { |
| + webkit_blob::BlobData::Item item; |
| + switch (data_item.type) { |
| + case WebBlobData::Item::TypeData: { |
| + // WebBlobData does not allow partial data. |
| + DCHECK(!data_item.offset && data_item.length == -1); |
| + const size_t kMaxDataChunkSize = 5 * 1024 * 1024; |
|
jianli
2011/09/23 23:00:42
Why do we need to enforce this size constraint?
I
michaeln
2011/09/24 01:15:24
It's not truncated? There are a series of BlobHost
jianli
2011/09/27 01:12:18
Got it. Could you please add comment for this so t
michaeln
2011/09/27 23:27:31
Done.
|
| + size_t data_size = data_item.data.size(); |
| + const char* data_ptr = data_item.data.data(); |
| + while (data_size) { |
| + size_t chunk_size = std::min(data_size, kMaxDataChunkSize); |
| + item.SetToData(data_ptr, chunk_size); |
| + data_size -= chunk_size; |
| + data_ptr += chunk_size; |
| + sender_->Send(new BlobHostMsg_AppendBlobDataItem(url, item)); |
| + } |
| + break; |
| + } |
| + case WebBlobData::Item::TypeFile: |
| + item.SetToFile( |
| + webkit_glue::WebStringToFilePath(data_item.filePath), |
| + static_cast<uint64>(data_item.offset), |
| + static_cast<uint64>(data_item.length), |
| + base::Time::FromDoubleT(data_item.expectedModificationTime)); |
| + sender_->Send(new BlobHostMsg_AppendBlobDataItem(url, item)); |
| + break; |
| + case WebBlobData::Item::TypeBlob: |
| + if (data_item.length) { |
| + item.SetToBlob( |
| + data_item.blobURL, |
| + static_cast<uint64>(data_item.offset), |
| + static_cast<uint64>(data_item.length)); |
| + } |
| + sender_->Send(new BlobHostMsg_AppendBlobDataItem(url, item)); |
| + break; |
| + default: |
| + NOTREACHED(); |
| + } |
| + } |
| + sender_->Send(new BlobHostMsg_FinalizeBlob( |
| + url, data.contentType().utf8().data())); |
| } |
| void WebBlobRegistryImpl::registerBlobURL( |