Index: content/browser/web_contents/web_contents_impl.cc |
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc |
index 30d1190aa74d390e60804e765823eb62f95404a1..a96d1b14073c3397fd86793b544732b0405409b2 100644 |
--- a/content/browser/web_contents/web_contents_impl.cc |
+++ b/content/browser/web_contents/web_contents_impl.cc |
@@ -2766,6 +2766,10 @@ void WebContentsImpl::DidChangeLoadProgress(double progress) { |
delegate_->LoadProgressChanged(this, progress); |
} |
+void WebContentsImpl::DidUpdateFrameTree(RenderViewHost* rvh) { |
+ render_manager_.DidUpdateFrameTree(rvh); |
+} |
+ |
void WebContentsImpl::DocumentAvailableInMainFrame( |
RenderViewHost* render_view_host) { |
FOR_EACH_OBSERVER(WebContentsObserver, observers_, |
@@ -2860,6 +2864,12 @@ void WebContentsImpl::RouteMessageEvent( |
ViewMsg_PostMessage_Params new_params(params); |
+ // If the renderer has changed while the post message is being routed, |
+ // drop the message, as it will not be delivered to the right target. |
+ if (GetRenderViewHost()->GetProcess()->GetID() != params.target_process_id) |
+ return; |
+ DCHECK(params.target_frame_id != 0); |
+ |
// If there is a source_routing_id, translate it to the routing ID for |
// the equivalent swapped out RVH in the target process. If we need |
// to create a swapped out RVH for the source tab, we create its opener |
@@ -3107,6 +3117,16 @@ int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) { |
if (opener_) |
opener_route_id = opener_->CreateOpenerRenderViews(instance); |
+ // If any of the renderers for this WebContents has the same SiteInstance, |
+ // use it. |
+ if (render_manager_.current_host()->GetSiteInstance() == instance) |
+ return render_manager_.current_host()->GetRoutingID(); |
+ |
+ RenderViewHostImpl* rvh = render_manager_.GetSwappedOutRenderViewHost( |
+ instance); |
+ if (rvh) |
+ return rvh->GetRoutingID(); |
+ |
// Create a swapped out RenderView in the given SiteInstance if none exists, |
// setting its opener to the given route_id. Return the new view's route_id. |
return render_manager_.CreateRenderView(instance, opener_route_id, true); |