blob: 89645711e7ea52446e895ad67441724b710c43b8 [file] [log] [blame]
boliubee541f42015-11-05 00:52:531// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/browser/android/synchronous_compositor_host.h"
6
boliucafb1bf2015-12-29 01:40:197#include <utility>
8
boliuc99f26c12016-04-21 21:58:599#include "base/command_line.h"
boliubee541f42015-11-05 00:52:5310#include "base/containers/hash_tables.h"
boliuc99f26c12016-04-21 21:58:5911#include "base/memory/ptr_util.h"
boliuf6d263e2015-11-25 03:53:5812#include "base/memory/shared_memory.h"
13#include "base/trace_event/trace_event_argument.h"
boliubee541f42015-11-05 00:52:5314#include "cc/output/compositor_frame_ack.h"
boliubee541f42015-11-05 00:52:5315#include "content/browser/renderer_host/render_widget_host_view_android.h"
boliuc99f26c12016-04-21 21:58:5916#include "content/browser/web_contents/web_contents_android.h"
boliubee541f42015-11-05 00:52:5317#include "content/browser/web_contents/web_contents_impl.h"
18#include "content/common/android/sync_compositor_messages.h"
jbroman801dd272016-04-22 18:54:0219#include "content/common/android/sync_compositor_statics.h"
boliubee541f42015-11-05 00:52:5320#include "content/public/browser/android/synchronous_compositor_client.h"
hush92bd35e72015-11-13 22:57:3721#include "content/public/browser/browser_thread.h"
boliubee541f42015-11-05 00:52:5322#include "content/public/browser/render_view_host.h"
boliuc99f26c12016-04-21 21:58:5923#include "content/public/common/content_switches.h"
boliubee541f42015-11-05 00:52:5324#include "ipc/ipc_sender.h"
boliuf6d263e2015-11-25 03:53:5825#include "third_party/skia/include/core/SkBitmap.h"
26#include "third_party/skia/include/core/SkCanvas.h"
27#include "third_party/skia/include/core/SkImageInfo.h"
28#include "third_party/skia/include/core/SkRect.h"
29#include "ui/gfx/skia_util.h"
boliubee541f42015-11-05 00:52:5330
31namespace content {
32
boliuc99f26c12016-04-21 21:58:5933// static
34void SynchronousCompositor::SetClientForWebContents(
35 WebContents* contents,
36 SynchronousCompositorClient* client) {
37 DCHECK(contents);
38 DCHECK(client);
39 WebContentsAndroid* web_contents_android =
40 static_cast<WebContentsImpl*>(contents)->GetWebContentsAndroid();
41 DCHECK(!web_contents_android->synchronous_compositor_client());
42 web_contents_android->set_synchronous_compositor_client(client);
43}
44
45// static
46std::unique_ptr<SynchronousCompositorHost> SynchronousCompositorHost::Create(
47 RenderWidgetHostViewAndroid* rwhva,
48 WebContents* web_contents) {
49 DCHECK(web_contents);
50 WebContentsAndroid* web_contents_android =
51 static_cast<WebContentsImpl*>(web_contents)->GetWebContentsAndroid();
52 if (!web_contents_android->synchronous_compositor_client())
53 return nullptr; // Not using sync compositing.
54
55 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
56 bool async_input =
57 !command_line->HasSwitch(switches::kSyncInputForSyncCompositor);
58 bool use_in_proc_software_draw =
59 command_line->HasSwitch(switches::kSingleProcess);
60 return base::WrapUnique(new SynchronousCompositorHost(
61 rwhva, web_contents_android->synchronous_compositor_client(), async_input,
62 use_in_proc_software_draw));
63}
64
boliubee541f42015-11-05 00:52:5365SynchronousCompositorHost::SynchronousCompositorHost(
66 RenderWidgetHostViewAndroid* rwhva,
boliu4d4b5a82016-02-17 01:55:2167 SynchronousCompositorClient* client,
boliude5b75b2016-03-11 07:02:1468 bool async_input,
boliu4d4b5a82016-02-17 01:55:2169 bool use_in_proc_software_draw)
boliubee541f42015-11-05 00:52:5370 : rwhva_(rwhva),
71 client_(client),
hush92bd35e72015-11-13 22:57:3772 ui_task_runner_(
73 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)),
boliubee541f42015-11-05 00:52:5374 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()),
75 sender_(rwhva_->GetRenderWidgetHost()),
boliude5b75b2016-03-11 07:02:1476 async_input_(async_input),
boliu4d4b5a82016-02-17 01:55:2177 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw),
boliubee541f42015-11-05 00:52:5378 is_active_(false),
79 bytes_limit_(0u),
boliu600cba922015-12-08 04:28:2280 root_scroll_offset_updated_by_browser_(false),
boliubee541f42015-11-05 00:52:5381 renderer_param_version_(0u),
82 need_animate_scroll_(false),
boliu17bc31f2016-02-23 18:46:2883 need_invalidate_count_(0u),
boliubee541f42015-11-05 00:52:5384 need_begin_frame_(false),
boliu17bc31f2016-02-23 18:46:2885 did_activate_pending_tree_count_(0u),
hush92bd35e72015-11-13 22:57:3786 weak_ptr_factory_(this) {
boliubee541f42015-11-05 00:52:5387 client_->DidInitializeCompositor(this);
88}
89
90SynchronousCompositorHost::~SynchronousCompositorHost() {
91 client_->DidDestroyCompositor(this);
boliu0c1f91d2016-01-13 19:27:3792 if (weak_ptr_factory_.HasWeakPtrs())
93 UpdateStateTask();
boliubee541f42015-11-05 00:52:5394}
95
96bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) {
97 bool handled = true;
98 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message)
boliu42e01312016-05-12 21:47:5299 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OutputSurfaceCreated,
100 OutputSurfaceCreated)
boliubee541f42015-11-05 00:52:53101 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams)
boliu09be0e62015-11-11 00:57:00102 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OverScroll, OnOverScroll)
boliubee541f42015-11-05 00:52:53103 IPC_MESSAGE_UNHANDLED(handled = false)
104 IPC_END_MESSAGE_MAP()
105 return handled;
106}
107
hush45918a82015-12-17 03:50:59108void SynchronousCompositorHost::DidBecomeCurrent() {
109 client_->DidBecomeCurrent(this);
110}
111
boliuf4e574852016-03-22 19:33:17112SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw(
boliubee541f42015-11-05 00:52:53113 const gfx::Size& surface_size,
114 const gfx::Transform& transform,
115 const gfx::Rect& viewport,
116 const gfx::Rect& clip,
117 const gfx::Rect& viewport_rect_for_tile_priority,
118 const gfx::Transform& transform_for_tile_priority) {
119 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport,
120 clip, viewport_rect_for_tile_priority,
121 transform_for_tile_priority);
boliuf4e574852016-03-22 19:33:17122 SynchronousCompositor::Frame frame;
123 frame.frame.reset(new cc::CompositorFrame);
boliubee541f42015-11-05 00:52:53124 SyncCompositorCommonBrowserParams common_browser_params;
125 PopulateCommonParams(&common_browser_params);
126 SyncCompositorCommonRendererParams common_renderer_params;
127 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw(
128 routing_id_, common_browser_params, params, &common_renderer_params,
boliuf4e574852016-03-22 19:33:17129 &frame.output_surface_id, frame.frame.get()))) {
130 return SynchronousCompositor::Frame();
boliubee541f42015-11-05 00:52:53131 }
132 ProcessCommonParams(common_renderer_params);
boliuf4e574852016-03-22 19:33:17133 if (!frame.frame->delegated_frame_data) {
boliubee541f42015-11-05 00:52:53134 // This can happen if compositor did not swap in this draw.
boliuf4e574852016-03-22 19:33:17135 frame.frame.reset();
boliubee541f42015-11-05 00:52:53136 }
boliuf4e574852016-03-22 19:33:17137 if (frame.frame) {
138 UpdateFrameMetaData(frame.frame->metadata);
boliuf4e574852016-03-22 19:33:17139 }
boliubee541f42015-11-05 00:52:53140 return frame;
141}
142
143void SynchronousCompositorHost::UpdateFrameMetaData(
144 const cc::CompositorFrameMetadata& frame_metadata) {
145 rwhva_->SynchronousFrameMetadata(frame_metadata);
146}
147
boliu4d4b5a82016-02-17 01:55:21148namespace {
149
150class ScopedSetSkCanvas {
151 public:
152 explicit ScopedSetSkCanvas(SkCanvas* canvas) {
153 SynchronousCompositorSetSkCanvas(canvas);
154 }
155
156 ~ScopedSetSkCanvas() {
157 SynchronousCompositorSetSkCanvas(nullptr);
158 }
159
160 private:
161 DISALLOW_COPY_AND_ASSIGN(ScopedSetSkCanvas);
162};
163
164}
165
166bool SynchronousCompositorHost::DemandDrawSwInProc(SkCanvas* canvas) {
167 SyncCompositorCommonBrowserParams common_browser_params;
168 PopulateCommonParams(&common_browser_params);
169 SyncCompositorCommonRendererParams common_renderer_params;
170 bool success = false;
dcheng59716272016-04-09 05:19:08171 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
boliu4d4b5a82016-02-17 01:55:21172 ScopedSetSkCanvas set_sk_canvas(canvas);
173 SyncCompositorDemandDrawSwParams params; // Unused.
174 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw(
175 routing_id_, common_browser_params, params, &success,
176 &common_renderer_params, frame.get()))) {
177 return false;
178 }
179 if (!success)
180 return false;
181 ProcessCommonParams(common_renderer_params);
182 UpdateFrameMetaData(frame->metadata);
183 return true;
184}
185
boliucafb1bf2015-12-29 01:40:19186class SynchronousCompositorHost::ScopedSendZeroMemory {
187 public:
188 ScopedSendZeroMemory(SynchronousCompositorHost* host) : host_(host) {}
189 ~ScopedSendZeroMemory() { host_->SendZeroMemory(); }
190
191 private:
192 SynchronousCompositorHost* const host_;
193
194 DISALLOW_COPY_AND_ASSIGN(ScopedSendZeroMemory);
195};
196
197struct SynchronousCompositorHost::SharedMemoryWithSize {
198 base::SharedMemory shm;
199 const size_t stride;
200 const size_t buffer_size;
201
202 SharedMemoryWithSize(size_t stride, size_t buffer_size)
203 : stride(stride), buffer_size(buffer_size) {}
204
205 private:
206 DISALLOW_COPY_AND_ASSIGN(SharedMemoryWithSize);
207};
208
boliubee541f42015-11-05 00:52:53209bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) {
boliu4d4b5a82016-02-17 01:55:21210 if (use_in_process_zero_copy_software_draw_)
211 return DemandDrawSwInProc(canvas);
212
boliuf6d263e2015-11-25 03:53:58213 SyncCompositorDemandDrawSwParams params;
214 params.size = gfx::Size(canvas->getBaseLayerSize().width(),
215 canvas->getBaseLayerSize().height());
216 SkIRect canvas_clip;
217 canvas->getClipDeviceBounds(&canvas_clip);
218 params.clip = gfx::SkIRectToRect(canvas_clip);
219 params.transform.matrix() = canvas->getTotalMatrix();
220 if (params.size.IsEmpty())
221 return true;
222
223 SkImageInfo info =
224 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height());
225 DCHECK_EQ(kRGBA_8888_SkColorType, info.colorType());
226 size_t stride = info.minRowBytes();
227 size_t buffer_size = info.getSafeSize(stride);
228 if (!buffer_size)
229 return false; // Overflow.
230
boliucafb1bf2015-12-29 01:40:19231 SetSoftwareDrawSharedMemoryIfNeeded(stride, buffer_size);
232 if (!software_draw_shm_)
boliuf6d263e2015-11-25 03:53:58233 return false;
234
dcheng59716272016-04-09 05:19:08235 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
boliuf6d263e2015-11-25 03:53:58236 SyncCompositorCommonBrowserParams common_browser_params;
237 PopulateCommonParams(&common_browser_params);
238 SyncCompositorCommonRendererParams common_renderer_params;
239 bool success = false;
240 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw(
241 routing_id_, common_browser_params, params, &success,
242 &common_renderer_params, frame.get()))) {
243 return false;
244 }
boliucafb1bf2015-12-29 01:40:19245 ScopedSendZeroMemory send_zero_memory(this);
boliuf6d263e2015-11-25 03:53:58246 if (!success)
247 return false;
248
249 ProcessCommonParams(common_renderer_params);
250 UpdateFrameMetaData(frame->metadata);
251
252 SkBitmap bitmap;
boliucafb1bf2015-12-29 01:40:19253 if (!bitmap.installPixels(info, software_draw_shm_->shm.memory(), stride))
boliuf6d263e2015-11-25 03:53:58254 return false;
255
256 {
257 TRACE_EVENT0("browser", "DrawBitmap");
258 canvas->save();
259 canvas->resetMatrix();
260 canvas->drawBitmap(bitmap, 0, 0);
261 canvas->restore();
262 }
263
264 return true;
boliubee541f42015-11-05 00:52:53265}
266
boliucafb1bf2015-12-29 01:40:19267void SynchronousCompositorHost::SetSoftwareDrawSharedMemoryIfNeeded(
268 size_t stride,
269 size_t buffer_size) {
270 if (software_draw_shm_ && software_draw_shm_->stride == stride &&
271 software_draw_shm_->buffer_size == buffer_size)
272 return;
273 software_draw_shm_.reset();
dcheng59716272016-04-09 05:19:08274 std::unique_ptr<SharedMemoryWithSize> software_draw_shm(
boliucafb1bf2015-12-29 01:40:19275 new SharedMemoryWithSize(stride, buffer_size));
276 {
277 TRACE_EVENT1("browser", "AllocateSharedMemory", "buffer_size", buffer_size);
278 if (!software_draw_shm->shm.CreateAndMapAnonymous(buffer_size))
279 return;
280 }
281
282 SyncCompositorSetSharedMemoryParams set_shm_params;
283 set_shm_params.buffer_size = buffer_size;
284 base::ProcessHandle renderer_process_handle =
285 rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle();
286 if (!software_draw_shm->shm.ShareToProcess(renderer_process_handle,
287 &set_shm_params.shm_handle)) {
288 return;
289 }
290
291 SyncCompositorCommonBrowserParams common_browser_params;
292 PopulateCommonParams(&common_browser_params);
293 bool success = false;
294 SyncCompositorCommonRendererParams common_renderer_params;
295 if (!sender_->Send(new SyncCompositorMsg_SetSharedMemory(
296 routing_id_, common_browser_params, set_shm_params, &success,
297 &common_renderer_params)) ||
298 !success) {
299 return;
300 }
301 software_draw_shm_ = std::move(software_draw_shm);
302 ProcessCommonParams(common_renderer_params);
303}
304
305void SynchronousCompositorHost::SendZeroMemory() {
306 // No need to check return value.
307 sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_));
308}
309
boliubee541f42015-11-05 00:52:53310void SynchronousCompositorHost::ReturnResources(
boliuf4e574852016-03-22 19:33:17311 uint32_t output_surface_id,
boliubee541f42015-11-05 00:52:53312 const cc::CompositorFrameAck& frame_ack) {
boliuec72a2ed2016-05-10 00:51:56313 DCHECK(!frame_ack.resources.empty());
314 sender_->Send(new SyncCompositorMsg_ReclaimResources(
315 routing_id_, output_surface_id, frame_ack));
boliubee541f42015-11-05 00:52:53316}
317
318void SynchronousCompositorHost::SetMemoryPolicy(size_t bytes_limit) {
319 if (bytes_limit_ == bytes_limit)
320 return;
boliu42e01312016-05-12 21:47:52321
322 if (sender_->Send(
323 new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit))) {
324 bytes_limit_ = bytes_limit;
325 }
boliubee541f42015-11-05 00:52:53326}
327
328void SynchronousCompositorHost::DidChangeRootLayerScrollOffset(
329 const gfx::ScrollOffset& root_offset) {
330 if (root_scroll_offset_ == root_offset)
331 return;
boliu600cba922015-12-08 04:28:22332 root_scroll_offset_updated_by_browser_ = true;
boliubee541f42015-11-05 00:52:53333 root_scroll_offset_ = root_offset;
hush92bd35e72015-11-13 22:57:37334 SendAsyncCompositorStateIfNeeded();
335}
336
337void SynchronousCompositorHost::SendAsyncCompositorStateIfNeeded() {
338 if (weak_ptr_factory_.HasWeakPtrs())
339 return;
340
341 ui_task_runner_->PostTask(
342 FROM_HERE, base::Bind(&SynchronousCompositorHost::UpdateStateTask,
343 weak_ptr_factory_.GetWeakPtr()));
344}
345
346void SynchronousCompositorHost::UpdateStateTask() {
347 SyncCompositorCommonBrowserParams common_browser_params;
348 PopulateCommonParams(&common_browser_params);
349 sender_->Send(
350 new SyncCompositorMsg_UpdateState(routing_id_, common_browser_params));
351 DCHECK(!weak_ptr_factory_.HasWeakPtrs());
boliubee541f42015-11-05 00:52:53352}
353
boliu21d8ab142016-04-07 23:33:52354void SynchronousCompositorHost::SynchronouslyZoomBy(float zoom_delta,
355 const gfx::Point& anchor) {
356 SyncCompositorCommonBrowserParams common_browser_params;
357 PopulateCommonParams(&common_browser_params);
358 SyncCompositorCommonRendererParams common_renderer_params;
359 if (!sender_->Send(new SyncCompositorMsg_ZoomBy(
360 routing_id_, common_browser_params, zoom_delta, anchor,
361 &common_renderer_params))) {
362 return;
363 }
364 ProcessCommonParams(common_renderer_params);
365}
366
boliubee541f42015-11-05 00:52:53367void SynchronousCompositorHost::SetIsActive(bool is_active) {
boliu0c1f91d2016-01-13 19:27:37368 if (is_active_ == is_active)
369 return;
boliubee541f42015-11-05 00:52:53370 is_active_ = is_active;
371 UpdateNeedsBeginFrames();
boliu0c1f91d2016-01-13 19:27:37372 SendAsyncCompositorStateIfNeeded();
boliubee541f42015-11-05 00:52:53373}
374
375void SynchronousCompositorHost::OnComputeScroll(
376 base::TimeTicks animation_time) {
377 if (!need_animate_scroll_)
378 return;
379 need_animate_scroll_ = false;
380
381 SyncCompositorCommonBrowserParams common_browser_params;
382 PopulateCommonParams(&common_browser_params);
383 SyncCompositorCommonRendererParams common_renderer_params;
boliu7f873dd2016-01-21 22:37:27384 sender_->Send(new SyncCompositorMsg_ComputeScroll(
385 routing_id_, common_browser_params, animation_time));
boliubee541f42015-11-05 00:52:53386}
387
388InputEventAckState SynchronousCompositorHost::HandleInputEvent(
389 const blink::WebInputEvent& input_event) {
boliude5b75b2016-03-11 07:02:14390 if (async_input_)
391 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
boliubee541f42015-11-05 00:52:53392 SyncCompositorCommonBrowserParams common_browser_params;
393 PopulateCommonParams(&common_browser_params);
394 SyncCompositorCommonRendererParams common_renderer_params;
395 InputEventAckState ack = INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
396 if (!sender_->Send(new SyncCompositorMsg_HandleInputEvent(
397 routing_id_, common_browser_params, &input_event,
398 &common_renderer_params, &ack))) {
399 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
400 }
401 ProcessCommonParams(common_renderer_params);
402 return ack;
403}
404
boliude5b75b2016-03-11 07:02:14405void SynchronousCompositorHost::DidOverscroll(
406 const DidOverscrollParams& over_scroll_params) {
407 client_->DidOverscroll(over_scroll_params.accumulated_overscroll,
408 over_scroll_params.latest_overscroll_delta,
409 over_scroll_params.current_fling_velocity);
410}
411
boliubee541f42015-11-05 00:52:53412void SynchronousCompositorHost::BeginFrame(const cc::BeginFrameArgs& args) {
boliude5b75b2016-03-11 07:02:14413 if (!is_active_)
boliubee541f42015-11-05 00:52:53414 return;
415
416 SyncCompositorCommonBrowserParams common_browser_params;
417 PopulateCommonParams(&common_browser_params);
418 SyncCompositorCommonRendererParams common_renderer_params;
419 if (!sender_->Send(
420 new SyncCompositorMsg_BeginFrame(routing_id_, common_browser_params,
421 args, &common_renderer_params))) {
422 return;
423 }
424 ProcessCommonParams(common_renderer_params);
425}
426
boliu42e01312016-05-12 21:47:52427void SynchronousCompositorHost::OutputSurfaceCreated() {
428 // New output surface is not aware of state from Browser side. So need to
429 // re-send all browser side state here.
430 sender_->Send(
431 new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit_));
432}
433
boliu09be0e62015-11-11 00:57:00434void SynchronousCompositorHost::OnOverScroll(
435 const SyncCompositorCommonRendererParams& params,
436 const DidOverscrollParams& over_scroll_params) {
437 ProcessCommonParams(params);
boliude5b75b2016-03-11 07:02:14438 DidOverscroll(over_scroll_params);
boliu09be0e62015-11-11 00:57:00439}
440
boliubee541f42015-11-05 00:52:53441void SynchronousCompositorHost::PopulateCommonParams(
442 SyncCompositorCommonBrowserParams* params) {
443 DCHECK(params);
boliu600cba922015-12-08 04:28:22444 if (root_scroll_offset_updated_by_browser_) {
445 params->root_scroll_offset = root_scroll_offset_;
446 params->update_root_scroll_offset = root_scroll_offset_updated_by_browser_;
447 root_scroll_offset_updated_by_browser_ = false;
448 }
boliu0c1f91d2016-01-13 19:27:37449 params->begin_frame_source_paused = !is_active_;
boliu600cba922015-12-08 04:28:22450
hush92bd35e72015-11-13 22:57:37451 weak_ptr_factory_.InvalidateWeakPtrs();
boliubee541f42015-11-05 00:52:53452}
453
454void SynchronousCompositorHost::ProcessCommonParams(
455 const SyncCompositorCommonRendererParams& params) {
456 // Ignore if |renderer_param_version_| is newer than |params.version|. This
457 // comparison takes into account when the unsigned int wraps.
458 if ((renderer_param_version_ - params.version) < 0x80000000) {
459 return;
460 }
461 renderer_param_version_ = params.version;
462 need_animate_scroll_ = params.need_animate_scroll;
463 if (need_begin_frame_ != params.need_begin_frame) {
464 need_begin_frame_ = params.need_begin_frame;
465 UpdateNeedsBeginFrames();
466 }
boliubee541f42015-11-05 00:52:53467 root_scroll_offset_ = params.total_scroll_offset;
468
boliu17bc31f2016-02-23 18:46:28469 if (need_invalidate_count_ != params.need_invalidate_count) {
470 need_invalidate_count_ = params.need_invalidate_count;
boliubee541f42015-11-05 00:52:53471 client_->PostInvalidate();
472 }
473
boliu17bc31f2016-02-23 18:46:28474 if (did_activate_pending_tree_count_ !=
475 params.did_activate_pending_tree_count) {
476 did_activate_pending_tree_count_ = params.did_activate_pending_tree_count;
boliubee541f42015-11-05 00:52:53477 client_->DidUpdateContent();
478 }
479
480 // Ensure only valid values from compositor are sent to client.
481 // Compositor has page_scale_factor set to 0 before initialization, so check
482 // for that case here.
483 if (params.page_scale_factor) {
484 client_->UpdateRootLayerState(
485 gfx::ScrollOffsetToVector2dF(params.total_scroll_offset),
486 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset),
487 params.scrollable_size, params.page_scale_factor,
488 params.min_page_scale_factor, params.max_page_scale_factor);
489 }
490}
491
492void SynchronousCompositorHost::UpdateNeedsBeginFrames() {
493 rwhva_->OnSetNeedsBeginFrames(is_active_ && need_begin_frame_);
494}
495
496} // namespace content