Index: content/browser/site_instance_impl.cc |
diff --git a/content/browser/site_instance_impl.cc b/content/browser/site_instance_impl.cc |
index 7980783a7d3ed0acfe3da00d14a192471abd8e75..a4c886260e008f39fc30ab153d898df9fd09f2d0 100644 |
--- a/content/browser/site_instance_impl.cc |
+++ b/content/browser/site_instance_impl.cc |
@@ -82,6 +82,81 @@ bool SiteInstanceImpl::HasProcess() const { |
return false; |
} |
+namespace { |
+ |
+const void* const kDefaultSubframeProcessHostHolderKey = |
+ &kDefaultSubframeProcessHostHolderKey; |
+ |
+class DefaultSubframeProcessHostHolder : public base::SupportsUserData::Data, |
+ public RenderProcessHostObserver { |
+ public: |
+ explicit DefaultSubframeProcessHostHolder(BrowserContext* browser_context) |
+ : browser_context_(browser_context) {} |
+ ~DefaultSubframeProcessHostHolder() override {} |
+ |
+ // Gets the correct render process to use for this SiteInstance. |
+ RenderProcessHost* GetProcessHost(SiteInstance* site_instance, |
+ bool is_for_guests_only) { |
+ StoragePartition* default_partition = |
+ BrowserContext::GetDefaultStoragePartition(browser_context_); |
+ StoragePartition* partition = |
+ BrowserContext::GetStoragePartition(browser_context_, site_instance); |
+ |
+ // Is this the default storage partition? If it isn't, then just give it its |
+ // own non-shared process. |
+ if (partition != default_partition || is_for_guests_only) { |
+ RenderProcessHostImpl* host = new RenderProcessHostImpl( |
+ browser_context_, static_cast<StoragePartitionImpl*>(partition), |
+ is_for_guests_only); |
+ host->SetIsNeverSuitableForReuse(); |
+ return host; |
+ } |
+ |
+ if (host_) { |
+ // If we already have a shared host for the default storage partition, use |
+ // it. |
+ return host_; |
+ } |
+ |
+ host_ = new RenderProcessHostImpl( |
+ browser_context_, static_cast<StoragePartitionImpl*>(partition), |
+ false /* for guests only */); |
+ host_->SetIsNeverSuitableForReuse(); |
+ host_->AddObserver(this); |
+ |
+ return host_; |
+ } |
+ |
+ void RenderProcessHostDestroyed(RenderProcessHost* host) override { |
+ DCHECK_EQ(host_, host); |
+ host_->RemoveObserver(this); |
+ host_ = nullptr; |
+ } |
+ |
+ private: |
+ BrowserContext* browser_context_; |
+ |
+ // The default subframe render process used for the default storage partition |
+ // of this BrowserContext. |
+ RenderProcessHostImpl* host_ = nullptr; |
+}; |
+ |
+} // namespace |
+ |
+RenderProcessHost* SiteInstanceImpl::GetDefaultSubframeProcessHost( |
+ BrowserContext* browser_context, |
+ bool is_for_guests_only) { |
+ DefaultSubframeProcessHostHolder* holder = |
+ static_cast<DefaultSubframeProcessHostHolder*>( |
+ browser_context->GetUserData(&kDefaultSubframeProcessHostHolderKey)); |
+ if (!holder) { |
+ holder = new DefaultSubframeProcessHostHolder(browser_context); |
+ browser_context->SetUserData(kDefaultSubframeProcessHostHolderKey, holder); |
+ } |
+ |
+ return holder->GetProcessHost(this, is_for_guests_only); |
+} |
+ |
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 |
@@ -93,6 +168,7 @@ RenderProcessHost* SiteInstanceImpl::GetProcess() { |
// Create a new process if ours went away or was reused. |
if (!process_) { |
BrowserContext* browser_context = browsing_instance_->browser_context(); |
+ bool is_for_guests_only = site_.SchemeIs(kGuestScheme); |
// 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. |
@@ -103,6 +179,12 @@ RenderProcessHost* SiteInstanceImpl::GetProcess() { |
site_); |
} |
+ if (!process_ && IsDefaultSubframeSiteInstance() && |
+ SiteIsolationPolicy::IsTopDocumentIsolationEnabled()) { |
+ process_ = |
+ GetDefaultSubframeProcessHost(browser_context, is_for_guests_only); |
+ } |
+ |
// If not (or if none found), see if we should reuse an existing process. |
if (!process_ && RenderProcessHostImpl::ShouldTryToUseExistingProcessHost( |
browser_context, site_)) { |
@@ -119,9 +201,8 @@ RenderProcessHost* SiteInstanceImpl::GetProcess() { |
StoragePartitionImpl* partition = |
static_cast<StoragePartitionImpl*>( |
BrowserContext::GetStoragePartition(browser_context, this)); |
- process_ = new RenderProcessHostImpl(browser_context, |
- partition, |
- site_.SchemeIs(kGuestScheme)); |
+ process_ = new RenderProcessHostImpl(browser_context, partition, |
+ is_for_guests_only); |
} |
} |
CHECK(process_); |