Chromium Code Reviews| Index: content/browser/fileapi/chrome_blob_storage_context.cc |
| diff --git a/content/browser/fileapi/chrome_blob_storage_context.cc b/content/browser/fileapi/chrome_blob_storage_context.cc |
| index 97151a83f67426d6483882bb675f13a9deab6e32..a41a9e5e2f58e58859681b8cee671fd195bb3b70 100644 |
| --- a/content/browser/fileapi/chrome_blob_storage_context.cc |
| +++ b/content/browser/fileapi/chrome_blob_storage_context.cc |
| @@ -5,8 +5,10 @@ |
| #include "content/browser/fileapi/chrome_blob_storage_context.h" |
| #include "base/bind.h" |
| +#include "base/guid.h" |
| #include "content/public/browser/browser_context.h" |
| #include "content/public/browser/browser_thread.h" |
| +#include "webkit/browser/blob/blob_data_handle.h" |
| #include "webkit/browser/blob/blob_storage_context.h" |
| using base::UserDataAdapter; |
| @@ -14,6 +16,26 @@ using webkit_blob::BlobStorageContext; |
| namespace content { |
| +namespace { |
| + |
| +class BlobHandleImpl : public BlobHandle { |
| + public: |
| + BlobHandleImpl(scoped_ptr<webkit_blob::BlobDataHandle> handle) |
| + : handle_(handle.Pass()) { |
| + } |
| + |
| + virtual ~BlobHandleImpl() {} |
| + |
| + virtual std::string uuid() OVERRIDE { |
| + return handle_->uuid(); |
| + } |
| + |
| + private: |
| + scoped_ptr<webkit_blob::BlobDataHandle> handle_; |
| +}; |
| + |
| +} // namespace |
| + |
| static const char* kBlobStorageContextKeyName = "content_blob_storage_context"; |
| ChromeBlobStorageContext::ChromeBlobStorageContext() {} |
| @@ -43,8 +65,32 @@ void ChromeBlobStorageContext::InitializeOnIOThread() { |
| context_.reset(new BlobStorageContext()); |
| } |
| +void ChromeBlobStorageContext::CreateMemoryBackedBlob( |
| + const char* data, size_t length, const BlobCallback& callback) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + BrowserThread::PostTaskAndReplyWithResult( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&ChromeBlobStorageContext::CreateMemoryBackedBlobOnIOThread, |
| + this, data, length, callback), |
| + callback); |
| +} |
| + |
| ChromeBlobStorageContext::~ChromeBlobStorageContext() {} |
| +scoped_ptr<BlobHandle> |
| +ChromeBlobStorageContext::CreateMemoryBackedBlobOnIOThread( |
| + const char* data, size_t length, const BlobCallback& callback) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + std::string uuid(base::GenerateGUID()); |
| + scoped_refptr<webkit_blob::BlobData> blob_data = |
| + new webkit_blob::BlobData(uuid); |
| + blob_data->AppendData(data, length); |
| + scoped_ptr<BlobHandle> blob_handle( |
| + new BlobHandleImpl(context_->AddFinishedBlob(blob_data.get()).Pass())); |
|
michaeln
2014/05/12 22:43:17
AddFinishedBlob can return NULL is some cases, i t
tommycli
2014/05/12 23:35:05
Done.
|
| + return blob_handle.Pass(); |
| +} |
| + |
| void ChromeBlobStorageContext::DeleteOnCorrectThread() const { |
| if (BrowserThread::IsMessageLoopValid(BrowserThread::IO) && |
| !BrowserThread::CurrentlyOn(BrowserThread::IO)) { |