Chromium Code Reviews| 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 2aba4bcb91a3ec52f4d25e195000466ec695f8ed..8672abaac5648b0020e44eba6083ec2781705113 100644 |
| --- a/content/browser/web_contents/web_contents_impl.cc |
| +++ b/content/browser/web_contents/web_contents_impl.cc |
| @@ -2418,6 +2418,46 @@ void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) { |
| GetRenderViewHost()->ClosePage(); |
| } |
| +void WebContentsImpl::RouteMessageEvent( |
| + RenderViewHost* rvh, |
| + const ViewHostMsg_PostMessage_Params& params) { |
| + // Deliver the message to the active RenderViewHost, as long as the request |
| + // came from a RenderViewHost in the same BrowsingInstance. |
| + if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) { |
| + ViewHostMsg_PostMessage_Params new_params(params); |
| + |
| + // 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 |
| + // chain as well, since those will also be accessible to the target page. |
| + if (new_params.source_routing_id != MSG_ROUTING_NONE) { |
| + // Try to look up the WebContents for the source page. |
| + WebContentsImpl* source_contents = NULL; |
| + RenderViewHostImpl* source_rvh = RenderViewHostImpl::FromID( |
| + rvh->GetProcess()->GetID(), params.source_routing_id); |
| + RenderViewHostDelegate* source_delegate = source_rvh->GetDelegate(); |
|
Matt Perry
2012/05/11 21:59:34
Is it possible for source_rvh to be NULL?
Charlie Reis
2012/05/11 22:36:02
Good call. Can't trust the renderer to pass a leg
|
| + if (source_delegate->GetRenderViewType() == |
| + content::VIEW_TYPE_WEB_CONTENTS) { |
| + source_contents = static_cast<WebContentsImpl*>(source_delegate); |
| + } |
| + |
| + if (source_contents) { |
| + new_params.source_routing_id = |
| + source_contents->CreateOpenerRenderViews(GetSiteInstance()); |
| + } else { |
| + // We couldn't find it, so don't pass a source frame. |
| + new_params.source_routing_id = MSG_ROUTING_NONE; |
| + } |
| + } |
| + |
| + // In most cases, we receive this from a swapped out RenderViewHost. |
| + // It is possible to receive it from one that has just been swapped in, |
| + // in which case we might as well deliver the message anyway. |
| + GetRenderViewHost()->Send(new ViewMsg_PostMessageEvent( |
| + GetRenderViewHost()->GetRoutingID(), new_params)); |
| + } |
| +} |
| + |
| void WebContentsImpl::RunJavaScriptMessage( |
| RenderViewHost* rvh, |
| const string16& message, |