OLD | NEW |
---|---|
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 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
156 | 156 |
157 return true; | 157 return true; |
158 } | 158 } |
159 | 159 |
160 // Used by the GetPrivilegeRequiredByUrl() and GetProcessPrivilege() functions | 160 // Used by the GetPrivilegeRequiredByUrl() and GetProcessPrivilege() functions |
161 // below. Extension, and isolated apps require different privileges to be | 161 // below. Extension, and isolated apps require different privileges to be |
162 // granted to their RenderProcessHosts. This classification allows us to make | 162 // granted to their RenderProcessHosts. This classification allows us to make |
163 // sure URLs are served by hosts with the right set of privileges. | 163 // sure URLs are served by hosts with the right set of privileges. |
164 enum RenderProcessHostPrivilege { | 164 enum RenderProcessHostPrivilege { |
165 PRIV_NORMAL, | 165 PRIV_NORMAL, |
166 PRIV_HOSTED, | |
167 PRIV_ISOLATED, | |
166 PRIV_EXTENSION, | 168 PRIV_EXTENSION, |
167 PRIV_ISOLATED, | |
168 }; | 169 }; |
169 | 170 |
170 RenderProcessHostPrivilege GetPrivilegeRequiredByUrl( | 171 RenderProcessHostPrivilege GetPrivilegeRequiredByUrl( |
171 const GURL& url, | 172 const GURL& url, |
172 ExtensionService* service) { | 173 ExtensionService* service) { |
173 // Default to a normal renderer cause it is lower privileged. This should only | 174 // Default to a normal renderer cause it is lower privileged. This should only |
174 // occur if the URL on a site instance is either malformed, or uninitialized. | 175 // occur if the URL on a site instance is either malformed, or uninitialized. |
175 // If it is malformed, then there is no need for better privileges anyways. | 176 // If it is malformed, then there is no need for better privileges anyways. |
176 // If it is uninitialized, but eventually settles on being an a scheme other | 177 // If it is uninitialized, but eventually settles on being an a scheme other |
177 // than normal webrenderer, the navigation logic will correct us out of band | 178 // than normal webrenderer, the navigation logic will correct us out of band |
178 // anyways. | 179 // anyways. |
179 if (!url.is_valid()) | 180 if (!url.is_valid()) |
180 return PRIV_NORMAL; | 181 return PRIV_NORMAL; |
181 | 182 |
182 if (url.SchemeIs(chrome::kExtensionScheme)) { | 183 if (url.SchemeIs(chrome::kExtensionScheme)) { |
183 const Extension* extension = service->GetExtensionByURL(url); | 184 const Extension* extension = service->GetExtensionByURL(url); |
184 if (extension && extension->is_storage_isolated()) { | 185 if (extension && extension->is_storage_isolated()) |
185 return PRIV_ISOLATED; | 186 return PRIV_ISOLATED; |
186 } | 187 if (extension && extension->is_hosted_app()) |
188 return PRIV_HOSTED; | |
187 | 189 |
188 return PRIV_EXTENSION; | 190 return PRIV_EXTENSION; |
189 } | 191 } |
190 | 192 |
191 return PRIV_NORMAL; | 193 return PRIV_NORMAL; |
192 } | 194 } |
193 | 195 |
194 RenderProcessHostPrivilege GetProcessPrivilege( | 196 RenderProcessHostPrivilege GetProcessPrivilege( |
195 content::RenderProcessHost* process_host, | 197 content::RenderProcessHost* process_host, |
196 extensions::ProcessMap* process_map, | 198 extensions::ProcessMap* process_map, |
197 ExtensionService* service) { | 199 ExtensionService* service) { |
198 // TODO(aa): It seems like hosted apps should be grouped separately from | |
199 // extensions: crbug.com/102533. | |
200 std::set<std::string> extension_ids = | 200 std::set<std::string> extension_ids = |
201 process_map->GetExtensionsInProcess(process_host->GetID()); | 201 process_map->GetExtensionsInProcess(process_host->GetID()); |
202 if (extension_ids.empty()) | 202 if (extension_ids.empty()) |
203 return PRIV_NORMAL; | 203 return PRIV_NORMAL; |
204 | 204 |
205 for (std::set<std::string>::iterator iter = extension_ids.begin(); | 205 for (std::set<std::string>::iterator iter = extension_ids.begin(); |
206 iter != extension_ids.end(); ++iter) { | 206 iter != extension_ids.end(); ++iter) { |
207 const Extension* extension = service->GetExtensionById(*iter, false); | 207 const Extension* extension = service->GetExtensionById(*iter, false); |
208 if (extension && extension->is_storage_isolated()) | 208 if (extension && extension->is_storage_isolated()) |
209 return PRIV_ISOLATED; | 209 return PRIV_ISOLATED; |
210 if (extension && extension->is_hosted_app()) | |
211 return PRIV_HOSTED; | |
210 } | 212 } |
211 | 213 |
212 return PRIV_EXTENSION; | 214 return PRIV_EXTENSION; |
213 } | 215 } |
214 | 216 |
217 bool IsIsolatedAppInProcess(const GURL& site_url, | |
218 content::RenderProcessHost* process_host, | |
219 extensions::ProcessMap* process_map, | |
220 ExtensionService* service) { | |
221 std::set<std::string> extension_ids = | |
222 process_map->GetExtensionsInProcess(process_host->GetID()); | |
223 if (extension_ids.empty()) | |
224 return false; | |
225 | |
226 for (std::set<std::string>::iterator iter = extension_ids.begin(); | |
227 iter != extension_ids.end(); ++iter) { | |
228 const Extension* extension = service->GetExtensionById(*iter, false); | |
229 if (extension && | |
230 extension->url() == site_url && | |
231 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.
| |
232 return true; | |
233 } | |
234 | |
235 return false; | |
236 } | |
237 | |
215 } // namespace | 238 } // namespace |
216 | 239 |
217 namespace chrome { | 240 namespace chrome { |
218 | 241 |
219 content::BrowserMainParts* ChromeContentBrowserClient::CreateBrowserMainParts( | 242 content::BrowserMainParts* ChromeContentBrowserClient::CreateBrowserMainParts( |
220 const content::MainFunctionParams& parameters) { | 243 const content::MainFunctionParams& parameters) { |
221 ChromeBrowserMainParts* main_parts; | 244 ChromeBrowserMainParts* main_parts; |
222 // Construct the Main browser parts based on the OS type. | 245 // Construct the Main browser parts based on the OS type. |
223 #if defined(OS_WIN) | 246 #if defined(OS_WIN) |
224 main_parts = new ChromeBrowserMainPartsWin(parameters); | 247 main_parts = new ChromeBrowserMainPartsWin(parameters); |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
414 // Experimental: | 437 // Experimental: |
415 // If --enable-strict-site-isolation is enabled, do not allow non-WebUI pages | 438 // If --enable-strict-site-isolation is enabled, do not allow non-WebUI pages |
416 // to share a renderer process. (We could allow pages from the same site or | 439 // to share a renderer process. (We could allow pages from the same site or |
417 // extensions of the same type to share, if we knew what the given process | 440 // extensions of the same type to share, if we knew what the given process |
418 // was dedicated to. Allowing no sharing is simpler for now.) This may | 441 // was dedicated to. Allowing no sharing is simpler for now.) This may |
419 // cause resource exhaustion issues if too many sites are open at once. | 442 // cause resource exhaustion issues if too many sites are open at once. |
420 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | 443 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
421 if (command_line.HasSwitch(switches::kEnableStrictSiteIsolation)) | 444 if (command_line.HasSwitch(switches::kEnableStrictSiteIsolation)) |
422 return false; | 445 return false; |
423 | 446 |
447 // 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.
| |
448 RenderProcessHostPrivilege privilege_required = | |
449 GetPrivilegeRequiredByUrl(site_url, service); | |
450 if (privilege_required == PRIV_ISOLATED) | |
451 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.
| |
452 | |
453 // Otherwise, just make sure the process privilege matches the privilege | |
454 // required by the site. | |
424 return GetProcessPrivilege(process_host, process_map, service) == | 455 return GetProcessPrivilege(process_host, process_map, service) == |
425 GetPrivilegeRequiredByUrl(site_url, service); | 456 privilege_required; |
426 } | 457 } |
427 | 458 |
428 void ChromeContentBrowserClient::SiteInstanceGotProcess( | 459 void ChromeContentBrowserClient::SiteInstanceGotProcess( |
429 SiteInstance* site_instance) { | 460 SiteInstance* site_instance) { |
430 CHECK(site_instance->HasProcess()); | 461 CHECK(site_instance->HasProcess()); |
431 | 462 |
432 Profile* profile = Profile::FromBrowserContext( | 463 Profile* profile = Profile::FromBrowserContext( |
433 site_instance->browsing_instance()->browser_context()); | 464 site_instance->browsing_instance()->browser_context()); |
434 ExtensionService* service = profile->GetExtensionService(); | 465 ExtensionService* service = profile->GetExtensionService(); |
435 if (!service) | 466 if (!service) |
(...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1113 #if defined(USE_NSS) | 1144 #if defined(USE_NSS) |
1114 crypto::CryptoModuleBlockingPasswordDelegate* | 1145 crypto::CryptoModuleBlockingPasswordDelegate* |
1115 ChromeContentBrowserClient::GetCryptoPasswordDelegate( | 1146 ChromeContentBrowserClient::GetCryptoPasswordDelegate( |
1116 const GURL& url) { | 1147 const GURL& url) { |
1117 return browser::NewCryptoModuleBlockingDialogDelegate( | 1148 return browser::NewCryptoModuleBlockingDialogDelegate( |
1118 browser::kCryptoModulePasswordKeygen, url.host()); | 1149 browser::kCryptoModulePasswordKeygen, url.host()); |
1119 } | 1150 } |
1120 #endif | 1151 #endif |
1121 | 1152 |
1122 } // namespace chrome | 1153 } // namespace chrome |
OLD | NEW |