| Index: content/browser/site_instance_impl.cc
|
| diff --git a/content/browser/site_instance_impl.cc b/content/browser/site_instance_impl.cc
|
| index 8cfd20e52e8e01224c938fb54b317ad55105fa95..0b36c6c075cc3e7cac578b165cd3326ff3b05975 100644
|
| --- a/content/browser/site_instance_impl.cc
|
| +++ b/content/browser/site_instance_impl.cc
|
| @@ -12,12 +12,15 @@
|
| #include "content/public/browser/notification_service.h"
|
| #include "content/public/browser/notification_types.h"
|
| #include "content/public/browser/render_process_host_factory.h"
|
| +#include "content/public/browser/web_ui_controller_factory.h"
|
| #include "content/public/common/content_switches.h"
|
| #include "content/public/common/url_constants.h"
|
| #include "net/base/registry_controlled_domain.h"
|
|
|
| +using content::RenderProcessHost;
|
| using content::RenderProcessHostImpl;
|
| using content::SiteInstance;
|
| +using content::WebUIControllerFactory;
|
|
|
| static bool IsURLSameAsAnySiteInstance(const GURL& url) {
|
| if (!url.is_valid())
|
| @@ -64,10 +67,23 @@ int32 SiteInstanceImpl::GetId() {
|
| }
|
|
|
| bool SiteInstanceImpl::HasProcess() const {
|
| - return (process_ != NULL);
|
| + if (process_ != NULL)
|
| + return true;
|
| +
|
| + // If we would use process-per-site for this site, also check if there is an
|
| + // existing process that we would use if GetProcess() were called.
|
| + content::BrowserContext* browser_context =
|
| + browsing_instance_->browser_context();
|
| + if (has_site_ &&
|
| + RenderProcessHostImpl::ShouldUseProcessPerSite(browser_context, site_) &&
|
| + RenderProcessHostImpl::GetProcessHostForSite(browser_context, site_)) {
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| }
|
|
|
| -content::RenderProcessHost* SiteInstanceImpl::GetProcess() {
|
| +RenderProcessHost* SiteInstanceImpl::GetProcess() {
|
| // TODO(erikkay) It would be nice to ensure that the renderer type had been
|
| // properly set before we get here. The default tab creation case winds up
|
| // with no site set at this point, so it will default to TYPE_NORMAL. This
|
| @@ -77,23 +93,45 @@ content::RenderProcessHost* SiteInstanceImpl::GetProcess() {
|
|
|
| // Create a new process if ours went away or was reused.
|
| if (!process_) {
|
| - // See if we should reuse an old process
|
| - if (content::RenderProcessHost::ShouldTryToUseExistingProcessHost(
|
| - browsing_instance_->browser_context(), site_))
|
| - process_ = content::RenderProcessHost::GetExistingProcessHost(
|
| - browsing_instance_->browser_context(), site_);
|
| + content::BrowserContext* browser_context =
|
| + browsing_instance_->browser_context();
|
| +
|
| + // If we should use process-per-site mode (either in general or for the
|
| + // given site), then look for an existing RenderProcessHost for the site.
|
| + bool use_process_per_site = has_site_ &&
|
| + RenderProcessHostImpl::ShouldUseProcessPerSite(browser_context, site_);
|
| + if (use_process_per_site) {
|
| + process_ = RenderProcessHostImpl::GetProcessHostForSite(browser_context,
|
| + site_);
|
| + }
|
| +
|
| + // If not (or if none found), see if we should reuse an existing process.
|
| + if (!process_ && RenderProcessHostImpl::ShouldTryToUseExistingProcessHost(
|
| + browser_context, site_)) {
|
| + process_ = RenderProcessHostImpl::GetExistingProcessHost(browser_context,
|
| + site_);
|
| + }
|
|
|
| // Otherwise (or if that fails), create a new one.
|
| if (!process_) {
|
| if (render_process_host_factory_) {
|
| process_ = render_process_host_factory_->CreateRenderProcessHost(
|
| - browsing_instance_->browser_context());
|
| + browser_context);
|
| } else {
|
| process_ =
|
| - new RenderProcessHostImpl(browsing_instance_->browser_context(),
|
| + new RenderProcessHostImpl(browser_context,
|
| site_.SchemeIs(chrome::kGuestScheme));
|
| }
|
| }
|
| + CHECK(process_);
|
| +
|
| + // If we are using process-per-site, we need to register this process
|
| + // for the current site so that we can find it again. (If no site is set
|
| + // at this time, we will register it in SetSite().)
|
| + if (use_process_per_site) {
|
| + RenderProcessHostImpl::RegisterProcessHostForSite(browser_context,
|
| + process_, site_);
|
| + }
|
|
|
| content::GetContentClient()->browser()->SiteInstanceGotProcess(this);
|
|
|
| @@ -116,7 +154,9 @@ void SiteInstanceImpl::SetSite(const GURL& url) {
|
| // Remember that this SiteInstance has been used to load a URL, even if the
|
| // URL is invalid.
|
| has_site_ = true;
|
| - site_ = GetSiteForURL(browsing_instance_->browser_context(), url);
|
| + content::BrowserContext* browser_context =
|
| + browsing_instance_->browser_context();
|
| + site_ = GetSiteForURL(browser_context, url);
|
|
|
| // Now that we have a site, register it with the BrowsingInstance. This
|
| // ensures that we won't create another SiteInstance for this site within
|
| @@ -124,8 +164,16 @@ void SiteInstanceImpl::SetSite(const GURL& url) {
|
| // BrowsingInstance can script each other.
|
| browsing_instance_->RegisterSiteInstance(this);
|
|
|
| - if (process_)
|
| + if (process_) {
|
| LockToOrigin();
|
| +
|
| + // Ensure the process is registered for this site if necessary.
|
| + if (RenderProcessHostImpl::ShouldUseProcessPerSite(browser_context,
|
| + site_)) {
|
| + RenderProcessHostImpl::RegisterProcessHostForSite(
|
| + browser_context, process_, site_);
|
| + }
|
| + }
|
| }
|
|
|
| const GURL& SiteInstanceImpl::GetSite() const {
|
| @@ -266,8 +314,7 @@ void SiteInstanceImpl::Observe(int type,
|
| const content::NotificationSource& source,
|
| const content::NotificationDetails& details) {
|
| DCHECK(type == content::NOTIFICATION_RENDERER_PROCESS_TERMINATED);
|
| - content::RenderProcessHost* rph =
|
| - content::Source<content::RenderProcessHost>(source).ptr();
|
| + RenderProcessHost* rph = content::Source<RenderProcessHost>(source).ptr();
|
| if (rph == process_)
|
| process_ = NULL;
|
| }
|
|
|