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 "content/public/browser/browser_context.h"
9#include "content/public/browser/browser_thread.h"
10#include "webkit/browser/blob/blob_storage_context.h"
11
12using base::UserDataAdapter;
13using webkit_blob::BlobStorageContext;
14
15namespace content {
16
17static const char* kBlobStorageContextKeyName = "content_blob_storage_context";
18
19ChromeBlobStorageContext::ChromeBlobStorageContext() {}
20
21ChromeBlobStorageContext* ChromeBlobStorageContext::GetFor(
22    BrowserContext* context) {
23  if (!context->GetUserData(kBlobStorageContextKeyName)) {
24    scoped_refptr<ChromeBlobStorageContext> blob =
25        new ChromeBlobStorageContext();
26    context->SetUserData(
27        kBlobStorageContextKeyName,
28        new UserDataAdapter<ChromeBlobStorageContext>(blob.get()));
29    // Check first to avoid memory leak in unittests.
30    if (BrowserThread::IsMessageLoopValid(BrowserThread::IO)) {
31      BrowserThread::PostTask(
32          BrowserThread::IO, FROM_HERE,
33          base::Bind(&ChromeBlobStorageContext::InitializeOnIOThread, blob));
34    }
35  }
36
37  return UserDataAdapter<ChromeBlobStorageContext>::Get(
38      context, kBlobStorageContextKeyName);
39}
40
41void ChromeBlobStorageContext::InitializeOnIOThread() {
42  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
43  context_.reset(new BlobStorageContext());
44}
45
46ChromeBlobStorageContext::~ChromeBlobStorageContext() {}
47
48void ChromeBlobStorageContext::DeleteOnCorrectThread() const {
49  if (BrowserThread::IsMessageLoopValid(BrowserThread::IO) &&
50      !BrowserThread::CurrentlyOn(BrowserThread::IO)) {
51    BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, this);
52    return;
53  }
54  delete this;
55}
56
57}  // namespace content
58