Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(198)

Unified Diff: content/browser/browser_context.cc

Issue 10600009: Support partitioning of storage contexts based on render_id. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: rebased Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698