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