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

Unified Diff: content/browser/frame_host/render_frame_host_manager.cc

Issue 616133002: Make RenderFrame(Host) own a RenderWidget(Host). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 6 years, 2 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/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 edd5723d8bb547db8e48c0e3ab20d4c5e3457dbd..623853773ac2e779d87d2dfc880b230f4f446c8a 100644
--- a/content/browser/frame_host/render_frame_host_manager.cc
+++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -86,11 +86,11 @@ void RenderFrameHostManager::Init(BrowserContext* browser_context,
if (!site_instance)
site_instance = SiteInstance::Create(browser_context);
+ int flags = delegate_->IsHidden() ? HIDDEN : 0;
SetRenderFrameHost(CreateRenderFrameHost(site_instance,
view_routing_id,
frame_routing_id,
- false,
- delegate_->IsHidden()));
+ flags));
// Keep track of renderer processes as they start to shut down or are
// crashed/killed.
@@ -117,7 +117,8 @@ RenderWidgetHostView* RenderFrameHostManager::GetRenderWidgetHostView() const {
return interstitial_page_->GetView();
if (!render_frame_host_)
return NULL;
- return render_frame_host_->render_view_host()->GetView();
+ return static_cast<RenderFrameHostImpl*>(render_frame_host_->
+ render_view_host()->GetMainFrame())->GetView();
}
RenderFrameProxyHost* RenderFrameHostManager::GetProxyToParent() {
@@ -199,8 +200,8 @@ RenderFrameHostImpl* RenderFrameHostManager::Navigate(
// our primary one. Otherwise, we might crash if we try to call Show()
// on it later.
if (dest_render_frame_host != render_frame_host_ &&
- dest_render_frame_host->render_view_host()->GetView()) {
- dest_render_frame_host->render_view_host()->GetView()->Hide();
+ dest_render_frame_host->GetView()) {
+ dest_render_frame_host->GetView()->Hide();
} else {
// Notify here as we won't be calling CommitPending (which does the
// notify).
@@ -958,6 +959,7 @@ void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance(
SiteInstance* old_instance,
SiteInstance* new_instance,
bool is_main_frame) {
+ int create_render_frame_flags = is_main_frame ? FOR_MAIN_FRAME_NAVIGATION : 0;
// Ensure that we have created RFHs for the new RFH's opener chain if
// we are staying in the same BrowsingInstance. This allows the new RFH
// to send cross-process script calls to its opener(s).
@@ -971,13 +973,21 @@ void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance(
// SiteInstance in all nodes except the current one.
frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance(
frame_tree_node_, new_instance);
+ // RenderFrames in different processes from their parent RenderFrames
+ // in the frame tree require RenderWidgets for rendering and processing
+ // input events.
+ if (frame_tree_node_->parent() &&
+ frame_tree_node_->parent()->render_manager()->
+ current_frame_host()->GetSiteInstance() != new_instance)
+ create_render_frame_flags |= CREATE_RENDER_WIDGET_HOST;
}
}
+ create_render_frame_flags |= delegate_->IsHidden() ? HIDDEN : 0;
+
// Create a non-swapped-out RFH with the given opener.
int route_id = CreateRenderFrame(
- new_instance, opener_route_id, false, is_main_frame,
- delegate_->IsHidden());
+ new_instance, opener_route_id, create_render_frame_flags);
if (route_id == MSG_ROUTING_NONE) {
pending_render_frame_host_.reset();
return;
@@ -988,17 +998,23 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost(
SiteInstance* site_instance,
int view_routing_id,
int frame_routing_id,
- bool swapped_out,
- bool hidden) {
+ int flags) {
if (frame_routing_id == MSG_ROUTING_NONE)
frame_routing_id = site_instance->GetProcess()->GetNextRoutingID();
+ bool swapped_out = flags & SWAPPED_OUT;
+ bool hidden = flags & HIDDEN;
+
// Create a RVH for main frames, or find the existing one for subframes.
FrameTree* frame_tree = frame_tree_node_->frame_tree();
RenderViewHostImpl* render_view_host = NULL;
if (frame_tree_node_->IsMainFrame()) {
render_view_host = frame_tree->CreateRenderViewHost(
- site_instance, view_routing_id, frame_routing_id, swapped_out, hidden);
+ site_instance,
+ view_routing_id,
+ frame_routing_id,
+ swapped_out,
+ hidden);
} else {
render_view_host = frame_tree->GetRenderViewHost(site_instance);
@@ -1009,20 +1025,21 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost(
scoped_ptr<RenderFrameHostImpl> render_frame_host =
make_scoped_ptr(RenderFrameHostFactory::Create(render_view_host,
render_frame_delegate_,
+ render_widget_delegate_,
frame_tree,
frame_tree_node_,
frame_routing_id,
- swapped_out).release());
+ flags).release());
return render_frame_host.Pass();
}
int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance,
int opener_route_id,
- bool swapped_out,
- bool for_main_frame_navigation,
- bool hidden) {
+ int flags) {
+ bool swapped_out = flags & SWAPPED_OUT;
CHECK(instance);
- DCHECK(!swapped_out || hidden); // Swapped out views should always be hidden.
+ // Swapped out views should always be hidden.
+ DCHECK(!swapped_out || (flags & HIDDEN));
// TODO(nasko): Remove the following CHECK once cross-site navigation no
// longer relies on swapped out RFH for the top-level frame.
@@ -1070,8 +1087,10 @@ int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance,
}
} else {
// Create a new RenderFrameHost if we don't find an existing one.
- new_render_frame_host = CreateRenderFrameHost(
- instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, swapped_out, hidden);
+ new_render_frame_host = CreateRenderFrameHost(instance,
+ MSG_ROUTING_NONE,
+ MSG_ROUTING_NONE,
+ flags);
RenderViewHostImpl* render_view_host =
new_render_frame_host->render_view_host();
int proxy_routing_id = MSG_ROUTING_NONE;
@@ -1092,11 +1111,15 @@ int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance,
bool success = InitRenderView(render_view_host,
opener_route_id,
proxy_routing_id,
- for_main_frame_navigation);
+ flags & FOR_MAIN_FRAME_NAVIGATION);
if (success) {
if (frame_tree_node_->IsMainFrame()) {
// Don't show the main frame's view until we get a DidNavigate from it.
- render_view_host->GetView()->Hide();
+ // Only top-level RenderViewHosts have RenderWidgetHostViews;
+ // RenderWidgetHosts for out-of-process iframes will be created
+ // later and hidden.
+ if (render_view_host->GetView())
+ render_view_host->GetView()->Hide();
} else if (!swapped_out) {
// Init the RFH, so a RenderFrame is created in the renderer.
DCHECK(new_render_frame_host.get());
@@ -1230,8 +1253,8 @@ void RenderFrameHostManager::CommitPending() {
// Remember if the page was focused so we can focus the new renderer in
// that case.
bool focus_render_view = !will_focus_location_bar &&
- render_frame_host_->render_view_host()->GetView() &&
- render_frame_host_->render_view_host()->GetView()->HasFocus();
+ render_frame_host_->GetView() &&
+ render_frame_host_->GetView()->HasFocus();
bool is_main_frame = frame_tree_node_->IsMainFrame();
@@ -1246,10 +1269,10 @@ void RenderFrameHostManager::CommitPending() {
render_frame_host_->GetProcess()->RemovePendingView();
// Show the new view (or a sad tab) if necessary.
- bool new_rfh_has_view = !!render_frame_host_->render_view_host()->GetView();
+ bool new_rfh_has_view = !!render_frame_host_->GetView();
if (!delegate_->IsHidden() && new_rfh_has_view) {
// In most cases, we need to show the new view.
- render_frame_host_->render_view_host()->GetView()->Show();
+ render_frame_host_->GetView()->Show();
}
if (!new_rfh_has_view) {
// If the view is gone, then this RenderViewHost died while it was hidden.
@@ -1273,8 +1296,8 @@ void RenderFrameHostManager::CommitPending() {
if (will_focus_location_bar) {
delegate_->SetFocusToLocationBar(false);
} else if (focus_render_view &&
- render_frame_host_->render_view_host()->GetView()) {
- render_frame_host_->render_view_host()->GetView()->Focus();
+ render_frame_host_->GetView()) {
+ render_frame_host_->GetView()->Focus();
}
// Notify that we've swapped RenderFrameHosts. We do this before shutting down
@@ -1300,7 +1323,7 @@ void RenderFrameHostManager::CommitPending() {
RenderFrameProxyHost* proxy_to_parent = GetProxyToParent();
if (proxy_to_parent) {
proxy_to_parent->SetChildRWHView(
- render_frame_host_->render_view_host()->GetView());
+ render_frame_host_->GetView());
}
}
}

Powered by Google App Engine
This is Rietveld 408576698