Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Side by Side Diff: content/browser/android/in_process/synchronous_compositor_impl.cc

Issue 1385543003: Have RenderWidgetHostViewAndroid own sync compositor (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/android/in_process/synchronous_compositor_impl.h" 5 #include "content/browser/android/in_process/synchronous_compositor_impl.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/supports_user_data.h"
11 #include "content/browser/android/in_process/synchronous_compositor_external_beg in_frame_source.h" 12 #include "content/browser/android/in_process/synchronous_compositor_external_beg in_frame_source.h"
12 #include "content/browser/android/in_process/synchronous_compositor_factory_impl .h" 13 #include "content/browser/android/in_process/synchronous_compositor_factory_impl .h"
13 #include "content/browser/android/in_process/synchronous_compositor_registry.h" 14 #include "content/browser/android/in_process/synchronous_compositor_registry.h"
14 #include "content/browser/android/in_process/synchronous_input_event_filter.h" 15 #include "content/browser/android/in_process/synchronous_input_event_filter.h"
15 #include "content/browser/gpu/gpu_process_host.h" 16 #include "content/browser/gpu/gpu_process_host.h"
16 #include "content/browser/renderer_host/render_widget_host_view_android.h" 17 #include "content/browser/renderer_host/render_widget_host_view_android.h"
17 #include "content/common/input/did_overscroll_params.h" 18 #include "content/common/input/did_overscroll_params.h"
18 #include "content/common/input_messages.h" 19 #include "content/common/input_messages.h"
19 #include "content/public/browser/android/synchronous_compositor_client.h" 20 #include "content/public/browser/android/synchronous_compositor_client.h"
20 #include "content/public/browser/browser_thread.h" 21 #include "content/public/browser/browser_thread.h"
21 #include "content/public/browser/render_process_host.h" 22 #include "content/public/browser/render_process_host.h"
22 #include "content/public/browser/render_view_host.h" 23 #include "content/public/browser/render_view_host.h"
24 #include "content/public/browser/web_contents.h"
25 #include "content/public/common/child_process_host.h"
23 #include "ui/gfx/geometry/scroll_offset.h" 26 #include "ui/gfx/geometry/scroll_offset.h"
24 #include "ui/gl/gl_surface.h" 27 #include "ui/gl/gl_surface.h"
25 28
26 namespace content { 29 namespace content {
27 30
28 namespace { 31 namespace {
29 32
30 int GetInProcessRendererId() { 33 const int kClientHolderLocatorKey = 0;
31 content::RenderProcessHost::iterator it = 34
32 content::RenderProcessHost::AllHostsIterator(); 35 class ClientHolder : public base::SupportsUserData::Data {
no sievers 2015/10/07 19:13:38 That seems really complicated to store a pointer.
boliu 2015/10/08 03:14:44 Yeah can't be CVC because that could be created mu
33 if (it.IsAtEnd()) { 36 public:
34 // There should always be one RPH in single process mode. 37 static void CreateForWebContents(WebContents* contents,
35 NOTREACHED(); 38 SynchronousCompositorClient* client) {
36 return 0; 39 DCHECK(contents);
40 DCHECK(!FromWebContents(contents));
41 contents->SetUserData(&kClientHolderLocatorKey, new ClientHolder(client));
37 } 42 }
38 43
39 int id = it.GetCurrentValue()->GetID(); 44 static ClientHolder* FromWebContents(WebContents* contents) {
40 it.Advance(); 45 DCHECK(contents);
41 DCHECK(it.IsAtEnd()); // Not multiprocess compatible. 46 return static_cast<ClientHolder*>(
42 return id; 47 contents->GetUserData(&kClientHolderLocatorKey));
43 } 48 }
49
50 SynchronousCompositorClient* client() const { return client_; }
51
52 private:
53 explicit ClientHolder(SynchronousCompositorClient* client)
54 : client_(client) {}
55 ~ClientHolder() override {}
56
57 SynchronousCompositorClient* const client_; // Non-owning.
58
59 DISALLOW_COPY_AND_ASSIGN(ClientHolder);
60 };
61
62 int g_process_id = ChildProcessHost::kInvalidUniqueID;
44 63
45 base::LazyInstance<SynchronousCompositorFactoryImpl>::Leaky g_factory = 64 base::LazyInstance<SynchronousCompositorFactoryImpl>::Leaky g_factory =
46 LAZY_INSTANCE_INITIALIZER; 65 LAZY_INSTANCE_INITIALIZER;
47 66
48 base::Thread* CreateInProcessGpuThreadForSynchronousCompositor( 67 base::Thread* CreateInProcessGpuThreadForSynchronousCompositor(
49 const InProcessChildThreadParams& params) { 68 const InProcessChildThreadParams& params) {
50 return g_factory.Get().CreateInProcessGpuThread(params); 69 return g_factory.Get().CreateInProcessGpuThread(params);
51 } 70 }
52 71
53 } // namespace 72 } // namespace
54 73
55 DEFINE_WEB_CONTENTS_USER_DATA_KEY(SynchronousCompositorImpl); 74 SynchronousCompositorImpl* SynchronousCompositorImpl::FromRoutingID(
75 int routing_id) {
76 if (g_factory == nullptr)
77 return nullptr;
78 if (g_process_id == ChildProcessHost::kInvalidUniqueID)
79 return nullptr;
80 RenderViewHost* rvh = RenderViewHost::FromID(g_process_id, routing_id);
81 if (!rvh)
82 return nullptr;
83 RenderWidgetHostViewAndroid* rwhva =
84 static_cast<RenderWidgetHostViewAndroid*>(rvh->GetView());
85 if (!rwhva)
86 return nullptr;
87 return rwhva->GetSynchronousCompositorImpl();
88 }
56 89
57 // static 90 // static
58 SynchronousCompositorImpl* SynchronousCompositorImpl::FromID(int process_id, 91 scoped_ptr<SynchronousCompositorImpl> SynchronousCompositorImpl::Create(
59 int routing_id) { 92 RenderWidgetHostViewAndroid* rwhva,
60 if (g_factory == nullptr) 93 WebContents* web_contents) {
94 DCHECK(web_contents);
95 ClientHolder* holder = ClientHolder::FromWebContents(web_contents);
96 if (!holder)
61 return nullptr; 97 return nullptr;
62 RenderViewHost* rvh = RenderViewHost::FromID(process_id, routing_id); 98 DCHECK(holder->client());
63 if (!rvh) 99 return make_scoped_ptr(
64 return nullptr; 100 new SynchronousCompositorImpl(rwhva, holder->client()));
65 WebContents* contents = WebContents::FromRenderViewHost(rvh);
66 if (!contents)
67 return nullptr;
68 return FromWebContents(contents);
69 } 101 }
70 102
71 SynchronousCompositorImpl* SynchronousCompositorImpl::FromRoutingID( 103 SynchronousCompositorImpl::SynchronousCompositorImpl(
72 int routing_id) { 104 RenderWidgetHostViewAndroid* rwhva,
73 return FromID(GetInProcessRendererId(), routing_id); 105 SynchronousCompositorClient* client)
74 } 106 : rwhva_(rwhva),
75 107 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()),
76 SynchronousCompositorImpl::SynchronousCompositorImpl(WebContents* contents) 108 compositor_client_(client),
77 : compositor_client_(nullptr),
78 output_surface_(nullptr), 109 output_surface_(nullptr),
79 begin_frame_source_(nullptr), 110 begin_frame_source_(nullptr),
80 contents_(contents),
81 routing_id_(contents->GetRoutingID()),
82 synchronous_input_handler_proxy_(nullptr), 111 synchronous_input_handler_proxy_(nullptr),
83 registered_with_client_(false), 112 registered_with_client_(false),
84 is_active_(true), 113 is_active_(true),
85 renderer_needs_begin_frames_(false), 114 renderer_needs_begin_frames_(false),
86 need_animate_input_(false), 115 need_animate_input_(false),
87 weak_ptr_factory_(this) { 116 weak_ptr_factory_(this) {
88 DCHECK(contents);
89 DCHECK_NE(routing_id_, MSG_ROUTING_NONE); 117 DCHECK_NE(routing_id_, MSG_ROUTING_NONE);
118
119 int process_id = rwhva_->GetRenderWidgetHost()->GetProcess()->GetID();
120 if (g_process_id == ChildProcessHost::kInvalidUniqueID) {
121 g_process_id = process_id;
122 } else {
123 DCHECK_EQ(g_process_id, process_id); // Not multiprocess compatible.
124 }
125
126 SynchronousCompositorRegistry::GetInstance()->RegisterCompositor(
127 routing_id_, this);
90 } 128 }
91 129
92 SynchronousCompositorImpl::~SynchronousCompositorImpl() { 130 SynchronousCompositorImpl::~SynchronousCompositorImpl() {
93 DCHECK(!output_surface_); 131 SynchronousCompositorRegistry::GetInstance()->UnregisterCompositor(
94 DCHECK(!begin_frame_source_); 132 routing_id_, this);
95 DCHECK(!synchronous_input_handler_proxy_);
96 }
97
98 void SynchronousCompositorImpl::SetClient(
99 SynchronousCompositorClient* compositor_client) {
100 DCHECK(CalledOnValidThread());
101 DCHECK_IMPLIES(compositor_client, !compositor_client_);
102 DCHECK_IMPLIES(!compositor_client, compositor_client_);
103
104 if (!compositor_client) {
105 SynchronousCompositorRegistry::GetInstance()->UnregisterCompositor(
106 routing_id_, this);
107 }
108
109 compositor_client_ = compositor_client;
110
111 // SetClient is essentially the constructor and destructor of
112 // SynchronousCompositorImpl.
113 if (compositor_client_) {
114 SynchronousCompositorRegistry::GetInstance()->RegisterCompositor(
115 routing_id_, this);
116 }
117 } 133 }
118 134
119 void SynchronousCompositorImpl::RegisterWithClient() { 135 void SynchronousCompositorImpl::RegisterWithClient() {
120 DCHECK(CalledOnValidThread()); 136 DCHECK(CalledOnValidThread());
121 DCHECK(compositor_client_);
122 DCHECK(output_surface_); 137 DCHECK(output_surface_);
123 DCHECK(synchronous_input_handler_proxy_); 138 DCHECK(synchronous_input_handler_proxy_);
124 DCHECK(!registered_with_client_); 139 DCHECK(!registered_with_client_);
125 registered_with_client_ = true; 140 registered_with_client_ = true;
126 141
127 compositor_client_->DidInitializeCompositor(this); 142 compositor_client_->DidInitializeCompositor(this);
128 143
129 output_surface_->SetTreeActivationCallback( 144 output_surface_->SetTreeActivationCallback(
130 base::Bind(&SynchronousCompositorImpl::DidActivatePendingTree, 145 base::Bind(&SynchronousCompositorImpl::DidActivatePendingTree,
131 weak_ptr_factory_.GetWeakPtr())); 146 weak_ptr_factory_.GetWeakPtr()));
(...skipping 14 matching lines...) Expand all
146 } 161 }
147 162
148 void SynchronousCompositorImpl::DidInitializeRendererObjects( 163 void SynchronousCompositorImpl::DidInitializeRendererObjects(
149 SynchronousCompositorOutputSurface* output_surface, 164 SynchronousCompositorOutputSurface* output_surface,
150 SynchronousCompositorExternalBeginFrameSource* begin_frame_source, 165 SynchronousCompositorExternalBeginFrameSource* begin_frame_source,
151 SynchronousInputHandlerProxy* synchronous_input_handler_proxy) { 166 SynchronousInputHandlerProxy* synchronous_input_handler_proxy) {
152 DCHECK(!output_surface_); 167 DCHECK(!output_surface_);
153 DCHECK(!begin_frame_source_); 168 DCHECK(!begin_frame_source_);
154 DCHECK(output_surface); 169 DCHECK(output_surface);
155 DCHECK(begin_frame_source); 170 DCHECK(begin_frame_source);
156 DCHECK(compositor_client_);
157 DCHECK(synchronous_input_handler_proxy); 171 DCHECK(synchronous_input_handler_proxy);
158 172
159 output_surface_ = output_surface; 173 output_surface_ = output_surface;
160 begin_frame_source_ = begin_frame_source; 174 begin_frame_source_ = begin_frame_source;
161 synchronous_input_handler_proxy_ = synchronous_input_handler_proxy; 175 synchronous_input_handler_proxy_ = synchronous_input_handler_proxy;
162 176
163 output_surface_->SetCompositor(this); 177 output_surface_->SetCompositor(this);
164 begin_frame_source_->SetCompositor(this); 178 begin_frame_source_->SetCompositor(this);
165 } 179 }
166 180
167 void SynchronousCompositorImpl::DidDestroyRendererObjects() { 181 void SynchronousCompositorImpl::DidDestroyRendererObjects() {
168 DCHECK(output_surface_); 182 DCHECK(output_surface_);
169 DCHECK(begin_frame_source_); 183 DCHECK(begin_frame_source_);
170 DCHECK(compositor_client_);
171 184
172 if (registered_with_client_) { 185 if (registered_with_client_) {
173 output_surface_->SetTreeActivationCallback(base::Closure()); 186 output_surface_->SetTreeActivationCallback(base::Closure());
174 compositor_client_->DidDestroyCompositor(this); 187 compositor_client_->DidDestroyCompositor(this);
175 registered_with_client_ = false; 188 registered_with_client_ = false;
176 } 189 }
177 190
178 // This object is being destroyed, so remove pointers to it. 191 // This object is being destroyed, so remove pointers to it.
179 begin_frame_source_->SetCompositor(nullptr); 192 begin_frame_source_->SetCompositor(nullptr);
180 output_surface_->SetCompositor(nullptr); 193 output_surface_->SetCompositor(nullptr);
181 synchronous_input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings( 194 synchronous_input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(
182 nullptr); 195 nullptr);
183 196
184 synchronous_input_handler_proxy_ = nullptr; 197 synchronous_input_handler_proxy_ = nullptr;
185 begin_frame_source_ = nullptr; 198 begin_frame_source_ = nullptr;
186 output_surface_ = nullptr; 199 output_surface_ = nullptr;
187 // Don't propogate this signal from one renderer to the next. 200 // Don't propogate this signal from one renderer to the next.
188 need_animate_input_ = false; 201 need_animate_input_ = false;
189 } 202 }
190 203
191 scoped_ptr<cc::CompositorFrame> SynchronousCompositorImpl::DemandDrawHw( 204 scoped_ptr<cc::CompositorFrame> SynchronousCompositorImpl::DemandDrawHw(
192 gfx::Size surface_size, 205 gfx::Size surface_size,
193 const gfx::Transform& transform, 206 const gfx::Transform& transform,
194 gfx::Rect viewport, 207 gfx::Rect viewport,
195 gfx::Rect clip, 208 gfx::Rect clip,
196 gfx::Rect viewport_rect_for_tile_priority, 209 gfx::Rect viewport_rect_for_tile_priority,
197 const gfx::Transform& transform_for_tile_priority) { 210 const gfx::Transform& transform_for_tile_priority) {
198 DCHECK(CalledOnValidThread()); 211 DCHECK(CalledOnValidThread());
199 DCHECK(output_surface_); 212 DCHECK(output_surface_);
200 DCHECK(compositor_client_);
201 DCHECK(begin_frame_source_); 213 DCHECK(begin_frame_source_);
202 214
203 scoped_ptr<cc::CompositorFrame> frame = 215 scoped_ptr<cc::CompositorFrame> frame =
204 output_surface_->DemandDrawHw(surface_size, 216 output_surface_->DemandDrawHw(surface_size,
205 transform, 217 transform,
206 viewport, 218 viewport,
207 clip, 219 clip,
208 viewport_rect_for_tile_priority, 220 viewport_rect_for_tile_priority,
209 transform_for_tile_priority); 221 transform_for_tile_priority);
210 222
211 if (frame.get()) 223 if (frame.get())
212 UpdateFrameMetaData(frame->metadata); 224 UpdateFrameMetaData(frame->metadata);
213 225
214 return frame.Pass(); 226 return frame.Pass();
215 } 227 }
216 228
217 void SynchronousCompositorImpl::ReturnResources( 229 void SynchronousCompositorImpl::ReturnResources(
218 const cc::CompositorFrameAck& frame_ack) { 230 const cc::CompositorFrameAck& frame_ack) {
219 DCHECK(CalledOnValidThread()); 231 DCHECK(CalledOnValidThread());
220 output_surface_->ReturnResources(frame_ack); 232 output_surface_->ReturnResources(frame_ack);
221 } 233 }
222 234
223 bool SynchronousCompositorImpl::DemandDrawSw(SkCanvas* canvas) { 235 bool SynchronousCompositorImpl::DemandDrawSw(SkCanvas* canvas) {
224 DCHECK(CalledOnValidThread()); 236 DCHECK(CalledOnValidThread());
225 DCHECK(output_surface_); 237 DCHECK(output_surface_);
226 DCHECK(compositor_client_);
227 DCHECK(begin_frame_source_); 238 DCHECK(begin_frame_source_);
228 239
229 scoped_ptr<cc::CompositorFrame> frame = 240 scoped_ptr<cc::CompositorFrame> frame =
230 output_surface_->DemandDrawSw(canvas); 241 output_surface_->DemandDrawSw(canvas);
231 242
232 if (frame.get()) 243 if (frame.get())
233 UpdateFrameMetaData(frame->metadata); 244 UpdateFrameMetaData(frame->metadata);
234 245
235 return !!frame.get(); 246 return !!frame.get();
236 } 247 }
237 248
238 void SynchronousCompositorImpl::UpdateFrameMetaData( 249 void SynchronousCompositorImpl::UpdateFrameMetaData(
239 const cc::CompositorFrameMetadata& frame_metadata) { 250 const cc::CompositorFrameMetadata& frame_metadata) {
240 RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>( 251 rwhva_->SynchronousFrameMetadata(frame_metadata);
241 contents_->GetRenderWidgetHostView());
242 if (rwhv)
243 rwhv->SynchronousFrameMetadata(frame_metadata);
244 DeliverMessages(); 252 DeliverMessages();
245 } 253 }
246 254
247 void SynchronousCompositorImpl::SetMemoryPolicy(size_t bytes_limit) { 255 void SynchronousCompositorImpl::SetMemoryPolicy(size_t bytes_limit) {
248 DCHECK(CalledOnValidThread()); 256 DCHECK(CalledOnValidThread());
249 DCHECK(output_surface_); 257 DCHECK(output_surface_);
250 258
251 size_t current_bytes_limit = output_surface_->GetMemoryPolicy(); 259 size_t current_bytes_limit = output_surface_->GetMemoryPolicy();
252 output_surface_->SetMemoryPolicy(bytes_limit); 260 output_surface_->SetMemoryPolicy(bytes_limit);
253 261
254 if (bytes_limit && !current_bytes_limit) { 262 if (bytes_limit && !current_bytes_limit) {
255 g_factory.Get().CompositorInitializedHardwareDraw(); 263 g_factory.Get().CompositorInitializedHardwareDraw();
256 } else if (!bytes_limit && current_bytes_limit) { 264 } else if (!bytes_limit && current_bytes_limit) {
257 g_factory.Get().CompositorReleasedHardwareDraw(); 265 g_factory.Get().CompositorReleasedHardwareDraw();
258 } 266 }
259 } 267 }
260 268
261 void SynchronousCompositorImpl::PostInvalidate() { 269 void SynchronousCompositorImpl::PostInvalidate() {
262 DCHECK(CalledOnValidThread()); 270 DCHECK(CalledOnValidThread());
263 DCHECK(compositor_client_);
264 if (registered_with_client_) 271 if (registered_with_client_)
265 compositor_client_->PostInvalidate(); 272 compositor_client_->PostInvalidate();
266 } 273 }
267 274
268 void SynchronousCompositorImpl::DidChangeRootLayerScrollOffset( 275 void SynchronousCompositorImpl::DidChangeRootLayerScrollOffset(
269 const gfx::ScrollOffset& root_offset) { 276 const gfx::ScrollOffset& root_offset) {
270 DCHECK(CalledOnValidThread()); 277 DCHECK(CalledOnValidThread());
271 if (!synchronous_input_handler_proxy_) 278 if (!synchronous_input_handler_proxy_)
272 return; 279 return;
273 synchronous_input_handler_proxy_->SynchronouslySetRootScrollOffset( 280 synchronous_input_handler_proxy_->SynchronouslySetRootScrollOffset(
(...skipping 26 matching lines...) Expand all
300 // Make sure this is a BeginFrame that renderer side explicitly requested. 307 // Make sure this is a BeginFrame that renderer side explicitly requested.
301 // Otherwise it is possible renderer objects not initialized. 308 // Otherwise it is possible renderer objects not initialized.
302 RegisterWithClient(); 309 RegisterWithClient();
303 DCHECK(registered_with_client_); 310 DCHECK(registered_with_client_);
304 } 311 }
305 if (begin_frame_source_) 312 if (begin_frame_source_)
306 begin_frame_source_->BeginFrame(args); 313 begin_frame_source_->BeginFrame(args);
307 } 314 }
308 315
309 void SynchronousCompositorImpl::UpdateNeedsBeginFrames() { 316 void SynchronousCompositorImpl::UpdateNeedsBeginFrames() {
310 RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>( 317 rwhva_->OnSetNeedsBeginFrames(is_active_ && renderer_needs_begin_frames_);
311 contents_->GetRenderWidgetHostView());
312 if (rwhv)
313 rwhv->OnSetNeedsBeginFrames(is_active_ && renderer_needs_begin_frames_);
314 } 318 }
315 319
316 void SynchronousCompositorImpl::DidOverscroll( 320 void SynchronousCompositorImpl::DidOverscroll(
317 const DidOverscrollParams& params) { 321 const DidOverscrollParams& params) {
318 DCHECK(compositor_client_);
319 if (registered_with_client_) { 322 if (registered_with_client_) {
320 compositor_client_->DidOverscroll(params.accumulated_overscroll, 323 compositor_client_->DidOverscroll(params.accumulated_overscroll,
321 params.latest_overscroll_delta, 324 params.latest_overscroll_delta,
322 params.current_fling_velocity); 325 params.current_fling_velocity);
323 } 326 }
324 } 327 }
325 328
326 void SynchronousCompositorImpl::DidStopFlinging() { 329 void SynchronousCompositorImpl::DidStopFlinging() {
327 // It's important that the fling-end notification follow the same path as it 330 // It's important that the fling-end notification follow the same path as it
328 // takes on other platforms (using an IPC). This ensures consistent 331 // takes on other platforms (using an IPC). This ensures consistent
329 // bookkeeping at all stages of the input pipeline. 332 // bookkeeping at all stages of the input pipeline.
330 contents_->GetRenderProcessHost()->OnMessageReceived( 333 rwhva_->GetRenderWidgetHost()->GetProcess()->OnMessageReceived(
331 InputHostMsg_DidStopFlinging(routing_id_)); 334 InputHostMsg_DidStopFlinging(routing_id_));
332 } 335 }
333 336
334 InputEventAckState SynchronousCompositorImpl::HandleInputEvent( 337 InputEventAckState SynchronousCompositorImpl::HandleInputEvent(
335 const blink::WebInputEvent& input_event) { 338 const blink::WebInputEvent& input_event) {
336 DCHECK(CalledOnValidThread()); 339 DCHECK(CalledOnValidThread());
337 return g_factory.Get().synchronous_input_event_filter()->HandleInputEvent( 340 return g_factory.Get().synchronous_input_event_filter()->HandleInputEvent(
338 contents_->GetRoutingID(), input_event); 341 routing_id_, input_event);
339 } 342 }
340 343
341 void SynchronousCompositorImpl::DeliverMessages() { 344 void SynchronousCompositorImpl::DeliverMessages() {
342 ScopedVector<IPC::Message> messages; 345 ScopedVector<IPC::Message> messages;
343 output_surface_->GetMessagesToDeliver(&messages); 346 output_surface_->GetMessagesToDeliver(&messages);
344 RenderProcessHost* rph = contents_->GetRenderProcessHost(); 347 RenderProcessHost* rph = rwhva_->GetRenderWidgetHost()->GetProcess();
345 for (ScopedVector<IPC::Message>::const_iterator i = messages.begin(); 348 for (ScopedVector<IPC::Message>::const_iterator i = messages.begin();
346 i != messages.end(); 349 i != messages.end();
347 ++i) { 350 ++i) {
348 rph->OnMessageReceived(**i); 351 rph->OnMessageReceived(**i);
349 } 352 }
350 } 353 }
351 354
352 void SynchronousCompositorImpl::DidActivatePendingTree() { 355 void SynchronousCompositorImpl::DidActivatePendingTree() {
353 DCHECK(compositor_client_);
354 if (registered_with_client_) 356 if (registered_with_client_)
355 compositor_client_->DidUpdateContent(); 357 compositor_client_->DidUpdateContent();
356 DeliverMessages(); 358 DeliverMessages();
357 } 359 }
358 360
359 void SynchronousCompositorImpl::SetNeedsSynchronousAnimateInput() { 361 void SynchronousCompositorImpl::SetNeedsSynchronousAnimateInput() {
360 DCHECK(CalledOnValidThread()); 362 DCHECK(CalledOnValidThread());
361 DCHECK(compositor_client_);
362 if (!registered_with_client_) 363 if (!registered_with_client_)
363 return; 364 return;
364 need_animate_input_ = true; 365 need_animate_input_ = true;
365 compositor_client_->PostInvalidate(); 366 compositor_client_->PostInvalidate();
366 } 367 }
367 368
368 void SynchronousCompositorImpl::UpdateRootLayerState( 369 void SynchronousCompositorImpl::UpdateRootLayerState(
369 const gfx::ScrollOffset& total_scroll_offset, 370 const gfx::ScrollOffset& total_scroll_offset,
370 const gfx::ScrollOffset& max_scroll_offset, 371 const gfx::ScrollOffset& max_scroll_offset,
371 const gfx::SizeF& scrollable_size, 372 const gfx::SizeF& scrollable_size,
372 float page_scale_factor, 373 float page_scale_factor,
373 float min_page_scale_factor, 374 float min_page_scale_factor,
374 float max_page_scale_factor) { 375 float max_page_scale_factor) {
375 DCHECK(CalledOnValidThread()); 376 DCHECK(CalledOnValidThread());
376 DCHECK(compositor_client_);
377 377
378 if (registered_with_client_) { 378 if (registered_with_client_) {
379 // TODO(miletus): Pass in ScrollOffset. crbug.com/414283. 379 // TODO(miletus): Pass in ScrollOffset. crbug.com/414283.
380 compositor_client_->UpdateRootLayerState( 380 compositor_client_->UpdateRootLayerState(
381 gfx::ScrollOffsetToVector2dF(total_scroll_offset), 381 gfx::ScrollOffsetToVector2dF(total_scroll_offset),
382 gfx::ScrollOffsetToVector2dF(max_scroll_offset), 382 gfx::ScrollOffsetToVector2dF(max_scroll_offset),
383 scrollable_size, 383 scrollable_size,
384 page_scale_factor, 384 page_scale_factor,
385 min_page_scale_factor, 385 min_page_scale_factor,
386 max_page_scale_factor); 386 max_page_scale_factor);
387 } 387 }
388 } 388 }
389 389
390 // Not using base::NonThreadSafe as we want to enforce a more exacting threading 390 // Not using base::NonThreadSafe as we want to enforce a more exacting threading
391 // requirement: SynchronousCompositorImpl() must only be used on the UI thread. 391 // requirement: SynchronousCompositorImpl() must only be used on the UI thread.
392 bool SynchronousCompositorImpl::CalledOnValidThread() const { 392 bool SynchronousCompositorImpl::CalledOnValidThread() const {
393 return BrowserThread::CurrentlyOn(BrowserThread::UI); 393 return BrowserThread::CurrentlyOn(BrowserThread::UI);
394 } 394 }
395 395
396 // static 396 // static
397 void SynchronousCompositor::SetClientForWebContents( 397 void SynchronousCompositor::SetClientForWebContents(
398 WebContents* contents, 398 WebContents* contents,
399 SynchronousCompositorClient* client) { 399 SynchronousCompositorClient* client) {
400 DCHECK(contents); 400 DCHECK(contents);
401 if (client) { 401 DCHECK(client);
402 g_factory.Get(); // Ensure it's initialized. 402 g_factory.Get(); // Ensure it's initialized.
403 SynchronousCompositorImpl::CreateForWebContents(contents); 403 DCHECK(!ClientHolder::FromWebContents(contents));
404 } 404 ClientHolder::CreateForWebContents(contents, client);
405 SynchronousCompositorImpl* instance =
406 SynchronousCompositorImpl::FromWebContents(contents);
407 DCHECK(instance);
408 instance->SetClient(client);
409 } 405 }
410 406
411 } // namespace content 407 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698