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
3 // found in the LICENSE file.
5 #include "content/browser/fileapi/chrome_blob_storage_context.h"
9 #include "content/public/browser/blob_handle.h"
10 #include "content/public/browser/browser_context.h"
11 #include "content/public/browser/browser_thread.h"
12 #include "webkit/browser/blob/blob_data_handle.h"
13 #include "webkit/browser/blob/blob_storage_context.h"
15 using base::UserDataAdapter;
16 using webkit_blob::BlobStorageContext;
22 class BlobHandleImpl : public BlobHandle {
24 BlobHandleImpl(scoped_ptr<webkit_blob::BlobDataHandle> handle)
25 : handle_(handle.Pass()) {
28 virtual ~BlobHandleImpl() {}
30 virtual std::string GetUUID() OVERRIDE {
31 return handle_->uuid();
35 scoped_ptr<webkit_blob::BlobDataHandle> handle_;
40 static const char* kBlobStorageContextKeyName = "content_blob_storage_context";
42 ChromeBlobStorageContext::ChromeBlobStorageContext() {}
44 ChromeBlobStorageContext* ChromeBlobStorageContext::GetFor(
45 BrowserContext* context) {
46 if (!context->GetUserData(kBlobStorageContextKeyName)) {
47 scoped_refptr<ChromeBlobStorageContext> blob =
48 new ChromeBlobStorageContext();
50 kBlobStorageContextKeyName,
51 new UserDataAdapter<ChromeBlobStorageContext>(blob.get()));
52 // Check first to avoid memory leak in unittests.
53 if (BrowserThread::IsMessageLoopValid(BrowserThread::IO)) {
54 BrowserThread::PostTask(
55 BrowserThread::IO, FROM_HERE,
56 base::Bind(&ChromeBlobStorageContext::InitializeOnIOThread, blob));
60 return UserDataAdapter<ChromeBlobStorageContext>::Get(
61 context, kBlobStorageContextKeyName);
64 void ChromeBlobStorageContext::InitializeOnIOThread() {
65 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
66 context_.reset(new BlobStorageContext());
69 scoped_ptr<BlobHandle> ChromeBlobStorageContext::CreateMemoryBackedBlob(
70 const char* data, size_t length) {
71 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
73 std::string uuid(base::GenerateGUID());
74 scoped_refptr<webkit_blob::BlobData> blob_data =
75 new webkit_blob::BlobData(uuid);
76 blob_data->AppendData(data, length);
78 scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle =
79 context_->AddFinishedBlob(blob_data.get());
80 if (!blob_data_handle)
81 return scoped_ptr<BlobHandle>();
83 scoped_ptr<BlobHandle> blob_handle(
84 new BlobHandleImpl(blob_data_handle.Pass()));
85 return blob_handle.Pass();
88 ChromeBlobStorageContext::~ChromeBlobStorageContext() {}
90 void ChromeBlobStorageContext::DeleteOnCorrectThread() const {
91 if (BrowserThread::IsMessageLoopValid(BrowserThread::IO) &&
92 !BrowserThread::CurrentlyOn(BrowserThread::IO)) {
93 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, this);
99 } // namespace content