Chromium Code Reviews| 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 51655428fd4a9499cc25e3ad85c48374b3ff9163..552375366026a867c198bcd804c31592179d0780 100644 |
| --- a/chrome/browser/chrome_content_browser_client.cc |
| +++ b/chrome/browser/chrome_content_browser_client.cc |
| @@ -163,8 +163,9 @@ bool HandleWebUI(GURL* url, content::BrowserContext* browser_context) { |
| // sure URLs are served by hosts with the right set of privileges. |
| enum RenderProcessHostPrivilege { |
| PRIV_NORMAL, |
| - PRIV_EXTENSION, |
| + PRIV_HOSTED, |
| PRIV_ISOLATED, |
| + PRIV_EXTENSION, |
| }; |
| RenderProcessHostPrivilege GetPrivilegeRequiredByUrl( |
| @@ -181,9 +182,10 @@ RenderProcessHostPrivilege GetPrivilegeRequiredByUrl( |
| if (url.SchemeIs(chrome::kExtensionScheme)) { |
| const Extension* extension = service->GetExtensionByURL(url); |
| - if (extension && extension->is_storage_isolated()) { |
| + if (extension && extension->is_storage_isolated()) |
| return PRIV_ISOLATED; |
| - } |
| + if (extension && extension->is_hosted_app()) |
| + return PRIV_HOSTED; |
| return PRIV_EXTENSION; |
| } |
| @@ -195,8 +197,6 @@ RenderProcessHostPrivilege GetProcessPrivilege( |
| content::RenderProcessHost* process_host, |
| extensions::ProcessMap* process_map, |
| ExtensionService* service) { |
| - // TODO(aa): It seems like hosted apps should be grouped separately from |
| - // extensions: crbug.com/102533. |
| std::set<std::string> extension_ids = |
| process_map->GetExtensionsInProcess(process_host->GetID()); |
| if (extension_ids.empty()) |
| @@ -207,11 +207,34 @@ RenderProcessHostPrivilege GetProcessPrivilege( |
| const Extension* extension = service->GetExtensionById(*iter, false); |
| if (extension && extension->is_storage_isolated()) |
| return PRIV_ISOLATED; |
| + if (extension && extension->is_hosted_app()) |
| + return PRIV_HOSTED; |
| } |
| return PRIV_EXTENSION; |
| } |
| +bool IsIsolatedAppInProcess(const GURL& site_url, |
| + content::RenderProcessHost* process_host, |
| + extensions::ProcessMap* process_map, |
| + ExtensionService* service) { |
| + std::set<std::string> extension_ids = |
| + process_map->GetExtensionsInProcess(process_host->GetID()); |
| + if (extension_ids.empty()) |
| + return false; |
| + |
| + for (std::set<std::string>::iterator iter = extension_ids.begin(); |
| + iter != extension_ids.end(); ++iter) { |
| + const Extension* extension = service->GetExtensionById(*iter, false); |
| + if (extension && |
| + extension->url() == site_url && |
| + extension->is_storage_isolated()) |
|
awong
2011/11/24 00:03:49
nit: check is_storage_isolated() first. Might as
Charlie Reis
2011/11/24 00:26:45
Done.
|
| + return true; |
| + } |
| + |
| + return false; |
| +} |
| + |
| } // namespace |
| namespace chrome { |
| @@ -421,8 +444,16 @@ bool ChromeContentBrowserClient::IsSuitableHost( |
| if (command_line.HasSwitch(switches::kEnableStrictSiteIsolation)) |
| return false; |
| - return GetProcessPrivilege(process_host, process_map, service) == |
| + // An isolated app is only allowed to share with the exact same app. |
|
awong
2011/11/24 00:03:49
Add short sentence for why?
Charlie Reis
2011/11/24 00:26:45
Done.
|
| + RenderProcessHostPrivilege privilege_required = |
| GetPrivilegeRequiredByUrl(site_url, service); |
| + if (privilege_required == PRIV_ISOLATED) |
| + return IsIsolatedAppInProcess(site_url, process_host, process_map, service); |
|
awong
2011/11/24 00:03:49
Sad that we have to double-iterate the extension m
Charlie Reis
2011/11/24 00:26:45
We don't, do we? We either iterate it in IsIsolat
awong
2011/11/24 00:31:28
You're right...I'm just mis-reading.
|
| + |
| + // Otherwise, just make sure the process privilege matches the privilege |
| + // required by the site. |
| + return GetProcessPrivilege(process_host, process_map, service) == |
| + privilege_required; |
| } |
| void ChromeContentBrowserClient::SiteInstanceGotProcess( |