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

Unified Diff: content/browser/site_instance_impl.cc

Issue 10575014: Move process-per-site logic from BrowsingInstance to RenderProcessHost. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Clean up RPHs in test. Created 8 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 side-by-side diff with in-line comments
Download patch
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..c6dcee1106ecbb2beac61ececaf382488a48a68d 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.
awong 2012/06/27 00:26:54 GetProcess -> GetProcess()
Charlie Reis 2012/06/27 20:53:43 Done.
+ content::BrowserContext* browser_context =
+ browsing_instance_->browser_context();
+ if (has_site_ &&
+ RenderProcessHost::ShouldUseProcessPerSite(browser_context, site_) &&
+ RenderProcessHost::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,46 @@ 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_ &&
+ RenderProcessHost::ShouldUseProcessPerSite(browser_context, site_);
+ if (use_process_per_site) {
+ process_ = RenderProcessHost::GetProcessHostForSite(browser_context,
+ site_);
+ }
+
+ // If not (or if none found), see if we should reuse an existing process.
+ if (!process_ &&
+ RenderProcessHost::ShouldTryToUseExistingProcessHost(browser_context,
+ site_)) {
+ process_ = RenderProcessHost::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));
}
}
+ DCHECK(process_);
awong 2012/06/27 00:26:54 Should this be a CHECK? The code can't continue s
Charlie Reis 2012/06/27 20:53:43 Done.
+
+ // 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.)
awong 2012/06/27 00:26:54 SetSite -> SetSite(). Though I understand the par
Charlie Reis 2012/06/27 20:53:43 Line 101 checks has_site_ before calling ShouldUse
+ if (use_process_per_site) {
+ RenderProcessHost::RegisterProcessHostForSite(browser_context, process_,
+ site_);
+ }
content::GetContentClient()->browser()->SiteInstanceGotProcess(this);
@@ -116,7 +155,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 +165,15 @@ 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 (RenderProcessHost::ShouldUseProcessPerSite(browser_context, site_)) {
+ RenderProcessHost::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;
}

Powered by Google App Engine
This is Rietveld 408576698