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