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

Side by Side Diff: content/browser/site_instance_impl.cc

Issue 16267002: Re-fix http://crbug.com/87176, and add a test. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Much shorter test Created 7 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/browser/site_instance_impl.h" 5 #include "content/browser/site_instance_impl.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "content/browser/browsing_instance.h" 8 #include "content/browser/browsing_instance.h"
9 #include "content/browser/child_process_security_policy_impl.h" 9 #include "content/browser/child_process_security_policy_impl.h"
10 #include "content/browser/renderer_host/render_process_host_impl.h" 10 #include "content/browser/renderer_host/render_process_host_impl.h"
(...skipping 17 matching lines...) Expand all
28 // a modifier on existing pages. 28 // a modifier on existing pages.
29 if (url.SchemeIs(chrome::kJavaScriptScheme)) 29 if (url.SchemeIs(chrome::kJavaScriptScheme))
30 return true; 30 return true;
31 31
32 return url == GURL(kChromeUICrashURL) || 32 return url == GURL(kChromeUICrashURL) ||
33 url == GURL(kChromeUIKillURL) || 33 url == GURL(kChromeUIKillURL) ||
34 url == GURL(kChromeUIHangURL) || 34 url == GURL(kChromeUIHangURL) ||
35 url == GURL(kChromeUIShorthangURL); 35 url == GURL(kChromeUIShorthangURL);
36 } 36 }
37 37
38 const RenderProcessHostFactory*
39 SiteInstanceImpl::g_render_process_host_factory_ = NULL;
38 int32 SiteInstanceImpl::next_site_instance_id_ = 1; 40 int32 SiteInstanceImpl::next_site_instance_id_ = 1;
39 41
40 SiteInstanceImpl::SiteInstanceImpl(BrowsingInstance* browsing_instance) 42 SiteInstanceImpl::SiteInstanceImpl(BrowsingInstance* browsing_instance)
41 : id_(next_site_instance_id_++), 43 : id_(next_site_instance_id_++),
42 browsing_instance_(browsing_instance), 44 browsing_instance_(browsing_instance),
43 render_process_host_factory_(NULL),
44 process_(NULL), 45 process_(NULL),
45 has_site_(false) { 46 has_site_(false) {
46 DCHECK(browsing_instance); 47 DCHECK(browsing_instance);
47 48
48 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_TERMINATED, 49 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_TERMINATED,
49 NotificationService::AllBrowserContextsAndSources()); 50 NotificationService::AllBrowserContextsAndSources());
50 } 51 }
51 52
52 SiteInstanceImpl::~SiteInstanceImpl() { 53 SiteInstanceImpl::~SiteInstanceImpl() {
53 GetContentClient()->browser()->SiteInstanceDeleting(this); 54 GetContentClient()->browser()->SiteInstanceDeleting(this);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 105
105 // If not (or if none found), see if we should reuse an existing process. 106 // If not (or if none found), see if we should reuse an existing process.
106 if (!process_ && RenderProcessHostImpl::ShouldTryToUseExistingProcessHost( 107 if (!process_ && RenderProcessHostImpl::ShouldTryToUseExistingProcessHost(
107 browser_context, site_)) { 108 browser_context, site_)) {
108 process_ = RenderProcessHostImpl::GetExistingProcessHost(browser_context, 109 process_ = RenderProcessHostImpl::GetExistingProcessHost(browser_context,
109 site_); 110 site_);
110 } 111 }
111 112
112 // Otherwise (or if that fails), create a new one. 113 // Otherwise (or if that fails), create a new one.
113 if (!process_) { 114 if (!process_) {
114 if (render_process_host_factory_) { 115 if (g_render_process_host_factory_) {
115 process_ = render_process_host_factory_->CreateRenderProcessHost( 116 process_ = g_render_process_host_factory_->CreateRenderProcessHost(
116 browser_context); 117 browser_context);
117 } else { 118 } else {
118 StoragePartitionImpl* partition = 119 StoragePartitionImpl* partition =
119 static_cast<StoragePartitionImpl*>( 120 static_cast<StoragePartitionImpl*>(
120 BrowserContext::GetStoragePartition(browser_context, this)); 121 BrowserContext::GetStoragePartition(browser_context, this));
121 bool supports_browser_plugin = GetContentClient()->browser()-> 122 bool supports_browser_plugin = GetContentClient()->browser()->
122 SupportsBrowserPlugin(browser_context, site_); 123 SupportsBrowserPlugin(browser_context, site_);
123 process_ = 124 process_ =
124 new RenderProcessHostImpl(browser_context, partition, 125 new RenderProcessHostImpl(browser_context, partition,
125 supports_browser_plugin, 126 supports_browser_plugin,
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 if (IsURLSameAsAnySiteInstance(url)) 214 if (IsURLSameAsAnySiteInstance(url))
214 return false; 215 return false;
215 216
216 // If the site URL is an extension (e.g., for hosted apps or WebUI) but the 217 // If the site URL is an extension (e.g., for hosted apps or WebUI) but the
217 // process is not (or vice versa), make sure we notice and fix it. 218 // process is not (or vice versa), make sure we notice and fix it.
218 GURL site_url = GetSiteForURL(browsing_instance_->browser_context(), url); 219 GURL site_url = GetSiteForURL(browsing_instance_->browser_context(), url);
219 return !RenderProcessHostImpl::IsSuitableHost( 220 return !RenderProcessHostImpl::IsSuitableHost(
220 GetProcess(), browsing_instance_->browser_context(), site_url); 221 GetProcess(), browsing_instance_->browser_context(), site_url);
221 } 222 }
222 223
224 void SiteInstanceImpl::set_render_process_host_factory(
225 const RenderProcessHostFactory* rph_factory) {
226 g_render_process_host_factory_ = rph_factory;
227 }
228
223 BrowserContext* SiteInstanceImpl::GetBrowserContext() const { 229 BrowserContext* SiteInstanceImpl::GetBrowserContext() const {
224 return browsing_instance_->browser_context(); 230 return browsing_instance_->browser_context();
225 } 231 }
226 232
227 /*static*/ 233 /*static*/
228 SiteInstance* SiteInstance::Create(BrowserContext* browser_context) { 234 SiteInstance* SiteInstance::Create(BrowserContext* browser_context) {
229 return new SiteInstanceImpl(new BrowsingInstance(browser_context)); 235 return new SiteInstanceImpl(new BrowsingInstance(browser_context));
230 } 236 }
231 237
232 /*static*/ 238 /*static*/
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 341 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
336 if (command_line.HasSwitch(switches::kEnableStrictSiteIsolation) || 342 if (command_line.HasSwitch(switches::kEnableStrictSiteIsolation) ||
337 command_line.HasSwitch(switches::kSitePerProcess)) { 343 command_line.HasSwitch(switches::kSitePerProcess)) {
338 ChildProcessSecurityPolicyImpl* policy = 344 ChildProcessSecurityPolicyImpl* policy =
339 ChildProcessSecurityPolicyImpl::GetInstance(); 345 ChildProcessSecurityPolicyImpl::GetInstance();
340 policy->LockToOrigin(process_->GetID(), site_); 346 policy->LockToOrigin(process_->GetID(), site_);
341 } 347 }
342 } 348 }
343 349
344 } // namespace content 350 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698