// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/browser/storage_partition_impl.h" #include "content/browser/fileapi/browser_file_system_helper.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "webkit/database/database_tracker.h" #include "webkit/quota/quota_manager.h" namespace content { StoragePartitionImpl::StoragePartitionImpl( const FilePath& partition_path, quota::QuotaManager* quota_manager, ChromeAppCacheService* appcache_service, fileapi::FileSystemContext* filesystem_context, webkit_database::DatabaseTracker* database_tracker, DOMStorageContextImpl* dom_storage_context, IndexedDBContextImpl* indexed_db_context) : partition_path_(partition_path), quota_manager_(quota_manager), appcache_service_(appcache_service), filesystem_context_(filesystem_context), database_tracker_(database_tracker), dom_storage_context_(dom_storage_context), indexed_db_context_(indexed_db_context) { } StoragePartitionImpl::~StoragePartitionImpl() { // These message loop checks are just to avoid leaks in unittests. if (GetDatabaseTracker() && BrowserThread::IsMessageLoopValid(BrowserThread::FILE)) { BrowserThread::PostTask( BrowserThread::FILE, FROM_HERE, base::Bind(&webkit_database::DatabaseTracker::Shutdown, GetDatabaseTracker())); } if (GetDOMStorageContext()) GetDOMStorageContext()->Shutdown(); } // TODO(ajwong): Break the direct dependency on |context|. We only // need 3 pieces of info from it. StoragePartitionImpl* StoragePartitionImpl::Create( BrowserContext* context, const FilePath& partition_path) { // Ensure that these methods are called on the UI thread, except for // unittests where a UI thread might not have been created. DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || !BrowserThread::IsMessageLoopValid(BrowserThread::UI)); // All of the clients have to be created and registered with the // QuotaManager prior to the QuotaManger being used. We do them // all together here prior to handing out a reference to anything // that utilizes the QuotaManager. scoped_refptr quota_manager = new quota::QuotaManager( context->IsOffTheRecord(), partition_path, BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB), context->GetSpecialStoragePolicy()); // Each consumer is responsible for registering its QuotaClient during // its construction. scoped_refptr filesystem_context = CreateFileSystemContext(partition_path, context->IsOffTheRecord(), context->GetSpecialStoragePolicy(), quota_manager->proxy()); scoped_refptr database_tracker = new webkit_database::DatabaseTracker( partition_path, context->IsOffTheRecord(), context->GetSpecialStoragePolicy(), quota_manager->proxy(), BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)); FilePath path = context->IsOffTheRecord() ? FilePath() : partition_path; scoped_refptr dom_storage_context = new DOMStorageContextImpl(path, context->GetSpecialStoragePolicy()); scoped_refptr indexed_db_context = new IndexedDBContextImpl(path, context->GetSpecialStoragePolicy(), quota_manager->proxy(), BrowserThread::GetMessageLoopProxyForThread( BrowserThread::WEBKIT_DEPRECATED)); scoped_refptr appcache_service = new ChromeAppCacheService(quota_manager->proxy()); return new StoragePartitionImpl(partition_path, quota_manager, appcache_service, filesystem_context, database_tracker, dom_storage_context, indexed_db_context); } quota::QuotaManager* StoragePartitionImpl::GetQuotaManager() { return quota_manager_; } ChromeAppCacheService* StoragePartitionImpl::GetAppCacheService() { return appcache_service_; } fileapi::FileSystemContext* StoragePartitionImpl::GetFileSystemContext() { return filesystem_context_; } webkit_database::DatabaseTracker* StoragePartitionImpl::GetDatabaseTracker() { return database_tracker_; } DOMStorageContextImpl* StoragePartitionImpl::GetDOMStorageContext() { return dom_storage_context_; } IndexedDBContextImpl* StoragePartitionImpl::GetIndexedDBContext() { return indexed_db_context_; } } // namespace content