Index: content/renderer/render_frame_proxy.cc |
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc |
index f9643248a0bb2be36520df23e6c98936aa8084dc..2e85a52ded03a713ed2fb61dc4909dccaa32566c 100644 |
--- a/content/renderer/render_frame_proxy.cc |
+++ b/content/renderer/render_frame_proxy.cc |
@@ -9,9 +9,11 @@ |
#include "base/lazy_instance.h" |
#include "content/common/frame_messages.h" |
#include "content/common/swapped_out_messages.h" |
+#include "content/renderer/child_frame_compositing_helper.h" |
#include "content/renderer/render_frame_impl.h" |
#include "content/renderer/render_thread_impl.h" |
#include "content/renderer/render_view_impl.h" |
+#include "third_party/WebKit/public/web/WebView.h" |
namespace content { |
@@ -48,17 +50,32 @@ RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) |
render_frame_ = RenderFrameImpl::FromRoutingID(frame_routing_id); |
CHECK(render_frame_); |
+ render_frame_->render_view()->RegisterRenderFrameProxy(this); |
} |
RenderFrameProxy::~RenderFrameProxy() { |
+ render_frame_->render_view()->UnregisterRenderFrameProxy(this); |
RenderThread::Get()->RemoveRoute(routing_id_); |
g_routing_id_proxy_map.Get().erase(routing_id_); |
} |
+blink::WebFrame* RenderFrameProxy::GetWebFrame() { |
+ return render_frame_->GetWebFrame(); |
+} |
+ |
+void RenderFrameProxy::DidCommitCompositorFrame() { |
+ if (compositing_helper_) |
+ compositing_helper_->DidCommitCompositorFrame(); |
+} |
+ |
bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(RenderFrameProxy, msg) |
IPC_MESSAGE_HANDLER(FrameMsg_DeleteProxy, OnDeleteProxy) |
+ IPC_MESSAGE_HANDLER(FrameMsg_ChildFrameProcessGone, OnChildFrameProcessGone) |
+ IPC_MESSAGE_HANDLER(FrameMsg_BuffersSwapped, OnBuffersSwapped) |
+ IPC_MESSAGE_HANDLER_GENERIC(FrameMsg_CompositorFrameSwapped, |
+ OnCompositorFrameSwapped(msg)) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
@@ -86,4 +103,46 @@ void RenderFrameProxy::OnDeleteProxy() { |
delete this; |
} |
+void RenderFrameProxy::OnChildFrameProcessGone() { |
+ if (compositing_helper_) |
+ compositing_helper_->ChildFrameGone(); |
+} |
+ |
+void RenderFrameProxy::OnBuffersSwapped( |
+ const FrameMsg_BuffersSwapped_Params& params) { |
+ if (!compositing_helper_.get()) { |
+ compositing_helper_ = |
+ ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame( |
+ GetWebFrame(), this, routing_id_); |
+ compositing_helper_->EnableCompositing(true); |
+ } |
+ compositing_helper_->OnBuffersSwapped( |
+ params.size, |
+ params.mailbox, |
+ params.gpu_route_id, |
+ params.gpu_host_id, |
+ render_frame_->render_view()->GetWebView()->deviceScaleFactor()); |
+} |
+ |
+void RenderFrameProxy::OnCompositorFrameSwapped(const IPC::Message& message) { |
+ FrameMsg_CompositorFrameSwapped::Param param; |
+ if (!FrameMsg_CompositorFrameSwapped::Read(&message, ¶m)) |
+ return; |
+ |
+ scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
+ param.a.frame.AssignTo(frame.get()); |
+ |
+ if (!compositing_helper_.get()) { |
+ compositing_helper_ = |
+ ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame( |
+ GetWebFrame(), this, routing_id_); |
+ compositing_helper_->EnableCompositing(true); |
+ } |
+ compositing_helper_->OnCompositorFrameSwapped(frame.Pass(), |
+ param.a.producing_route_id, |
+ param.a.output_surface_id, |
+ param.a.producing_host_id, |
+ param.a.shared_memory_handle); |
+} |
+ |
} // namespace |