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, &param))
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