Chromium Code Reviews| Index: content/browser/frame_host/render_frame_host_manager.cc |
| diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc |
| index 6de0f24d8ae81b9428617f5287e1fd7fc76a9562..8d364d9e748ef0fec4665ef9edf38d6e87544991 100644 |
| --- a/content/browser/frame_host/render_frame_host_manager.cc |
| +++ b/content/browser/frame_host/render_frame_host_manager.cc |
| @@ -40,6 +40,7 @@ |
| #include "content/common/frame_owner_properties.h" |
| #include "content/common/site_isolation_policy.h" |
| #include "content/common/view_messages.h" |
| +#include "content/public/browser/child_process_security_policy.h" |
| #include "content/public/browser/content_browser_client.h" |
| #include "content/public/browser/render_process_host_observer.h" |
| #include "content/public/browser/render_widget_host_iterator.h" |
| @@ -1337,6 +1338,19 @@ RenderFrameHostManager::DetermineSiteInstanceForURL( |
| dest_url.SchemeIs(kChromeUIScheme)) { |
| return SiteInstanceDescriptor(parent_site_instance); |
| } |
| + if (parent_site_instance->GetSiteURL().SchemeIs(kChromeDevToolsScheme)) { |
| + url::Origin origin = url::Origin(dest_url); |
| + auto* policy = ChildProcessSecurityPolicy::GetInstance(); |
| + // Some non-devtools origins (e.g., devtools extensions) have special |
| + // permission to stay in the devtools process. |
| + bool is_origin_allowed_in_devtools_process = |
| + policy->HasSpecificPermissionForOrigin( |
| + parent_site_instance->GetProcess()->GetID(), origin); |
| + if (origin.scheme() == kChromeDevToolsScheme || |
| + is_origin_allowed_in_devtools_process) { |
| + return SiteInstanceDescriptor(parent_site_instance); |
| + } |
| + } |
| } |
| // If we haven't used our SiteInstance (and thus RVH) yet, then we can use it |
| @@ -1507,12 +1521,14 @@ bool RenderFrameHostManager::IsRendererTransferNeededForNavigation( |
| if (rfh->GetSiteInstance()->GetSiteURL().SchemeIs(kGuestScheme)) |
| return false; |
| - // Don't swap processes for extensions embedded in DevTools. See |
| - // https://crbug.com/564216. |
| + // Don't swap processes for devtools extensions embedded in DevTools, except |
| + // for external navigations in iframes. See https://crbug.com/564216. |
|
ncarter (slow)
2017/03/15 20:01:02
Maybe we could phrase this comment more clearly:
davidsac (gone - try alexmos)
2017/03/18 01:32:41
Done.
|
| if (rfh->GetSiteInstance()->GetSiteURL().SchemeIs(kChromeDevToolsScheme)) { |
| - // TODO(nick): https://crbug.com/570483 Check to see if |dest_url| is a |
| - // devtools extension, and swap processes if not. |
| - return false; |
| + url::Origin origin = url::Origin(dest_url); |
| + auto* policy = ChildProcessSecurityPolicy::GetInstance(); |
| + bool is_devtools_extension = policy->HasSpecificPermissionForOrigin( |
|
ncarter (slow)
2017/03/15 20:01:02
Rename is_devtools_extension -> is_origin_allowed_
davidsac (gone - try alexmos)
2017/03/18 01:32:41
Done.
|
| + rfh->GetProcess()->GetID(), origin); |
| + return !(origin.scheme() == kChromeDevToolsScheme || is_devtools_extension); |
| } |
| BrowserContext* context = rfh->GetSiteInstance()->GetBrowserContext(); |