1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/android/in_process/synchronous_compositor_impl.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/lazy_instance.h"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/input/input_handler.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/android/in_process/synchronous_compositor_factory_impl.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/android/in_process/synchronous_input_event_filter.h"
125e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_android.h"
13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/common/input/did_overscroll_params.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/android/synchronous_compositor_client.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
18bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "ui/gl/gl_surface.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content {
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)int GetInProcessRendererId() {
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  content::RenderProcessHost::iterator it =
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::RenderProcessHost::AllHostsIterator();
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (it.IsAtEnd()) {
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // There should always be one RPH in single process mode.
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    NOTREACHED();
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return 0;
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int id = it.GetCurrentValue()->GetID();
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  it.Advance();
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(it.IsAtEnd());  // Not multiprocess compatible.
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return id;
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)base::LazyInstance<SynchronousCompositorFactoryImpl>::Leaky g_factory =
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEFINE_WEB_CONTENTS_USER_DATA_KEY(SynchronousCompositorImpl);
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// static
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)SynchronousCompositorImpl* SynchronousCompositorImpl::FromID(int process_id,
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                             int routing_id) {
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (g_factory == NULL)
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RenderViewHost* rvh = RenderViewHost::FromID(process_id, routing_id);
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!rvh)
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebContents* contents = WebContents::FromRenderViewHost(rvh);
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!contents)
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return FromWebContents(contents);
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)SynchronousCompositorImpl* SynchronousCompositorImpl::FromRoutingID(
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int routing_id) {
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return FromID(GetInProcessRendererId(), routing_id);
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)SynchronousCompositorImpl::SynchronousCompositorImpl(WebContents* contents)
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : compositor_client_(NULL),
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      output_surface_(NULL),
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      contents_(contents),
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      input_handler_(NULL),
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      weak_ptr_factory_(this) {
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(contents);
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)SynchronousCompositorImpl::~SynchronousCompositorImpl() {
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (compositor_client_)
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    compositor_client_->DidDestroyCompositor(this);
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SetInputHandler(NULL);
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SynchronousCompositorImpl::SetClient(
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SynchronousCompositorClient* compositor_client) {
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(CalledOnValidThread());
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  compositor_client_ = compositor_client;
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SynchronousCompositor::SetGpuService(
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<gpu::InProcessCommandBuffer::Service> service) {
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_factory.Get().SetDeferredGpuService(service);
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SynchronousCompositor::SetRecordFullDocument(bool record_full_document) {
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  g_factory.Get().SetRecordFullDocument(record_full_document);
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool SynchronousCompositorImpl::InitializeHwDraw() {
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(CalledOnValidThread());
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(output_surface_);
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<cc::ContextProvider> onscreen_context =
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      g_factory.Get().CreateOnscreenContextProviderForCompositorThread();
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool success = output_surface_->InitializeHwDraw(onscreen_context);
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (success)
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    g_factory.Get().CompositorInitializedHardwareDraw();
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return success;
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SynchronousCompositorImpl::ReleaseHwDraw() {
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(CalledOnValidThread());
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(output_surface_);
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  output_surface_->ReleaseHwDraw();
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_factory.Get().CompositorReleasedHardwareDraw();
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<cc::CompositorFrame> SynchronousCompositorImpl::DemandDrawHw(
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gfx::Size surface_size,
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::Transform& transform,
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gfx::Rect viewport,
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    gfx::Rect clip,
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    gfx::Rect viewport_rect_for_tile_priority,
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const gfx::Transform& transform_for_tile_priority) {
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(CalledOnValidThread());
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(output_surface_);
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<cc::CompositorFrame> frame =
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      output_surface_->DemandDrawHw(surface_size,
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    transform,
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    viewport,
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    clip,
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    viewport_rect_for_tile_priority,
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    transform_for_tile_priority);
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (frame.get())
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UpdateFrameMetaData(frame->metadata);
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return frame.Pass();
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SynchronousCompositorImpl::ReturnResources(
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const cc::CompositorFrameAck& frame_ack) {
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(CalledOnValidThread());
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  output_surface_->ReturnResources(frame_ack);
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool SynchronousCompositorImpl::DemandDrawSw(SkCanvas* canvas) {
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(CalledOnValidThread());
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(output_surface_);
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<cc::CompositorFrame> frame = output_surface_->DemandDrawSw(canvas);
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (frame.get())
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UpdateFrameMetaData(frame->metadata);
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return !!frame.get();
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SynchronousCompositorImpl::UpdateFrameMetaData(
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const cc::CompositorFrameMetadata& frame_metadata) {
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>(
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      contents_->GetRenderWidgetHostView());
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (rwhv)
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    rwhv->SynchronousFrameMetadata(frame_metadata);
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DeliverMessages();
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void SynchronousCompositorImpl::SetMemoryPolicy(
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const SynchronousCompositorMemoryPolicy& policy) {
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(CalledOnValidThread());
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(output_surface_);
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  output_surface_->SetMemoryPolicy(policy);
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void SynchronousCompositorImpl::DidChangeRootLayerScrollOffset() {
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (input_handler_)
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    input_handler_->OnRootLayerDelegatedScrollOffsetChanged();
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SynchronousCompositorImpl::DidBindOutputSurface(
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SynchronousCompositorOutputSurface* output_surface) {
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(CalledOnValidThread());
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  output_surface_ = output_surface;
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (compositor_client_)
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    compositor_client_->DidInitializeCompositor(this);
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SynchronousCompositorImpl::DidDestroySynchronousOutputSurface(
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)       SynchronousCompositorOutputSurface* output_surface) {
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(CalledOnValidThread());
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Allow for transient hand-over when two output surfaces may refer to
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // a single delegate.
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (output_surface_ == output_surface) {
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    output_surface_ = NULL;
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (compositor_client_)
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      compositor_client_->DidDestroyCompositor(this);
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    compositor_client_ = NULL;
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void SynchronousCompositorImpl::SetInputHandler(
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    cc::InputHandler* input_handler) {
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(CalledOnValidThread());
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (input_handler_)
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    input_handler_->SetRootLayerScrollOffsetDelegate(NULL);
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  input_handler_ = input_handler;
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (input_handler_)
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    input_handler_->SetRootLayerScrollOffsetDelegate(this);
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SynchronousCompositorImpl::DidOverscroll(
215e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const DidOverscrollParams& params) {
2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (compositor_client_) {
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    compositor_client_->DidOverscroll(params.accumulated_overscroll,
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                      params.latest_overscroll_delta,
2199ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                      params.current_fling_velocity);
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SynchronousCompositorImpl::DidStopFlinging() {
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>(
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      contents_->GetRenderWidgetHostView());
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (rwhv)
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    rwhv->DidStopFlinging();
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SynchronousCompositorImpl::SetContinuousInvalidate(bool enable) {
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(CalledOnValidThread());
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (compositor_client_)
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    compositor_client_->SetContinuousInvalidate(enable);
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)InputEventAckState SynchronousCompositorImpl::HandleInputEvent(
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebInputEvent& input_event) {
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(CalledOnValidThread());
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return g_factory.Get().synchronous_input_event_filter()->HandleInputEvent(
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      contents_->GetRoutingID(), input_event);
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SynchronousCompositorImpl::DeliverMessages() {
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<IPC::Message> messages;
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  output_surface_->GetMessagesToDeliver(&messages);
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RenderProcessHost* rph = contents_->GetRenderProcessHost();
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (ScopedVector<IPC::Message>::const_iterator i = messages.begin();
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       i != messages.end();
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       ++i) {
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    rph->OnMessageReceived(**i);
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
254ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid SynchronousCompositorImpl::DidActivatePendingTree() {
255ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (compositor_client_)
256ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    compositor_client_->DidUpdateContent();
257ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
258ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)gfx::Vector2dF SynchronousCompositorImpl::GetTotalScrollOffset() {
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(CalledOnValidThread());
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (compositor_client_)
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return compositor_client_->GetTotalRootLayerScrollOffset();
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return gfx::Vector2dF();
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool SynchronousCompositorImpl::IsExternalFlingActive() const {
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(CalledOnValidThread());
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (compositor_client_)
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return compositor_client_->IsExternalFlingActive();
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return false;
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SynchronousCompositorImpl::UpdateRootLayerState(
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::Vector2dF& total_scroll_offset,
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::Vector2dF& max_scroll_offset,
276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::SizeF& scrollable_size,
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    float page_scale_factor,
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    float min_page_scale_factor,
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    float max_page_scale_factor) {
28068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(CalledOnValidThread());
281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!compositor_client_)
282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  compositor_client_->UpdateRootLayerState(total_scroll_offset,
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           max_scroll_offset,
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           scrollable_size,
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           page_scale_factor,
288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           min_page_scale_factor,
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           max_page_scale_factor);
29068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
29168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Not using base::NonThreadSafe as we want to enforce a more exacting threading
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// requirement: SynchronousCompositorImpl() must only be used on the UI thread.
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool SynchronousCompositorImpl::CalledOnValidThread() const {
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return BrowserThread::CurrentlyOn(BrowserThread::UI);
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// static
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SynchronousCompositor::SetClientForWebContents(
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    WebContents* contents,
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SynchronousCompositorClient* client) {
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(contents);
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (client) {
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    g_factory.Get();  // Ensure it's initialized.
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SynchronousCompositorImpl::CreateForWebContents(contents);
306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (SynchronousCompositorImpl* instance =
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SynchronousCompositorImpl::FromWebContents(contents)) {
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    instance->SetClient(client);
310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace content
314