| Index: content/common/webblobregistry_impl.cc
|
| ===================================================================
|
| --- content/common/webblobregistry_impl.cc (revision 102629)
|
| +++ 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,51 @@
|
|
|
| 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;
|
| + size_t data_size = data_item.data.size();
|
| + const char* data_ptr = data_item.data.data();
|
| + while (data_size) {
|
| + int chunk_size = static_cast<int>(
|
| + 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(
|
|
|