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

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

Powered by Google App Engine
This is Rietveld 408576698