1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/renderer/render_frame_proxy.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <map> 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/lazy_instance.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/child/webmessageportchannel_impl.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/common/frame_messages.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/common/swapped_out_messages.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/common/view_messages.h" 146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/renderer/child_frame_compositing_helper.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/renderer/render_frame_impl.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/renderer/render_thread_impl.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/renderer/render_view_impl.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/web/WebLocalFrame.h" 196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace content { 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Facilitates lookup of RenderFrameProxy by routing_id. 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)typedef std::map<int, RenderFrameProxy*> RoutingIDProxyMap; 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static base::LazyInstance<RoutingIDProxyMap> g_routing_id_proxy_map = 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Facilitates lookup of RenderFrameProxy by WebFrame. 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochtypedef std::map<blink::WebFrame*, RenderFrameProxy*> FrameMap; 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::LazyInstance<FrameMap> g_frame_map = LAZY_INSTANCE_INITIALIZER; 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static 37116680a4aac90f2aa7413d9095a592090648e557Ben MurdochRenderFrameProxy* RenderFrameProxy::CreateProxyToReplaceFrame( 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameImpl* frame_to_replace, 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int routing_id) { 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK_NE(routing_id, MSG_ROUTING_NONE); 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<RenderFrameProxy> proxy( 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new RenderFrameProxy(routing_id, frame_to_replace->GetRoutingID())); 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // When a RenderFrame is replaced by a RenderProxy, the WebRemoteFrame should 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // always come from WebRemoteFrame::create and a call to WebFrame::swap must 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // follow later. 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) blink::WebRemoteFrame* web_frame = blink::WebRemoteFrame::create(proxy.get()); 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch proxy->Init(web_frame, frame_to_replace->render_view()); 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return proxy.release(); 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 53116680a4aac90f2aa7413d9095a592090648e557Ben MurdochRenderFrameProxy* RenderFrameProxy::CreateFrameProxy( 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int routing_id, 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int parent_routing_id, 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int render_view_routing_id) { 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<RenderFrameProxy> proxy( 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new RenderFrameProxy(routing_id, MSG_ROUTING_NONE)); 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderViewImpl* render_view = NULL; 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebRemoteFrame* web_frame = NULL; 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (parent_routing_id == MSG_ROUTING_NONE) { 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Create a top level frame. 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view = RenderViewImpl::FromRoutingID(render_view_routing_id); 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_frame = blink::WebRemoteFrame::create(proxy.get()); 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view->webview()->setMainFrame(web_frame); 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Create a frame under an existing parent. The parent is always expected 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // to be a RenderFrameProxy, because navigations initiated by local frames 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // should not wind up here. 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameProxy* parent = 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameProxy::FromRoutingID(parent_routing_id); 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) web_frame = parent->web_frame()->createRemoteChild("", proxy.get()); 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view = parent->render_view(); 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch proxy->Init(web_frame, render_view); 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return proxy.release(); 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)RenderFrameProxy* RenderFrameProxy::FromRoutingID(int32 routing_id) { 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RoutingIDProxyMap* proxies = g_routing_id_proxy_map.Pointer(); 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RoutingIDProxyMap::iterator it = proxies->find(routing_id); 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return it == proxies->end() ? NULL : it->second; 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static 89116680a4aac90f2aa7413d9095a592090648e557Ben MurdochRenderFrameProxy* RenderFrameProxy::FromWebFrame(blink::WebFrame* web_frame) { 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FrameMap::iterator iter = g_frame_map.Get().find(web_frame); 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (iter != g_frame_map.Get().end()) { 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameProxy* proxy = iter->second; 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK_EQ(web_frame, proxy->web_frame()); 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return proxy; 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return NULL; 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : routing_id_(routing_id), 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch frame_routing_id_(frame_routing_id), 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_frame_(NULL), 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_(NULL) { 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::pair<RoutingIDProxyMap::iterator, bool> result = 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CHECK(result.second) << "Inserting a duplicate item."; 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderThread::Get()->AddRoute(routing_id_, this); 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)RenderFrameProxy::~RenderFrameProxy() { 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view()->UnregisterRenderFrameProxy(this); 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FrameMap::iterator it = g_frame_map.Get().find(web_frame_); 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK(it != g_frame_map.Get().end()); 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK_EQ(it->second, this); 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch g_frame_map.Get().erase(it); 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderThread::Get()->RemoveRoute(routing_id_); 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) g_routing_id_proxy_map.Get().erase(routing_id_); 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(nick): Call close unconditionally when web_frame() is always remote. 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (web_frame()->isWebRemoteFrame()) 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_frame()->close(); 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderFrameProxy::Init(blink::WebRemoteFrame* web_frame, 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderViewImpl* render_view) { 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK(web_frame); 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK(render_view); 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_frame_ = web_frame; 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_ = render_view; 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(nick): Should all RenderFrameProxies remain observers of their views? 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_->RegisterRenderFrameProxy(this); 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::pair<FrameMap::iterator, bool> result = 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch g_frame_map.Get().insert(std::make_pair(web_frame_, this)); 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK(result.second) << "Inserted a duplicate item."; 1406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void RenderFrameProxy::DidCommitCompositorFrame() { 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (compositing_helper_.get()) 1446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) compositing_helper_->DidCommitCompositorFrame(); 1456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool handled = true; 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(RenderFrameProxy, msg) 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_DeleteProxy, OnDeleteProxy) 1516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_ChildFrameProcessGone, OnChildFrameProcessGone) 1526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(FrameMsg_CompositorFrameSwapped, 1536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OnCompositorFrameSwapped(msg)) 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(FrameMsg_DisownOpener, OnDisownOpener) 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If |handled| is true, |this| may have been deleted. 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (handled) 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameImpl* render_frame = 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameImpl::FromRoutingID(frame_routing_id_); 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return render_frame && render_frame->OnMessageReceived(msg); 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool RenderFrameProxy::Send(IPC::Message* message) { 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) { 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delete message; 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message->set_routing_id(routing_id_); 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return RenderThread::Get()->Send(message); 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderFrameProxy::OnDeleteProxy() { 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameImpl* render_frame = 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameImpl::FromRoutingID(frame_routing_id_); 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (render_frame) 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame->set_render_frame_proxy(NULL); 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delete this; 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void RenderFrameProxy::OnChildFrameProcessGone() { 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (compositing_helper_.get()) 1886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) compositing_helper_->ChildFrameGone(); 1896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void RenderFrameProxy::OnCompositorFrameSwapped(const IPC::Message& message) { 1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) FrameMsg_CompositorFrameSwapped::Param param; 1936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!FrameMsg_CompositorFrameSwapped::Read(&message, ¶m)) 1946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 1956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); 1976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) param.a.frame.AssignTo(frame.get()); 1986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!compositing_helper_.get()) { 2006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) compositing_helper_ = 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChildFrameCompositingHelper::CreateForRenderFrameProxy(this); 2026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) compositing_helper_->EnableCompositing(true); 2036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 2046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) compositing_helper_->OnCompositorFrameSwapped(frame.Pass(), 2056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) param.a.producing_route_id, 2066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) param.a.output_surface_id, 2076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) param.a.producing_host_id, 2086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) param.a.shared_memory_handle); 2096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameProxy::OnDisownOpener() { 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(creis): We should only see this for main frames for now. To support 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // disowning the opener on subframes, we will need to move WebContentsImpl's 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // opener_ to FrameTreeNode. 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(!web_frame_->parent()); 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // When there is a RenderFrame for this proxy, tell it to disown its opener. 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(creis): Remove this when we only have WebRemoteFrames and make sure 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // they know they have an opener. 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderFrameImpl* render_frame = 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderFrameImpl::FromRoutingID(frame_routing_id_); 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (render_frame) { 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (render_frame->GetWebFrame()->opener()) 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_frame->GetWebFrame()->setOpener(NULL); 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (web_frame_->opener()) 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_frame_->setOpener(NULL); 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameProxy::postMessageEvent( 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebLocalFrame* source_frame, 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebRemoteFrame* target_frame, 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebSecurityOrigin target_origin, 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebDOMMessageEvent event) { 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!web_frame_ || web_frame_ == target_frame); 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ViewMsg_PostMessage_Params params; 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.is_data_raw_string = false; 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.data = event.data().toString(); 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.source_origin = event.origin(); 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!target_origin.isNull()) 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.target_origin = target_origin.toString(); 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebMessagePortChannelArray channels = event.releaseChannels(); 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!channels.isEmpty()) { 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<int> message_port_ids(channels.size()); 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Extract the port IDs from the channel array. 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < channels.size(); ++i) { 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebMessagePortChannelImpl* webchannel = 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<WebMessagePortChannelImpl*>(channels[i]); 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci message_port_ids[i] = webchannel->message_port_id(); 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci webchannel->QueueMessages(); 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_NE(message_port_ids[i], MSG_ROUTING_NONE); 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.message_port_ids = message_port_ids; 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Include the routing ID for the source frame (if one exists), which the 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // browser process will translate into the routing ID for the equivalent 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // frame in the target process. 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.source_routing_id = MSG_ROUTING_NONE; 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (source_frame) { 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderViewImpl* source_view = 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderViewImpl::FromWebView(source_frame->view()); 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (source_view) 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.source_routing_id = source_view->routing_id(); 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new ViewHostMsg_RouteMessageEvent(render_view_->GetRoutingID(), params)); 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameProxy::initializeChildFrame( 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const blink::WebRect& frame_rect, 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci float scale_factor) { 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new FrameHostMsg_InitializeChildFrame( 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci routing_id_, frame_rect, scale_factor)); 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 282