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

Side by Side Diff: chrome/browser/chrome_content_browser_client.cc

Issue 8677026: Update process sharing rules for hosted and isolated apps. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge to get ProcessMap fix. Created 9 years 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/extensions/isolated_app_browsertest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chrome_content_browser_client.h" 5 #include "chrome/browser/chrome_content_browser_client.h"
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 153
154 return true; 154 return true;
155 } 155 }
156 156
157 // Used by the GetPrivilegeRequiredByUrl() and GetProcessPrivilege() functions 157 // Used by the GetPrivilegeRequiredByUrl() and GetProcessPrivilege() functions
158 // below. Extension, and isolated apps require different privileges to be 158 // below. Extension, and isolated apps require different privileges to be
159 // granted to their RenderProcessHosts. This classification allows us to make 159 // granted to their RenderProcessHosts. This classification allows us to make
160 // sure URLs are served by hosts with the right set of privileges. 160 // sure URLs are served by hosts with the right set of privileges.
161 enum RenderProcessHostPrivilege { 161 enum RenderProcessHostPrivilege {
162 PRIV_NORMAL, 162 PRIV_NORMAL,
163 PRIV_HOSTED,
164 PRIV_ISOLATED,
163 PRIV_EXTENSION, 165 PRIV_EXTENSION,
164 PRIV_ISOLATED,
165 }; 166 };
166 167
167 RenderProcessHostPrivilege GetPrivilegeRequiredByUrl( 168 RenderProcessHostPrivilege GetPrivilegeRequiredByUrl(
168 const GURL& url, 169 const GURL& url,
169 ExtensionService* service) { 170 ExtensionService* service) {
170 // Default to a normal renderer cause it is lower privileged. This should only 171 // Default to a normal renderer cause it is lower privileged. This should only
171 // occur if the URL on a site instance is either malformed, or uninitialized. 172 // occur if the URL on a site instance is either malformed, or uninitialized.
172 // If it is malformed, then there is no need for better privileges anyways. 173 // If it is malformed, then there is no need for better privileges anyways.
173 // If it is uninitialized, but eventually settles on being an a scheme other 174 // If it is uninitialized, but eventually settles on being an a scheme other
174 // than normal webrenderer, the navigation logic will correct us out of band 175 // than normal webrenderer, the navigation logic will correct us out of band
175 // anyways. 176 // anyways.
176 if (!url.is_valid()) 177 if (!url.is_valid())
177 return PRIV_NORMAL; 178 return PRIV_NORMAL;
178 179
179 if (url.SchemeIs(chrome::kExtensionScheme)) { 180 if (url.SchemeIs(chrome::kExtensionScheme)) {
180 const Extension* extension = service->GetExtensionByURL(url); 181 const Extension* extension = service->GetExtensionByURL(url);
181 if (extension && extension->is_storage_isolated()) { 182 if (extension && extension->is_storage_isolated())
182 return PRIV_ISOLATED; 183 return PRIV_ISOLATED;
183 } 184 if (extension && extension->is_hosted_app())
185 return PRIV_HOSTED;
184 186
185 return PRIV_EXTENSION; 187 return PRIV_EXTENSION;
186 } 188 }
187 189
188 return PRIV_NORMAL; 190 return PRIV_NORMAL;
189 } 191 }
190 192
191 RenderProcessHostPrivilege GetProcessPrivilege( 193 RenderProcessHostPrivilege GetProcessPrivilege(
192 content::RenderProcessHost* process_host, 194 content::RenderProcessHost* process_host,
193 extensions::ProcessMap* process_map, 195 extensions::ProcessMap* process_map,
194 ExtensionService* service) { 196 ExtensionService* service) {
195 // TODO(aa): It seems like hosted apps should be grouped separately from
196 // extensions: crbug.com/102533.
197 std::set<std::string> extension_ids = 197 std::set<std::string> extension_ids =
198 process_map->GetExtensionsInProcess(process_host->GetID()); 198 process_map->GetExtensionsInProcess(process_host->GetID());
199 if (extension_ids.empty()) 199 if (extension_ids.empty())
200 return PRIV_NORMAL; 200 return PRIV_NORMAL;
201 201
202 for (std::set<std::string>::iterator iter = extension_ids.begin(); 202 for (std::set<std::string>::iterator iter = extension_ids.begin();
203 iter != extension_ids.end(); ++iter) { 203 iter != extension_ids.end(); ++iter) {
204 const Extension* extension = service->GetExtensionById(*iter, false); 204 const Extension* extension = service->GetExtensionById(*iter, false);
205 if (extension && extension->is_storage_isolated()) 205 if (extension && extension->is_storage_isolated())
206 return PRIV_ISOLATED; 206 return PRIV_ISOLATED;
207 if (extension && extension->is_hosted_app())
208 return PRIV_HOSTED;
207 } 209 }
208 210
209 return PRIV_EXTENSION; 211 return PRIV_EXTENSION;
210 } 212 }
211 213
214 bool IsIsolatedAppInProcess(const GURL& site_url,
215 content::RenderProcessHost* process_host,
216 extensions::ProcessMap* process_map,
217 ExtensionService* service) {
218 std::set<std::string> extension_ids =
219 process_map->GetExtensionsInProcess(process_host->GetID());
220 if (extension_ids.empty())
221 return false;
222
223 for (std::set<std::string>::iterator iter = extension_ids.begin();
224 iter != extension_ids.end(); ++iter) {
225 const Extension* extension = service->GetExtensionById(*iter, false);
226 if (extension &&
227 extension->is_storage_isolated() &&
228 extension->url() == site_url)
229 return true;
230 }
231
232 return false;
233 }
234
212 bool CertMatchesFilter(const net::X509Certificate& cert, 235 bool CertMatchesFilter(const net::X509Certificate& cert,
213 const base::DictionaryValue& filter) { 236 const base::DictionaryValue& filter) {
214 // TODO(markusheintz): This is the minimal required filter implementation. 237 // TODO(markusheintz): This is the minimal required filter implementation.
215 // Implement a better matcher. 238 // Implement a better matcher.
216 239
217 // An empty filter matches any client certificate since no requirements are 240 // An empty filter matches any client certificate since no requirements are
218 // specified at all. 241 // specified at all.
219 if (filter.empty()) 242 if (filter.empty())
220 return true; 243 return true;
221 244
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 // Experimental: 452 // Experimental:
430 // If --enable-strict-site-isolation is enabled, do not allow non-WebUI pages 453 // If --enable-strict-site-isolation is enabled, do not allow non-WebUI pages
431 // to share a renderer process. (We could allow pages from the same site or 454 // to share a renderer process. (We could allow pages from the same site or
432 // extensions of the same type to share, if we knew what the given process 455 // extensions of the same type to share, if we knew what the given process
433 // was dedicated to. Allowing no sharing is simpler for now.) This may 456 // was dedicated to. Allowing no sharing is simpler for now.) This may
434 // cause resource exhaustion issues if too many sites are open at once. 457 // cause resource exhaustion issues if too many sites are open at once.
435 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 458 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
436 if (command_line.HasSwitch(switches::kEnableStrictSiteIsolation)) 459 if (command_line.HasSwitch(switches::kEnableStrictSiteIsolation))
437 return false; 460 return false;
438 461
462 // An isolated app is only allowed to share with the exact same app in order
463 // to provide complete renderer process isolation. This also works around
464 // issue http://crbug.com/85588, where different isolated apps in the same
465 // process would end up using the first app's storage contexts.
466 RenderProcessHostPrivilege privilege_required =
467 GetPrivilegeRequiredByUrl(site_url, service);
468 if (privilege_required == PRIV_ISOLATED)
469 return IsIsolatedAppInProcess(site_url, process_host, process_map, service);
470
471 // Otherwise, just make sure the process privilege matches the privilege
472 // required by the site.
439 return GetProcessPrivilege(process_host, process_map, service) == 473 return GetProcessPrivilege(process_host, process_map, service) ==
440 GetPrivilegeRequiredByUrl(site_url, service); 474 privilege_required;
441 } 475 }
442 476
443 void ChromeContentBrowserClient::SiteInstanceGotProcess( 477 void ChromeContentBrowserClient::SiteInstanceGotProcess(
444 SiteInstance* site_instance) { 478 SiteInstance* site_instance) {
445 CHECK(site_instance->HasProcess()); 479 CHECK(site_instance->HasProcess());
446 480
447 Profile* profile = Profile::FromBrowserContext( 481 Profile* profile = Profile::FromBrowserContext(
448 site_instance->browsing_instance()->browser_context()); 482 site_instance->browsing_instance()->browser_context());
449 ExtensionService* service = profile->GetExtensionService(); 483 ExtensionService* service = profile->GetExtensionService();
450 if (!service) 484 if (!service)
(...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after
1177 #if defined(USE_NSS) 1211 #if defined(USE_NSS)
1178 crypto::CryptoModuleBlockingPasswordDelegate* 1212 crypto::CryptoModuleBlockingPasswordDelegate*
1179 ChromeContentBrowserClient::GetCryptoPasswordDelegate( 1213 ChromeContentBrowserClient::GetCryptoPasswordDelegate(
1180 const GURL& url) { 1214 const GURL& url) {
1181 return browser::NewCryptoModuleBlockingDialogDelegate( 1215 return browser::NewCryptoModuleBlockingDialogDelegate(
1182 browser::kCryptoModulePasswordKeygen, url.host()); 1216 browser::kCryptoModulePasswordKeygen, url.host());
1183 } 1217 }
1184 #endif 1218 #endif
1185 1219
1186 } // namespace chrome 1220 } // namespace chrome
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/extensions/isolated_app_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698