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..2bb445397c4915f5864184112d6c4ff30258e6b2 100644 |
--- a/content/browser/fileapi/chrome_blob_storage_context.cc |
+++ b/content/browser/fileapi/chrome_blob_storage_context.cc |
@@ -5,8 +5,11 @@ |
#include "content/browser/fileapi/chrome_blob_storage_context.h" |
#include "base/bind.h" |
+#include "base/guid.h" |
+#include "content/public/browser/blob_handle.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 +17,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 +66,38 @@ 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<webkit_blob::BlobDataHandle> blob_data_handle = |
+ context_->AddFinishedBlob(blob_data.get()); |
+ if (!blob_data_handle) |
+ return scoped_ptr<BlobHandle>(); |
+ |
+ scoped_ptr<BlobHandle> blob_handle( |
+ new BlobHandleImpl(blob_data_handle.Pass())); |
+ return blob_handle.Pass(); |
+} |
+ |
void ChromeBlobStorageContext::DeleteOnCorrectThread() const { |
if (BrowserThread::IsMessageLoopValid(BrowserThread::IO) && |
!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |