Index: content/browser/android/synchronous_compositor_observer.cc |
diff --git a/content/browser/android/synchronous_compositor_observer.cc b/content/browser/android/synchronous_compositor_observer.cc |
index bbf778510d8fa626117f3936b826edc8eff23304..7ee5ad6cf005a7597d5d10e34f0b39850babeb74 100644 |
--- a/content/browser/android/synchronous_compositor_observer.cc |
+++ b/content/browser/android/synchronous_compositor_observer.cc |
@@ -30,7 +30,8 @@ SynchronousCompositorObserver* SynchronousCompositorObserver::GetOrCreateFor( |
} |
SynchronousCompositorObserver::SynchronousCompositorObserver(int process_id) |
- : render_process_host_(RenderProcessHost::FromID(process_id)), |
+ : BrowserMessageFilter(SyncCompositorMsgStart), |
+ render_process_host_(RenderProcessHost::FromID(process_id)), |
window_android_in_vsync_(nullptr) { |
DCHECK(render_process_host_); |
DCHECK(!base::ContainsKey(g_instances.Get(), render_process_host_->GetID())); |
@@ -68,6 +69,52 @@ void SynchronousCompositorObserver::SyncStateAfterVSync( |
window_android_in_vsync_->AddObserver(this); |
} |
+bool SynchronousCompositorObserver::OnMessageReceived( |
+ const IPC::Message& message) { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorObserver, message) |
+ IPC_MESSAGE_HANDLER_GENERIC(SyncCompositorHostMsg_ReturnFrame, |
+ ReceiveFrame(message)) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+} |
+ |
+bool SynchronousCompositorObserver::ReceiveFrame(const IPC::Message& message) { |
+ SyncCompositorHostMsg_ReturnFrame::Param param; |
+ if (!SyncCompositorHostMsg_ReturnFrame::Read(&message, ¶m)) |
+ return false; |
+ uint32_t compositor_frame_sink_id = std::get<0>(param); |
+ cc::CompositorFrame compositor_frame = std::move(std::get<1>(param)); |
+ |
+ content::SynchronousCompositor::Frame frame; |
+ frame.frame.reset(new cc::CompositorFrame); |
+ frame.compositor_frame_sink_id = compositor_frame_sink_id; |
+ *frame.frame = std::move(compositor_frame); |
+ |
+ if (!frame.frame->delegated_frame_data) { |
+ frame.frame.reset(); |
+ } |
+ |
+ std::unique_ptr<SynchronousCompositor::Frame> frame_ptr = |
+ base::MakeUnique<SynchronousCompositor::Frame>(); |
+ frame_ptr->frame = std::move(frame.frame); |
+ frame_ptr->compositor_frame_sink_id = frame.compositor_frame_sink_id; |
+ |
+ int routing_id = message.routing_id(); |
+ |
+ future_map_[routing_id]->setFrame(std::move(frame_ptr)); |
+ |
+ return true; |
+} |
+ |
+void SynchronousCompositorObserver::SetFrameFuture( |
+ const int routing_id, |
+ const scoped_refptr<content::SynchronousCompositor::FrameFuture>& |
+ frame_future) { |
+ future_map_[routing_id] = std::move(frame_future); |
+} |
+ |
void SynchronousCompositorObserver::OnCompositingDidCommit() { |
NOTREACHED(); |
} |