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

Side by Side Diff: content/browser/frame_host/render_frame_host_manager.cc

Issue 600553003: Enable swapping a frame back in to its parent process (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@remoteToLocal
Patch Set: Created 6 years, 1 month 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 #include "content/browser/frame_host/render_frame_host_manager.h" 5 #include "content/browser/frame_host/render_frame_host_manager.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 913 matching lines...) Expand 10 before | Expand all | Expand 10 after
924 // const GURL& current_url = current_instance->site(); 924 // const GURL& current_url = current_instance->site();
925 // For now, though, we're in a hybrid model where you only switch 925 // For now, though, we're in a hybrid model where you only switch
926 // SiteInstances if you type in a cross-site URL. This means we have to 926 // SiteInstances if you type in a cross-site URL. This means we have to
927 // compare the entry's URL to the last committed entry's URL. 927 // compare the entry's URL to the last committed entry's URL.
928 NavigationEntry* current_entry = controller.GetLastCommittedEntry(); 928 NavigationEntry* current_entry = controller.GetLastCommittedEntry();
929 if (interstitial_page_) { 929 if (interstitial_page_) {
930 // The interstitial is currently the last committed entry, but we want to 930 // The interstitial is currently the last committed entry, but we want to
931 // compare against the last non-interstitial entry. 931 // compare against the last non-interstitial entry.
932 current_entry = controller.GetEntryAtOffset(-1); 932 current_entry = controller.GetEntryAtOffset(-1);
933 } 933 }
934 // If there is no last non-interstitial entry (and current_instance already
935 // has a site), then we must have been opened from another tab. We want
936 // to compare against the URL of the page that opened us, but we can't
937 // get to it directly. The best we can do is check against the site of
938 // the SiteInstance. This will be correct when we intercept links and
939 // script-based navigations, but for now, it could place some pages in a
940 // new process unnecessarily. We should only hit this case if a page tries
941 // to open a new tab to an interstitial-inducing URL, and then navigates
942 // the page to a different same-site URL. (This seems very unlikely in
943 // practice.)
944 const GURL& current_url = (current_entry) ? current_entry->GetURL() :
945 current_instance->GetSiteURL();
946 934
947 // View-source URLs must use a new SiteInstance and BrowsingInstance. 935 // View-source URLs must use a new SiteInstance and BrowsingInstance.
948 // We don't need a swap when going from view-source to a debug URL like 936 // We don't need a swap when going from view-source to a debug URL like
949 // chrome://crash, however. 937 // chrome://crash, however.
950 // TODO(creis): Refactor this method so this duplicated code isn't needed. 938 // TODO(creis): Refactor this method so this duplicated code isn't needed.
951 // See http://crbug.com/123007. 939 // See http://crbug.com/123007.
952 if (current_entry && 940 if (current_entry &&
953 current_entry->IsViewSourceMode() != dest_is_view_source_mode && 941 current_entry->IsViewSourceMode() != dest_is_view_source_mode &&
954 !IsRendererDebugURL(dest_url)) { 942 !IsRendererDebugURL(dest_url)) {
955 return SiteInstance::CreateForURL(browser_context, dest_url); 943 return SiteInstance::CreateForURL(browser_context, dest_url);
956 } 944 }
957 945
958 // Use the current SiteInstance for same site navigations, as long as the 946 // Use the current SiteInstance for same site navigations, as long as the
959 // process type is correct. (The URL may have been installed as an app since 947 // process type is correct. (The URL may have been installed as an app since
960 // the last time we visited it.) 948 // the last time we visited it.)
949 const GURL& current_url =
950 GetCurrentURLForSiteInstance(current_instance, current_entry);
961 if (SiteInstance::IsSameWebSite(browser_context, current_url, dest_url) && 951 if (SiteInstance::IsSameWebSite(browser_context, current_url, dest_url) &&
962 !current_site_instance->HasWrongProcessForURL(dest_url)) { 952 !current_site_instance->HasWrongProcessForURL(dest_url)) {
963 return current_instance; 953 return current_instance;
964 } 954 }
965 955
966 // Start the new renderer in a new SiteInstance, but in the current 956 // Start the new renderer in a new SiteInstance, but in the current
967 // BrowsingInstance. It is important to immediately give this new 957 // BrowsingInstance. It is important to immediately give this new
968 // SiteInstance to a RenderViewHost (if it is different than our current 958 // SiteInstance to a RenderViewHost (if it is different than our current
969 // SiteInstance), so that it is ref counted. This will happen in 959 // SiteInstance), so that it is ref counted. This will happen in
970 // CreateRenderView. 960 // CreateRenderView.
971 return current_instance->GetRelatedSiteInstance(dest_url); 961 return current_instance->GetRelatedSiteInstance(dest_url);
972 } 962 }
973 963
964 const GURL& RenderFrameHostManager::GetCurrentURLForSiteInstance(
Charlie Reis 2014/10/30 19:36:06 Returning a const ref here seems risky if anyone t
Nate Chapin 2014/10/30 23:12:29 Yeah, I was just matching the types used in the co
965 SiteInstance* current_instance, NavigationEntry* current_entry) {
966 // If this is a subframe that is potentially out of process from its parent,
967 // don't consider using current_entry's url for SiteInstance selection, since
Charlie Reis 2014/10/30 19:36:06 nit: Change the second clause to "since current_en
Nate Chapin 2014/10/30 23:12:28 Done.
968 // current_entry may be in a different site than this frame already.
969 if (!frame_tree_node_->IsMainFrame() &&
970 CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess))
971 return frame_tree_node_->current_url();
972
973 // If there is no last non-interstitial entry (and current_instance already
974 // has a site), then we must have been opened from another tab. We want
975 // to compare against the URL of the page that opened us, but we can't
976 // get to it directly. The best we can do is check against the site of
977 // the SiteInstance. This will be correct when we intercept links and
978 // script-based navigations, but for now, it could place some pages in a
979 // new process unnecessarily. We should only hit this case if a page tries
980 // to open a new tab to an interstitial-inducing URL, and then navigates
981 // the page to a different same-site URL. (This seems very unlikely in
982 // practice.)
983 if (current_entry)
984 return current_entry->GetURL();
985 return current_instance->GetSiteURL();
986 }
987
974 void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance( 988 void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance(
975 SiteInstance* old_instance, 989 SiteInstance* old_instance,
976 SiteInstance* new_instance, 990 SiteInstance* new_instance,
977 bool is_main_frame) { 991 bool is_main_frame) {
978 // Ensure that we have created RFHs for the new RFH's opener chain if 992 // Ensure that we have created RFHs for the new RFH's opener chain if
979 // we are staying in the same BrowsingInstance. This allows the new RFH 993 // we are staying in the same BrowsingInstance. This allows the new RFH
980 // to send cross-process script calls to its opener(s). 994 // to send cross-process script calls to its opener(s).
981 int opener_route_id = MSG_ROUTING_NONE; 995 int opener_route_id = MSG_ROUTING_NONE;
982 if (new_instance->IsRelatedSiteInstance(old_instance)) { 996 if (new_instance->IsRelatedSiteInstance(old_instance)) {
983 opener_route_id = 997 opener_route_id =
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 proxy_routing_id, 1195 proxy_routing_id,
1182 for_main_frame_navigation); 1196 for_main_frame_navigation);
1183 } 1197 }
1184 1198
1185 bool RenderFrameHostManager::InitRenderFrame( 1199 bool RenderFrameHostManager::InitRenderFrame(
1186 RenderFrameHostImpl* render_frame_host) { 1200 RenderFrameHostImpl* render_frame_host) {
1187 if (render_frame_host->IsRenderFrameLive()) 1201 if (render_frame_host->IsRenderFrameLive())
1188 return true; 1202 return true;
1189 1203
1190 int parent_routing_id = MSG_ROUTING_NONE; 1204 int parent_routing_id = MSG_ROUTING_NONE;
1205 int proxy_routing_id = MSG_ROUTING_NONE;
1191 if (frame_tree_node_->parent()) { 1206 if (frame_tree_node_->parent()) {
1192 parent_routing_id = frame_tree_node_->parent()->render_manager()-> 1207 parent_routing_id = frame_tree_node_->parent()->render_manager()->
1193 GetRoutingIdForSiteInstance(render_frame_host->GetSiteInstance()); 1208 GetRoutingIdForSiteInstance(render_frame_host->GetSiteInstance());
1194 CHECK_NE(parent_routing_id, MSG_ROUTING_NONE); 1209 CHECK_NE(parent_routing_id, MSG_ROUTING_NONE);
1195 } 1210 }
1211 // Check whether there is an existing proxy for this frame in this
1212 // SiteInstance. If there is, the new RenderFrame needs to be able to find
1213 // the proxy it is replacing, so that it can fully initialize itself.
1214 // NOTE: This is the only time that a RenderFrameProxyHost can be in the same
1215 // SiteInstance as its RenderFrameHost. This is only the case until the
1216 // RenderFrameHost commits, at which point it will replace and delete the
1217 // RenderFrameProxyHost.
1218 RenderFrameProxyHost* existing_proxy =
1219 GetRenderFrameProxyHost(render_frame_host->GetSiteInstance());
1220 if (existing_proxy) {
1221 proxy_routing_id = existing_proxy->GetRoutingID();
1222 CHECK_NE(proxy_routing_id, MSG_ROUTING_NONE);
1223 }
1196 return delegate_->CreateRenderFrameForRenderManager(render_frame_host, 1224 return delegate_->CreateRenderFrameForRenderManager(render_frame_host,
1197 parent_routing_id); 1225 parent_routing_id,
1226 proxy_routing_id);
1198 } 1227 }
1199 1228
1200 int RenderFrameHostManager::GetRoutingIdForSiteInstance( 1229 int RenderFrameHostManager::GetRoutingIdForSiteInstance(
1201 SiteInstance* site_instance) { 1230 SiteInstance* site_instance) {
1202 if (render_frame_host_->GetSiteInstance() == site_instance) 1231 if (render_frame_host_->GetSiteInstance() == site_instance)
1203 return render_frame_host_->GetRoutingID(); 1232 return render_frame_host_->GetRoutingID();
1204 1233
1205 RenderFrameProxyHostMap::iterator iter = 1234 RenderFrameProxyHostMap::iterator iter =
1206 proxy_hosts_.find(site_instance->GetId()); 1235 proxy_hosts_.find(site_instance->GetId());
1207 if (iter != proxy_hosts_.end()) 1236 if (iter != proxy_hosts_.end())
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after
1616 void RenderFrameHostManager::DeleteRenderFrameProxyHost( 1645 void RenderFrameHostManager::DeleteRenderFrameProxyHost(
1617 SiteInstance* instance) { 1646 SiteInstance* instance) {
1618 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); 1647 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId());
1619 if (iter != proxy_hosts_.end()) { 1648 if (iter != proxy_hosts_.end()) {
1620 delete iter->second; 1649 delete iter->second;
1621 proxy_hosts_.erase(iter); 1650 proxy_hosts_.erase(iter);
1622 } 1651 }
1623 } 1652 }
1624 1653
1625 } // namespace content 1654 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698