Index: chrome/browser/chrome_content_browser_client.cc |
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc |
index d45f4df51a35ffe34f69b4c7e5f045158492940d..f34a66946bc3aa300ad4efe07b4496313a6246fd 100644 |
--- a/chrome/browser/chrome_content_browser_client.cc |
+++ b/chrome/browser/chrome_content_browser_client.cc |
@@ -413,14 +413,64 @@ std::string ChromeContentBrowserClient::GetStoragePartitionIdForChildProcess( |
Profile* profile = Profile::FromBrowserContext(browser_context); |
ExtensionService* extension_service = |
extensions::ExtensionSystem::Get(profile)->extension_service(); |
+ std::string partition_id; |
if (extension_service) { |
const extensions::Extension* installed_app = extension_service-> |
GetInstalledAppForRenderer(child_process_id); |
Charlie Reis
2012/08/06 20:38:30
Huh, this API doesn't make sense. There can be mu
|
if (installed_app && installed_app->is_storage_isolated()) { |
- return installed_app->id(); |
+ partition_id = installed_app->id(); |
} |
} |
- return std::string(); |
+ |
+ // Enforce that IsValidStoragePartitionId() implementation stays in sync. |
+ DCHECK(IsValidStoragePartitionId(browser_context, partition_id)); |
+ return partition_id; |
+} |
+ |
+std::string ChromeContentBrowserClient::GetStoragePartitionIdForSiteInstance( |
+ content::BrowserContext* browser_context, |
+ SiteInstance* instance) { |
+ // In chrome, we use the extension ID as the partition ID. This works well |
+ // because the extension ID fits the partition ID pattern and currently only |
+ // apps can designate that storage should be isolated. |
+ Profile* profile = Profile::FromBrowserContext(browser_context); |
+ ExtensionService* extension_service = |
+ extensions::ExtensionSystem::Get(profile)->extension_service(); |
+ std::string partition_id; |
+ if (extension_service) { |
+ const Extension* extension = extension_service->extensions()-> |
+ GetExtensionOrAppByURL(ExtensionURLInfo(instance->GetSite())); |
Charlie Reis
2012/08/06 20:38:30
These two functions are identical except in how th
awong
2012/08/08 18:08:28
I'm not sure how I'd extract something that wouldn
Charlie Reis
2012/08/13 19:39:21
Even if we're just sharing the last few lines and
awong
2012/08/13 21:29:19
Done.
|
+ if (extension && extension->is_storage_isolated()) { |
+ partition_id = extension->id(); |
+ } |
+ } |
+ |
+ // Enforce that IsValidStoragePartitionId() implementation stays in sync. |
+ DCHECK(IsValidStoragePartitionId(browser_context, partition_id)); |
+ return partition_id; |
+} |
+ |
+bool ChromeContentBrowserClient::IsValidStoragePartitionId( |
+ content::BrowserContext* browser_context, |
+ const std::string& partition_id) { |
+ // The default ID is empty which is always allowed. |
+ if (partition_id.empty()) { |
Charlie Reis
2012/08/06 20:38:30
nit: No braces.
awong
2012/08/08 18:08:28
Done.
|
+ return true; |
+ } |
+ |
+ // If it isn't empty, then it must belong to an extension of some sort. Parse |
+ // out the extension ID and make sure it is still installed. |
+ Profile* profile = Profile::FromBrowserContext(browser_context); |
+ ExtensionService* extension_service = |
+ extensions::ExtensionSystem::Get(profile)->extension_service(); |
+ if (!extension_service) { |
+ // No extension service means no storage partitions in Chrome. |
+ return false; |
+ } |
+ |
+ // See if we can find an extension. The |partition_id| is the extension ID so |
+ // no parsing needed to be done. |
+ return extension_service->GetExtensionById(partition_id, false) != NULL; |
} |
content::WebContentsViewDelegate* |