Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / browser / fileapi / chrome_blob_storage_context.cc
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.
4
5 #include "content/browser/fileapi/chrome_blob_storage_context.h"
6
7 #include "base/bind.h"
8 #include "base/guid.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 "storage/browser/blob/blob_data_handle.h"
13 #include "storage/browser/blob/blob_storage_context.h"
14
15 using base::UserDataAdapter;
16 using storage::BlobStorageContext;
17
18 namespace content {
19
20 namespace {
21
22 const char kBlobStorageContextKeyName[] = "content_blob_storage_context";
23
24 class BlobHandleImpl : public BlobHandle {
25  public:
26   explicit BlobHandleImpl(scoped_ptr<storage::BlobDataHandle> handle)
27       : handle_(handle.Pass()) {
28   }
29
30   ~BlobHandleImpl() override {}
31
32   std::string GetUUID() override { return handle_->uuid(); }
33
34  private:
35   scoped_ptr<storage::BlobDataHandle> handle_;
36 };
37
38 }  // namespace
39
40 ChromeBlobStorageContext::ChromeBlobStorageContext() {}
41
42 ChromeBlobStorageContext* ChromeBlobStorageContext::GetFor(
43     BrowserContext* context) {
44   if (!context->GetUserData(kBlobStorageContextKeyName)) {
45     scoped_refptr<ChromeBlobStorageContext> blob =
46         new ChromeBlobStorageContext();
47     context->SetUserData(
48         kBlobStorageContextKeyName,
49         new UserDataAdapter<ChromeBlobStorageContext>(blob.get()));
50     // Check first to avoid memory leak in unittests.
51     if (BrowserThread::IsMessageLoopValid(BrowserThread::IO)) {
52       BrowserThread::PostTask(
53           BrowserThread::IO, FROM_HERE,
54           base::Bind(&ChromeBlobStorageContext::InitializeOnIOThread, blob));
55     }
56   }
57
58   return UserDataAdapter<ChromeBlobStorageContext>::Get(
59       context, kBlobStorageContextKeyName);
60 }
61
62 void ChromeBlobStorageContext::InitializeOnIOThread() {
63   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
64   context_.reset(new BlobStorageContext());
65 }
66
67 scoped_ptr<BlobHandle> ChromeBlobStorageContext::CreateMemoryBackedBlob(
68     const char* data, size_t length) {
69   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
70
71   std::string uuid(base::GenerateGUID());
72   scoped_refptr<storage::BlobData> blob_data = new storage::BlobData(uuid);
73   blob_data->AppendData(data, length);
74
75   scoped_ptr<storage::BlobDataHandle> blob_data_handle =
76       context_->AddFinishedBlob(blob_data.get());
77   if (!blob_data_handle)
78     return scoped_ptr<BlobHandle>();
79
80   scoped_ptr<BlobHandle> blob_handle(
81       new BlobHandleImpl(blob_data_handle.Pass()));
82   return blob_handle.Pass();
83 }
84
85 ChromeBlobStorageContext::~ChromeBlobStorageContext() {}
86
87 void ChromeBlobStorageContext::DeleteOnCorrectThread() const {
88   if (BrowserThread::IsMessageLoopValid(BrowserThread::IO) &&
89       !BrowserThread::CurrentlyOn(BrowserThread::IO)) {
90     BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, this);
91     return;
92   }
93   delete this;
94 }
95
96 }  // namespace content