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

Side by Side Diff: content/browser/renderer_host/render_process_host_impl.cc

Issue 2921063003: Fix process reuse for dedicated processes when over process limit. (Closed)
Patch Set: Cleanup Created 3 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 // Represents the browser side of the browser <--> renderer communication 5 // Represents the browser side of the browser <--> renderer communication
6 // channel. There will be one RenderProcessHost per renderer process. 6 // channel. There will be one RenderProcessHost per renderer process.
7 7
8 #include "content/browser/renderer_host/render_process_host_impl.h" 8 #include "content/browser/renderer_host/render_process_host_impl.h"
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after
922 visible_widgets_(0), 922 visible_widgets_(0),
923 is_process_backgrounded_(kLaunchingProcessIsBackgrounded), 923 is_process_backgrounded_(kLaunchingProcessIsBackgrounded),
924 boost_priority_for_pending_views_( 924 boost_priority_for_pending_views_(
925 kLaunchingProcessIsBoostedForPendingView), 925 kLaunchingProcessIsBoostedForPendingView),
926 id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()), 926 id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()),
927 browser_context_(browser_context), 927 browser_context_(browser_context),
928 storage_partition_impl_(storage_partition_impl), 928 storage_partition_impl_(storage_partition_impl),
929 sudden_termination_allowed_(true), 929 sudden_termination_allowed_(true),
930 ignore_input_events_(false), 930 ignore_input_events_(false),
931 is_for_guests_only_(is_for_guests_only), 931 is_for_guests_only_(is_for_guests_only),
932 can_become_dedicated_process_(true),
932 gpu_observer_registered_(false), 933 gpu_observer_registered_(false),
933 delayed_cleanup_needed_(false), 934 delayed_cleanup_needed_(false),
934 within_process_died_observer_(false), 935 within_process_died_observer_(false),
935 #if BUILDFLAG(ENABLE_WEBRTC) 936 #if BUILDFLAG(ENABLE_WEBRTC)
936 webrtc_eventlog_host_(id_), 937 webrtc_eventlog_host_(id_),
937 #endif 938 #endif
938 permission_service_context_(new PermissionServiceContext(this)), 939 permission_service_context_(new PermissionServiceContext(this)),
939 indexed_db_factory_(new IndexedDBDispatcherHost( 940 indexed_db_factory_(new IndexedDBDispatcherHost(
940 id_, 941 id_,
941 storage_partition_impl_->GetURLRequestContext(), 942 storage_partition_impl_->GetURLRequestContext(),
(...skipping 811 matching lines...) Expand 10 before | Expand all | Expand 10 after
1753 is_never_suitable_for_reuse_ = true; 1754 is_never_suitable_for_reuse_ = true;
1754 } 1755 }
1755 1756
1756 bool RenderProcessHostImpl::MayReuseHost() { 1757 bool RenderProcessHostImpl::MayReuseHost() {
1757 if (is_never_suitable_for_reuse_) 1758 if (is_never_suitable_for_reuse_)
1758 return false; 1759 return false;
1759 1760
1760 return GetContentClient()->browser()->MayReuseHost(this); 1761 return GetContentClient()->browser()->MayReuseHost(this);
1761 } 1762 }
1762 1763
1764 bool RenderProcessHostImpl::CanBecomeDedicatedProcess() {
1765 return can_become_dedicated_process_;
1766 }
1767
1768 void RenderProcessHostImpl::UnsetCanBecomeDedicatedProcess() {
1769 can_become_dedicated_process_ = false;
alexmos 2017/06/12 17:35:07 Note that I'm specifically not calling this in Inc
1770 }
1771
1763 mojom::RouteProvider* RenderProcessHostImpl::GetRemoteRouteProvider() { 1772 mojom::RouteProvider* RenderProcessHostImpl::GetRemoteRouteProvider() {
1764 return remote_route_provider_.get(); 1773 return remote_route_provider_.get();
1765 } 1774 }
1766 1775
1767 void RenderProcessHostImpl::AddRoute(int32_t routing_id, 1776 void RenderProcessHostImpl::AddRoute(int32_t routing_id,
1768 IPC::Listener* listener) { 1777 IPC::Listener* listener) {
1769 CHECK(!listeners_.Lookup(routing_id)) << "Found Routing ID Conflict: " 1778 CHECK(!listeners_.Lookup(routing_id)) << "Found Routing ID Conflict: "
1770 << routing_id; 1779 << routing_id;
1771 listeners_.AddWithID(listener, routing_id); 1780 listeners_.AddWithID(listener, routing_id);
1772 } 1781 }
(...skipping 1070 matching lines...) Expand 10 before | Expand all | Expand 10 after
2843 return false; 2852 return false;
2844 2853
2845 // Check whether the given host and the intended site_url will be using the 2854 // Check whether the given host and the intended site_url will be using the
2846 // same StoragePartition, since a RenderProcessHost can only support a single 2855 // same StoragePartition, since a RenderProcessHost can only support a single
2847 // StoragePartition. This is relevant for packaged apps. 2856 // StoragePartition. This is relevant for packaged apps.
2848 StoragePartition* dest_partition = 2857 StoragePartition* dest_partition =
2849 BrowserContext::GetStoragePartitionForSite(browser_context, site_url); 2858 BrowserContext::GetStoragePartitionForSite(browser_context, site_url);
2850 if (!host->InSameStoragePartition(dest_partition)) 2859 if (!host->InSameStoragePartition(dest_partition))
2851 return false; 2860 return false;
2852 2861
2853 // TODO(nick): Consult the SiteIsolationPolicy here. https://crbug.com/513036 2862 // TODO(nick): Consult the SiteIsolationPolicy here. https://crbug.com/513036
Charlie Reis 2017/06/12 23:08:17 Is this TODO resolved now?
alexmos 2017/06/14 22:39:04 Indeed, removed.
2854 if (ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( 2863 auto* policy = ChildProcessSecurityPolicyImpl::GetInstance();
2855 host->GetID()) != 2864 if (policy->HasWebUIBindings(host->GetID()) !=
2856 WebUIControllerFactoryRegistry::GetInstance()->UseWebUIBindingsForURL( 2865 WebUIControllerFactoryRegistry::GetInstance()->UseWebUIBindingsForURL(
2857 browser_context, site_url)) { 2866 browser_context, site_url)) {
2858 return false; 2867 return false;
2859 } 2868 }
2860 2869
2870 // Sites requiring dedicated processes can only reuse a compatible process.
2871 if (policy->HasOriginLock(host->GetID())) {
2872 // If the process is already dedicated to a site, only allow the destination
2873 // URL to reuse this process if the URL's has the same site.
2874 return policy->IsLockedToOrigin(host->GetID(), site_url);
Charlie Reis 2017/06/12 23:08:17 I'm a little concerned about TOCTTOU problems here
alexmos 2017/06/14 22:39:05 Yes, good questions. Since we always set origin l
Charlie Reis 2017/06/17 23:13:53 I really like the enum idea, especially because it
alexmos 2017/06/19 20:03:58 Done.
2875 } else if (!host->CanBecomeDedicatedProcess() &&
2876 SiteInstanceImpl::DoesSiteRequireDedicatedProcess(browser_context,
2877 site_url)) {
2878 // Otherwise, if this process cannot host a site that requires a dedicated
2879 // process (e.g., if it has hosted any other content), it cannot be reused
2880 // if the destination site indeed requires a dedicated process.
2881 return false;
2882 }
2883
2861 return GetContentClient()->browser()->IsSuitableHost(host, site_url); 2884 return GetContentClient()->browser()->IsSuitableHost(host, site_url);
2862 } 2885 }
2863 2886
2864 // static 2887 // static
2865 bool RenderProcessHost::run_renderer_in_process() { 2888 bool RenderProcessHost::run_renderer_in_process() {
2866 return g_run_renderer_in_process_; 2889 return g_run_renderer_in_process_;
2867 } 2890 }
2868 2891
2869 // static 2892 // static
2870 void RenderProcessHost::SetRunRendererInProcess(bool value) { 2893 void RenderProcessHost::SetRunRendererInProcess(bool value) {
(...skipping 24 matching lines...) Expand all
2895 // static 2918 // static
2896 RenderProcessHost* RenderProcessHost::FromID(int render_process_id) { 2919 RenderProcessHost* RenderProcessHost::FromID(int render_process_id) {
2897 DCHECK_CURRENTLY_ON(BrowserThread::UI); 2920 DCHECK_CURRENTLY_ON(BrowserThread::UI);
2898 return g_all_hosts.Get().Lookup(render_process_id); 2921 return g_all_hosts.Get().Lookup(render_process_id);
2899 } 2922 }
2900 2923
2901 // static 2924 // static
2902 bool RenderProcessHost::ShouldTryToUseExistingProcessHost( 2925 bool RenderProcessHost::ShouldTryToUseExistingProcessHost(
2903 BrowserContext* browser_context, 2926 BrowserContext* browser_context,
2904 const GURL& url) { 2927 const GURL& url) {
2905 // This needs to be checked first to ensure that --single-process
2906 // and --site-per-process can be used together.
2907 if (run_renderer_in_process()) 2928 if (run_renderer_in_process())
2908 return true; 2929 return true;
2909 2930
2910 // If --site-per-process is enabled, do not try to reuse renderer processes
2911 // when over the limit.
2912 // TODO(nick): This is overly conservative and isn't launchable. Move this
2913 // logic into IsSuitableHost, and check |url| against the URL the process is
2914 // dedicated to. This will allow pages from the same site to share, and will
2915 // also allow non-isolated sites to share processes. https://crbug.com/513036
2916 if (SiteIsolationPolicy::UseDedicatedProcessesForAllSites())
2917 return false;
2918
2919 // NOTE: Sometimes it's necessary to create more render processes than 2931 // NOTE: Sometimes it's necessary to create more render processes than
2920 // GetMaxRendererProcessCount(), for instance when we want to create 2932 // GetMaxRendererProcessCount(), for instance when we want to create
2921 // a renderer process for a browser context that has no existing 2933 // a renderer process for a browser context that has no existing
2922 // renderers. This is OK in moderation, since the 2934 // renderers. This is OK in moderation, since the
2923 // GetMaxRendererProcessCount() is conservative. 2935 // GetMaxRendererProcessCount() is conservative.
2924 if (g_all_hosts.Get().size() >= GetMaxRendererProcessCount()) 2936 if (g_all_hosts.Get().size() >= GetMaxRendererProcessCount())
2925 return true; 2937 return true;
2926 2938
2927 return GetContentClient()->browser()->ShouldTryToUseExistingProcessHost( 2939 return GetContentClient()->browser()->ShouldTryToUseExistingProcessHost(
2928 browser_context, url); 2940 browser_context, url);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
2984 2996
2985 // static 2997 // static
2986 RenderProcessHost* RenderProcessHostImpl::GetProcessHostForSite( 2998 RenderProcessHost* RenderProcessHostImpl::GetProcessHostForSite(
2987 BrowserContext* browser_context, 2999 BrowserContext* browser_context,
2988 const GURL& url) { 3000 const GURL& url) {
2989 // Look up the map of site to process for the given browser_context. 3001 // Look up the map of site to process for the given browser_context.
2990 SiteProcessMap* map = GetSiteProcessMapForBrowserContext(browser_context); 3002 SiteProcessMap* map = GetSiteProcessMapForBrowserContext(browser_context);
2991 3003
2992 // See if we have an existing process with appropriate bindings for this site. 3004 // See if we have an existing process with appropriate bindings for this site.
2993 // If not, the caller should create a new process and register it. 3005 // If not, the caller should create a new process and register it.
2994 std::string site = 3006 GURL site_url = SiteInstance::GetSiteForURL(browser_context, url);
2995 SiteInstance::GetSiteForURL(browser_context, url).possibly_invalid_spec(); 3007 RenderProcessHost* host = map->FindProcess(site_url.possibly_invalid_spec());
2996 RenderProcessHost* host = map->FindProcess(site);
2997 if (host && (!host->MayReuseHost() || 3008 if (host && (!host->MayReuseHost() ||
2998 !IsSuitableHost(host, browser_context, url))) { 3009 !IsSuitableHost(host, browser_context, site_url))) {
alexmos 2017/06/12 17:35:07 After my IsSuitableHost modifications, a few exten
Charlie Reis 2017/06/12 23:08:17 Nice. Can you give an example of what the previou
alexmos 2017/06/14 22:39:05 Sorry, typo here - this should've just been "when
Charlie Reis 2017/06/17 23:13:52 I see now-- thanks!
alexmos 2017/06/19 20:03:58 Done - filed https://bugs.chromium.org/p/chromium/
2999 // The registered process does not have an appropriate set of bindings for 3010 // The registered process does not have an appropriate set of bindings for
3000 // the url. Remove it from the map so we can register a better one. 3011 // the url. Remove it from the map so we can register a better one.
3001 RecordAction( 3012 RecordAction(
3002 base::UserMetricsAction("BindingsMismatch_GetProcessHostPerSite")); 3013 base::UserMetricsAction("BindingsMismatch_GetProcessHostPerSite"));
3003 map->RemoveProcess(host); 3014 map->RemoveProcess(host);
3004 host = NULL; 3015 host = NULL;
3005 } 3016 }
3006 3017
3007 return host; 3018 return host;
3008 } 3019 }
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after
3573 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; 3584 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error;
3574 3585
3575 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. 3586 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing.
3576 // Capture the error message in a crash key value. 3587 // Capture the error message in a crash key value.
3577 base::debug::ScopedCrashKey error_key_value("mojo-message-error", error); 3588 base::debug::ScopedCrashKey error_key_value("mojo-message-error", error);
3578 bad_message::ReceivedBadMessage(render_process_id, 3589 bad_message::ReceivedBadMessage(render_process_id,
3579 bad_message::RPH_MOJO_PROCESS_ERROR); 3590 bad_message::RPH_MOJO_PROCESS_ERROR);
3580 } 3591 }
3581 3592
3582 } // namespace content 3593 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698