| Index: content/browser/browser_context.cc
|
| diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc
|
| index 19dcf236104ed73e3bd5601d79d6cd48cc8a113c..fbf5a00c46d7e8a32bbe79b1bba9d969cc317ebf 100644
|
| --- a/content/browser/browser_context.cc
|
| +++ b/content/browser/browser_context.cc
|
| @@ -5,119 +5,78 @@
|
| #include "content/public/browser/browser_context.h"
|
|
|
| #include "content/browser/appcache/chrome_appcache_service.h"
|
| +#include "webkit/database/database_tracker.h"
|
| #include "content/browser/dom_storage/dom_storage_context_impl.h"
|
| #include "content/browser/download/download_file_manager.h"
|
| #include "content/browser/download/download_manager_impl.h"
|
| -#include "content/browser/fileapi/browser_file_system_helper.h"
|
| #include "content/browser/in_process_webkit/indexed_db_context_impl.h"
|
| #include "content/browser/renderer_host/resource_dispatcher_host_impl.h"
|
| -#include "content/browser/resource_context_impl.h"
|
| +#include "content/public/browser/resource_context.h"
|
| +#include "content/browser/storage_partition.h"
|
| +#include "content/browser/storage_partition_map.h"
|
| +#include "content/common/child_process_host_impl.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/content_browser_client.h"
|
| -#include "content/public/common/content_constants.h"
|
| #include "net/base/server_bound_cert_service.h"
|
| #include "net/base/server_bound_cert_store.h"
|
| #include "net/cookies/cookie_monster.h"
|
| #include "net/cookies/cookie_store.h"
|
| #include "net/url_request/url_request_context.h"
|
| -#include "webkit/database/database_tracker.h"
|
| -#include "webkit/quota/quota_manager.h"
|
|
|
| -using appcache::AppCacheService;
|
| using base::UserDataAdapter;
|
| -using content::BrowserThread;
|
| -using fileapi::FileSystemContext;
|
| -using quota::QuotaManager;
|
| -using webkit_database::DatabaseTracker;
|
|
|
| // Key names on BrowserContext.
|
| -static const char* kAppCacheServicKeyName = "content_appcache_service_tracker";
|
| -static const char* kDatabaseTrackerKeyName = "content_database_tracker";
|
| -static const char* kDOMStorageContextKeyName = "content_dom_storage_context";
|
| static const char* kDownloadManagerKeyName = "download_manager";
|
| -static const char* kFileSystemContextKeyName = "content_file_system_context";
|
| -static const char* kIndexedDBContextKeyName = "content_indexed_db_context";
|
| -static const char* kQuotaManagerKeyName = "content_quota_manager";
|
| +static const char* kStorageParitionMapKeyName = "content_storage_partition_map";
|
|
|
| namespace content {
|
|
|
| namespace {
|
|
|
| -void CreateQuotaManagerAndClients(BrowserContext* context) {
|
| - // 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));
|
| - if (context->GetUserData(kQuotaManagerKeyName)) {
|
| - DCHECK(context->GetUserData(kDatabaseTrackerKeyName));
|
| - DCHECK(context->GetUserData(kDOMStorageContextKeyName));
|
| - DCHECK(context->GetUserData(kFileSystemContextKeyName));
|
| - DCHECK(context->GetUserData(kIndexedDBContextKeyName));
|
| - return;
|
| +StoragePartition* GetStoragePartition(BrowserContext* browser_context,
|
| + int renderer_child_id) {
|
| + StoragePartitionMap* partition_map = static_cast<StoragePartitionMap*>(
|
| + browser_context->GetUserData(kStorageParitionMapKeyName));
|
| + if (!partition_map) {
|
| + partition_map = new StoragePartitionMap(browser_context);
|
| + browser_context->SetUserData(kStorageParitionMapKeyName, partition_map);
|
| }
|
|
|
| - // All of the clients have to be created and registered with the
|
| - // QuotaManager prior to the QuotaManger being used. So we do them
|
| - // all together here prior to handing out a reference to anything
|
| - // that utlizes the QuotaManager.
|
| - scoped_refptr<QuotaManager> quota_manager = new quota::QuotaManager(
|
| - context->IsOffTheRecord(), context->GetPath(),
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO),
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB),
|
| - context->GetSpecialStoragePolicy());
|
| - context->SetUserData(kQuotaManagerKeyName,
|
| - new UserDataAdapter<QuotaManager>(quota_manager));
|
| -
|
| - // Each consumer is responsible for registering its QuotaClient during
|
| - // its construction.
|
| - scoped_refptr<FileSystemContext> filesystem_context = CreateFileSystemContext(
|
| - context->GetPath(), context->IsOffTheRecord(),
|
| - context->GetSpecialStoragePolicy(), quota_manager->proxy());
|
| - context->SetUserData(
|
| - kFileSystemContextKeyName,
|
| - new UserDataAdapter<FileSystemContext>(filesystem_context));
|
| -
|
| - scoped_refptr<DatabaseTracker> db_tracker = new DatabaseTracker(
|
| - context->GetPath(), context->IsOffTheRecord(),
|
| - context->GetSpecialStoragePolicy(), quota_manager->proxy(),
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE));
|
| - context->SetUserData(kDatabaseTrackerKeyName,
|
| - new UserDataAdapter<DatabaseTracker>(db_tracker));
|
| -
|
| - FilePath path = context->IsOffTheRecord() ? FilePath() : context->GetPath();
|
| - scoped_refptr<DOMStorageContextImpl> dom_storage_context =
|
| - new DOMStorageContextImpl(path, context->GetSpecialStoragePolicy());
|
| - context->SetUserData(
|
| - kDOMStorageContextKeyName,
|
| - new UserDataAdapter<DOMStorageContextImpl>(dom_storage_context));
|
| -
|
| - scoped_refptr<IndexedDBContext> indexed_db_context = new IndexedDBContextImpl(
|
| - path, context->GetSpecialStoragePolicy(), quota_manager->proxy(),
|
| - BrowserThread::GetMessageLoopProxyForThread(
|
| - BrowserThread::WEBKIT_DEPRECATED));
|
| - context->SetUserData(
|
| - kIndexedDBContextKeyName,
|
| - new UserDataAdapter<IndexedDBContext>(indexed_db_context));
|
| -
|
| - scoped_refptr<ChromeAppCacheService> appcache_service =
|
| - new ChromeAppCacheService(quota_manager->proxy());
|
| - context->SetUserData(
|
| - kAppCacheServicKeyName,
|
| - new UserDataAdapter<ChromeAppCacheService>(appcache_service));
|
| -
|
| - InitializeResourceContext(context);
|
| -
|
| - // Check first to avoid memory leak in unittests.
|
| - if (BrowserThread::IsMessageLoopValid(BrowserThread::IO)) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&ChromeAppCacheService::InitializeOnIOThread,
|
| - appcache_service,
|
| - context->IsOffTheRecord() ? FilePath() :
|
| - context->GetPath().Append(content::kAppCacheDirname),
|
| - context->GetResourceContext(),
|
| - make_scoped_refptr(context->GetSpecialStoragePolicy())));
|
| + const std::string& partition_id =
|
| + GetContentClient()->browser()->GetStoragePartitionIdForChildProcess(
|
| + browser_context,
|
| + renderer_child_id);
|
| +
|
| + return partition_map->Get(partition_id);
|
| +}
|
| +
|
| +// Run |callback| on each storage partition in |browser_context|.
|
| +void ForEachStoragePartition(
|
| + BrowserContext* browser_context,
|
| + const base::Callback<void(StoragePartition*)>& callback) {
|
| + StoragePartitionMap* partition_map = static_cast<StoragePartitionMap*>(
|
| + browser_context->GetUserData(kStorageParitionMapKeyName));
|
| + if (!partition_map) {
|
| + return;
|
| }
|
| +
|
| + partition_map->ForEach(callback);
|
| +}
|
| +
|
| +// Used to convert a callback meant to take a DOMStorageContextImpl* into one
|
| +// that can take a StoragePartition*.
|
| +void ProcessDOMStorageContext(
|
| + const base::Callback<void(DOMStorageContextImpl*)>& callback,
|
| + StoragePartition* partition) {
|
| + callback.Run(partition->dom_storage_context());
|
| +}
|
| +
|
| +// Run |callback| on each DOMStorageContextImpl in |browser_context|.
|
| +void ForEachDOMStorageContext(
|
| + BrowserContext* browser_context,
|
| + const base::Callback<void(DOMStorageContextImpl*)>& callback) {
|
| + ForEachStoragePartition(browser_context,
|
| + base::Bind(&ProcessDOMStorageContext, callback));
|
| }
|
|
|
| void SaveSessionStateOnIOThread(ResourceContext* resource_context) {
|
| @@ -138,9 +97,10 @@ void PurgeMemoryOnIOThread(ResourceContext* resource_context) {
|
| ResourceContext::GetAppCacheService(resource_context)->PurgeMemory();
|
| }
|
|
|
| -DOMStorageContextImpl* GetDOMStorageContextImpl(BrowserContext* context) {
|
| +DOMStorageContextImpl* GetDefaultDOMStorageContextImpl(
|
| + BrowserContext* context) {
|
| return static_cast<DOMStorageContextImpl*>(
|
| - BrowserContext::GetDOMStorageContext(context));
|
| + BrowserContext::GetDefaultDOMStorageContext(context));
|
| }
|
|
|
| } // namespace
|
| @@ -170,42 +130,71 @@ DownloadManager* BrowserContext::GetDownloadManager(
|
| context, kDownloadManagerKeyName);
|
| }
|
|
|
| -QuotaManager* BrowserContext::GetQuotaManager(BrowserContext* context) {
|
| - CreateQuotaManagerAndClients(context);
|
| - return UserDataAdapter<QuotaManager>::Get(context, kQuotaManagerKeyName);
|
| +quota::QuotaManager* BrowserContext::GetQuotaManager(
|
| + BrowserContext* browser_context) {
|
| + // TODO(ajwong): Change this API to require a process id instead of using
|
| + // kInvalidChildProcessId.
|
| + StoragePartition* partition =
|
| + GetStoragePartition(browser_context,
|
| + ChildProcessHostImpl::kInvalidChildProcessId);
|
| + return partition->quota_manager();
|
| +}
|
| +
|
| +DOMStorageContext* BrowserContext::GetDefaultDOMStorageContext(
|
| + BrowserContext* browser_context) {
|
| + // TODO(ajwong): Force all users to know which process id they are performing
|
| + // actions on behalf of, migrate them to GetDOMStorageContext(), and then
|
| + // delete this function.
|
| + return GetDOMStorageContext(browser_context,
|
| + ChildProcessHostImpl::kInvalidChildProcessId);
|
| }
|
|
|
| DOMStorageContext* BrowserContext::GetDOMStorageContext(
|
| - BrowserContext* context) {
|
| - CreateQuotaManagerAndClients(context);
|
| - return UserDataAdapter<DOMStorageContextImpl>::Get(
|
| - context, kDOMStorageContextKeyName);
|
| + BrowserContext* browser_context,
|
| + int render_child_id) {
|
| + StoragePartition* partition =
|
| + GetStoragePartition(browser_context, render_child_id);
|
| + return partition->dom_storage_context();
|
| }
|
|
|
| -IndexedDBContext* BrowserContext::GetIndexedDBContext(BrowserContext* context) {
|
| - CreateQuotaManagerAndClients(context);
|
| - return UserDataAdapter<IndexedDBContext>::Get(
|
| - context, kIndexedDBContextKeyName);
|
| +IndexedDBContext* BrowserContext::GetIndexedDBContext(
|
| + BrowserContext* browser_context) {
|
| + // TODO(ajwong): Change this API to require a process id instead of using
|
| + // kInvalidChildProcessId.
|
| + StoragePartition* partition =
|
| + GetStoragePartition(browser_context,
|
| + ChildProcessHostImpl::kInvalidChildProcessId);
|
| + return partition->indexed_db_context();
|
| }
|
|
|
| -DatabaseTracker* BrowserContext::GetDatabaseTracker(BrowserContext* context) {
|
| - CreateQuotaManagerAndClients(context);
|
| - return UserDataAdapter<DatabaseTracker>::Get(
|
| - context, kDatabaseTrackerKeyName);
|
| +webkit_database::DatabaseTracker* BrowserContext::GetDatabaseTracker(
|
| + BrowserContext* browser_context) {
|
| + // TODO(ajwong): Change this API to require a process id instead of using
|
| + // kInvalidChildProcessId.
|
| + StoragePartition* partition =
|
| + GetStoragePartition(browser_context,
|
| + ChildProcessHostImpl::kInvalidChildProcessId);
|
| + return partition->database_tracker();
|
| }
|
|
|
| -AppCacheService* BrowserContext::GetAppCacheService(
|
| +appcache::AppCacheService* BrowserContext::GetAppCacheService(
|
| BrowserContext* browser_context) {
|
| - CreateQuotaManagerAndClients(browser_context);
|
| - return UserDataAdapter<ChromeAppCacheService>::Get(
|
| - browser_context, kAppCacheServicKeyName);
|
| + // TODO(ajwong): Change this API to require a process id instead of using
|
| + // kInvalidChildProcessId.
|
| + StoragePartition* partition =
|
| + GetStoragePartition(browser_context,
|
| + ChildProcessHostImpl::kInvalidChildProcessId);
|
| + return partition->appcache_service();
|
| }
|
|
|
| -FileSystemContext* BrowserContext::GetFileSystemContext(
|
| +fileapi::FileSystemContext* BrowserContext::GetFileSystemContext(
|
| BrowserContext* browser_context) {
|
| - CreateQuotaManagerAndClients(browser_context);
|
| - return UserDataAdapter<FileSystemContext>::Get(
|
| - browser_context, kFileSystemContextKeyName);
|
| + // TODO(ajwong): Change this API to require a process id instead of using
|
| + // kInvalidChildProcessId.
|
| + StoragePartition* partition =
|
| + GetStoragePartition(browser_context,
|
| + ChildProcessHostImpl::kInvalidChildProcessId);
|
| + return partition->filesystem_context();
|
| }
|
|
|
| void BrowserContext::EnsureResourceContextInitialized(BrowserContext* context) {
|
| @@ -213,9 +202,9 @@ void BrowserContext::EnsureResourceContextInitialized(BrowserContext* context) {
|
| // necessary, which initializes ResourceContext. The reason we don't call
|
| // ResourceContext::InitializeResourceContext directly here is that if
|
| // ResourceContext ends up initializing it will call back into BrowserContext
|
| - // and when that call return it'll end rewriting its UserData map (with the
|
| + // and when that call returns it'll end rewriting its UserData map (with the
|
| // same value) but this causes a race condition. See http://crbug.com/115678.
|
| - CreateQuotaManagerAndClients(context);
|
| + GetStoragePartition(context, ChildProcessHostImpl::kInvalidChildProcessId);
|
| }
|
|
|
| void BrowserContext::SaveSessionState(BrowserContext* browser_context) {
|
| @@ -228,7 +217,10 @@ void BrowserContext::SaveSessionState(BrowserContext* browser_context) {
|
| browser_context->GetResourceContext()));
|
| }
|
|
|
| - GetDOMStorageContextImpl(browser_context)->SetForceKeepSessionState();
|
| + // TODO(ajwong): This is the only usage of GetDefaultDOMStorageContextImpl().
|
| + // After we migrate this to support multiple DOMStorageContexts, don't forget
|
| + // to remove the GetDefaultDOMStorageContextImpl() function as well.
|
| + GetDefaultDOMStorageContextImpl(browser_context)->SetForceKeepSessionState();
|
|
|
| if (BrowserThread::IsMessageLoopValid(BrowserThread::WEBKIT_DEPRECATED)) {
|
| IndexedDBContextImpl* indexed_db = static_cast<IndexedDBContextImpl*>(
|
| @@ -248,22 +240,11 @@ void BrowserContext::PurgeMemory(BrowserContext* browser_context) {
|
| browser_context->GetResourceContext()));
|
| }
|
|
|
| - GetDOMStorageContextImpl(browser_context)->PurgeMemory();
|
| + ForEachDOMStorageContext(browser_context,
|
| + base::Bind(&DOMStorageContextImpl::PurgeMemory));
|
| }
|
|
|
| BrowserContext::~BrowserContext() {
|
| - // These message loop checks are just to avoid leaks in unittests.
|
| - if (GetUserData(kDatabaseTrackerKeyName) &&
|
| - BrowserThread::IsMessageLoopValid(BrowserThread::FILE)) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&webkit_database::DatabaseTracker::Shutdown,
|
| - GetDatabaseTracker(this)));
|
| - }
|
| -
|
| - if (GetUserData(kDOMStorageContextKeyName))
|
| - GetDOMStorageContextImpl(this)->Shutdown();
|
| -
|
| if (GetUserData(kDownloadManagerKeyName))
|
| GetDownloadManager(this)->Shutdown();
|
| }
|
|
|