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

Side by Side Diff: android_webview/browser/browser_view_renderer.cc

Issue 817603002: cc: Make scheduling be driven by vsync for android webview. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "android_webview/browser/browser_view_renderer.h" 5 #include "android_webview/browser/browser_view_renderer.h"
6 6
7 #include "android_webview/browser/browser_view_renderer_client.h" 7 #include "android_webview/browser/browser_view_renderer_client.h"
8 #include "base/auto_reset.h" 8 #include "base/auto_reset.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/debug/trace_event_argument.h" 10 #include "base/debug/trace_event_argument.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 compositor_(NULL), 59 compositor_(NULL),
60 is_paused_(false), 60 is_paused_(false),
61 view_visible_(false), 61 view_visible_(false),
62 window_visible_(false), 62 window_visible_(false),
63 attached_to_window_(false), 63 attached_to_window_(false),
64 hardware_enabled_(false), 64 hardware_enabled_(false),
65 dip_scale_(0.0), 65 dip_scale_(0.0),
66 page_scale_factor_(1.0), 66 page_scale_factor_(1.0),
67 on_new_picture_enable_(false), 67 on_new_picture_enable_(false),
68 clear_view_(false), 68 clear_view_(false),
69 compositor_needs_continuous_invalidate_(false), 69 compositor_needs_vsyncs_(false) {
70 invalidate_after_composite_(false),
71 block_invalidates_(false),
72 fallback_tick_pending_(false) {
73 } 70 }
74 71
75 BrowserViewRenderer::~BrowserViewRenderer() { 72 BrowserViewRenderer::~BrowserViewRenderer() {
76 } 73 }
77 74
78 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() { 75 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() {
79 return &shared_renderer_state_; 76 return &shared_renderer_state_;
80 } 77 }
81 78
82 bool BrowserViewRenderer::RequestDrawGL(bool wait_for_completion) { 79 bool BrowserViewRenderer::RequestDrawGL(bool wait_for_completion) {
(...skipping 29 matching lines...) Expand all
112 109
113 // Drop everything in hardware. 110 // Drop everything in hardware.
114 if (level >= TRIM_MEMORY_MODERATE) { 111 if (level >= TRIM_MEMORY_MODERATE) {
115 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); 112 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI();
116 return; 113 return;
117 } 114 }
118 115
119 // Just set the memory limit to 0 and drop all tiles. This will be reset to 116 // Just set the memory limit to 0 and drop all tiles. This will be reset to
120 // normal levels in the next DrawGL call. 117 // normal levels in the next DrawGL call.
121 compositor_->SetMemoryPolicy(0u); 118 compositor_->SetMemoryPolicy(0u);
122 ForceFakeCompositeSW();
123 } 119 }
124 120
125 size_t BrowserViewRenderer::CalculateDesiredMemoryPolicy() { 121 size_t BrowserViewRenderer::CalculateDesiredMemoryPolicy() {
126 if (g_memory_override_in_bytes) 122 if (g_memory_override_in_bytes)
127 return static_cast<size_t>(g_memory_override_in_bytes); 123 return static_cast<size_t>(g_memory_override_in_bytes);
128 124
129 size_t width = last_on_draw_global_visible_rect_.width(); 125 size_t width = last_on_draw_global_visible_rect_.width();
130 size_t height = last_on_draw_global_visible_rect_.height(); 126 size_t height = last_on_draw_global_visible_rect_.height();
131 size_t bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; 127 size_t bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height;
132 // Round up to a multiple of kMemoryAllocationStep. 128 // Round up to a multiple of kMemoryAllocationStep.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 TRACE_EVENT_SCOPE_THREAD); 165 TRACE_EVENT_SCOPE_THREAD);
170 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(true); 166 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(true);
171 return true; 167 return true;
172 } 168 }
173 169
174 ReturnResourceFromParent(); 170 ReturnResourceFromParent();
175 if (shared_renderer_state_.HasCompositorFrameOnUI()) { 171 if (shared_renderer_state_.HasCompositorFrameOnUI()) {
176 TRACE_EVENT_INSTANT0("android_webview", 172 TRACE_EVENT_INSTANT0("android_webview",
177 "EarlyOut_PreviousFrameUnconsumed", 173 "EarlyOut_PreviousFrameUnconsumed",
178 TRACE_EVENT_SCOPE_THREAD); 174 TRACE_EVENT_SCOPE_THREAD);
179 DidSkipCompositeInDraw();
180 return true; 175 return true;
181 } 176 }
182 177
183 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); 178 scoped_ptr<cc::CompositorFrame> frame = CompositeHw();
184 if (!frame.get()) { 179 if (!frame.get()) {
185 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", 180 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame",
186 TRACE_EVENT_SCOPE_THREAD); 181 TRACE_EVENT_SCOPE_THREAD);
187 return false; 182 return false;
188 } 183 }
189 184
(...skipping 23 matching lines...) Expand all
213 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; 208 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_;
214 } 209 }
215 210
216 scoped_ptr<cc::CompositorFrame> frame = 211 scoped_ptr<cc::CompositorFrame> frame =
217 compositor_->DemandDrawHw(surface_size, 212 compositor_->DemandDrawHw(surface_size,
218 gfx::Transform(), 213 gfx::Transform(),
219 viewport, 214 viewport,
220 clip, 215 clip,
221 viewport_rect_for_tile_priority, 216 viewport_rect_for_tile_priority,
222 transform_for_tile_priority); 217 transform_for_tile_priority);
223 if (frame.get())
224 DidComposite();
225 return frame.Pass(); 218 return frame.Pass();
226 } 219 }
227 220
228 void BrowserViewRenderer::UpdateParentDrawConstraints() { 221 void BrowserViewRenderer::UpdateParentDrawConstraints() {
229 // Post an invalidate if the parent draw constraints are stale and there is 222 // Post an invalidate if the parent draw constraints are stale and there is
230 // no pending invalidate. 223 // no pending invalidate.
231 bool needs_force_invalidate = 224 bool needs_force_invalidate =
232 shared_renderer_state_.NeedsForceInvalidateOnNextDrawGLOnUI(); 225 shared_renderer_state_.NeedsForceInvalidateOnNextDrawGLOnUI();
233 if (needs_force_invalidate || 226 if (needs_force_invalidate ||
234 !parent_draw_constraints_.Equals( 227 !parent_draw_constraints_.Equals(
235 shared_renderer_state_.GetParentDrawConstraintsOnUI())) { 228 shared_renderer_state_.GetParentDrawConstraintsOnUI())) {
236 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(false); 229 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(false);
237 EnsureContinuousInvalidation(true, needs_force_invalidate); 230 PostInvalidate();
238 } 231 }
239 } 232 }
240 233
241 void BrowserViewRenderer::ReturnUnusedResource( 234 void BrowserViewRenderer::ReturnUnusedResource(
242 scoped_ptr<cc::CompositorFrame> frame) { 235 scoped_ptr<cc::CompositorFrame> frame) {
243 if (!frame.get()) 236 if (!frame.get())
244 return; 237 return;
245 238
246 cc::CompositorFrameAck frame_ack; 239 cc::CompositorFrameAck frame_ack;
247 cc::TransferableResource::ReturnResources( 240 cc::TransferableResource::ReturnResources(
248 frame->delegated_frame_data->resource_list, &frame_ack.resources); 241 frame->delegated_frame_data->resource_list, &frame_ack.resources);
249 if (compositor_ && !frame_ack.resources.empty()) 242 if (compositor_ && !frame_ack.resources.empty())
250 compositor_->ReturnResources(frame_ack); 243 compositor_->ReturnResources(frame_ack);
251 } 244 }
252 245
253 void BrowserViewRenderer::ReturnResourceFromParent() { 246 void BrowserViewRenderer::ReturnResourceFromParent() {
254 cc::CompositorFrameAck frame_ack; 247 cc::CompositorFrameAck frame_ack;
255 shared_renderer_state_.SwapReturnedResourcesOnUI(&frame_ack.resources); 248 shared_renderer_state_.SwapReturnedResourcesOnUI(&frame_ack.resources);
256 if (compositor_ && !frame_ack.resources.empty()) { 249 if (compositor_ && !frame_ack.resources.empty()) {
257 compositor_->ReturnResources(frame_ack); 250 compositor_->ReturnResources(frame_ack);
258 } 251 }
259 } 252 }
260 253
261 void BrowserViewRenderer::DidSkipCommitFrame() {
262 // Treat it the same way as skipping onDraw.
263 DidSkipCompositeInDraw();
264 }
265
266 void BrowserViewRenderer::InvalidateOnFunctorDestroy() { 254 void BrowserViewRenderer::InvalidateOnFunctorDestroy() {
267 client_->InvalidateOnFunctorDestroy(); 255 client_->InvalidateOnFunctorDestroy();
268 } 256 }
269 257
270 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { 258 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) {
271 if (!compositor_) { 259 if (!compositor_) {
272 TRACE_EVENT_INSTANT0( 260 TRACE_EVENT_INSTANT0(
273 "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD); 261 "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD);
274 return false; 262 return false;
275 } 263 }
(...skipping 29 matching lines...) Expand all
305 } 293 }
306 294
307 void BrowserViewRenderer::ClearView() { 295 void BrowserViewRenderer::ClearView() {
308 TRACE_EVENT_INSTANT0("android_webview", 296 TRACE_EVENT_INSTANT0("android_webview",
309 "BrowserViewRenderer::ClearView", 297 "BrowserViewRenderer::ClearView",
310 TRACE_EVENT_SCOPE_THREAD); 298 TRACE_EVENT_SCOPE_THREAD);
311 if (clear_view_) 299 if (clear_view_)
312 return; 300 return;
313 301
314 clear_view_ = true; 302 clear_view_ = true;
315 // Always invalidate ignoring the compositor to actually clear the webview. 303
316 EnsureContinuousInvalidation(true, false); 304 PostInvalidate();
305 }
306
307 void BrowserViewRenderer::OnVSync(base::TimeTicks frame_time,
308 base::TimeDelta vsync_period) {
309 DCHECK(needs_vsyncs_);
310
311 if (needs_vsyncs_)
312 client_->RequestVSyncUpdate();
317 } 313 }
318 314
319 void BrowserViewRenderer::SetIsPaused(bool paused) { 315 void BrowserViewRenderer::SetIsPaused(bool paused) {
320 TRACE_EVENT_INSTANT1("android_webview", 316 TRACE_EVENT_INSTANT1("android_webview",
321 "BrowserViewRenderer::SetIsPaused", 317 "BrowserViewRenderer::SetIsPaused",
322 TRACE_EVENT_SCOPE_THREAD, 318 TRACE_EVENT_SCOPE_THREAD,
323 "paused", 319 "paused",
324 paused); 320 paused);
325 is_paused_ = paused; 321 is_paused_ = paused;
326 EnsureContinuousInvalidation(false, false); 322 UpdateNeedsVSyncs();
327 } 323 }
328 324
329 void BrowserViewRenderer::SetViewVisibility(bool view_visible) { 325 void BrowserViewRenderer::SetViewVisibility(bool view_visible) {
330 TRACE_EVENT_INSTANT1("android_webview", 326 TRACE_EVENT_INSTANT1("android_webview",
331 "BrowserViewRenderer::SetViewVisibility", 327 "BrowserViewRenderer::SetViewVisibility",
332 TRACE_EVENT_SCOPE_THREAD, 328 TRACE_EVENT_SCOPE_THREAD,
333 "view_visible", 329 "view_visible",
334 view_visible); 330 view_visible);
335 view_visible_ = view_visible; 331 view_visible_ = view_visible;
332 UpdateNeedsVSyncs();
336 } 333 }
337 334
338 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) { 335 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) {
339 TRACE_EVENT_INSTANT1("android_webview", 336 TRACE_EVENT_INSTANT1("android_webview",
340 "BrowserViewRenderer::SetWindowVisibility", 337 "BrowserViewRenderer::SetWindowVisibility",
341 TRACE_EVENT_SCOPE_THREAD, 338 TRACE_EVENT_SCOPE_THREAD,
342 "window_visible", 339 "window_visible",
343 window_visible); 340 window_visible);
344 window_visible_ = window_visible; 341 window_visible_ = window_visible;
345 EnsureContinuousInvalidation(false, false); 342 UpdateNeedsVSyncs();
346 } 343 }
347 344
348 void BrowserViewRenderer::OnSizeChanged(int width, int height) { 345 void BrowserViewRenderer::OnSizeChanged(int width, int height) {
349 TRACE_EVENT_INSTANT2("android_webview", 346 TRACE_EVENT_INSTANT2("android_webview",
350 "BrowserViewRenderer::OnSizeChanged", 347 "BrowserViewRenderer::OnSizeChanged",
351 TRACE_EVENT_SCOPE_THREAD, 348 TRACE_EVENT_SCOPE_THREAD,
352 "width", 349 "width",
353 width, 350 width,
354 "height", 351 "height",
355 height); 352 height);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 compositor_ = compositor; 402 compositor_ = compositor;
406 } 403 }
407 404
408 void BrowserViewRenderer::DidDestroyCompositor( 405 void BrowserViewRenderer::DidDestroyCompositor(
409 content::SynchronousCompositor* compositor) { 406 content::SynchronousCompositor* compositor) {
410 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); 407 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor");
411 DCHECK(compositor_); 408 DCHECK(compositor_);
412 compositor_ = NULL; 409 compositor_ = NULL;
413 } 410 }
414 411
415 void BrowserViewRenderer::SetContinuousInvalidate(bool invalidate) { 412 void BrowserViewRenderer::SetNeedsVSyncs(bool needs_vsyncs) {
416 if (compositor_needs_continuous_invalidate_ == invalidate) 413 compositor_needs_vsyncs_ = needs_vsyncs;
417 return; 414 UpdateNeedsVSyncs();
415 }
418 416
419 TRACE_EVENT_INSTANT1("android_webview", 417 void BrowserViewRenderer::PostInvalidate() {
420 "BrowserViewRenderer::SetContinuousInvalidate", 418 DCHECK(client_);
421 TRACE_EVENT_SCOPE_THREAD, 419 client_->PostInvalidate();
422 "invalidate",
423 invalidate);
424 compositor_needs_continuous_invalidate_ = invalidate;
425
426 EnsureContinuousInvalidation(false, false);
427 } 420 }
428 421
429 void BrowserViewRenderer::SetDipScale(float dip_scale) { 422 void BrowserViewRenderer::SetDipScale(float dip_scale) {
430 dip_scale_ = dip_scale; 423 dip_scale_ = dip_scale;
431 CHECK_GT(dip_scale_, 0); 424 CHECK_GT(dip_scale_, 0);
432 } 425 }
433 426
434 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { 427 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const {
435 DCHECK_GT(dip_scale_, 0); 428 DCHECK_GT(dip_scale_, 0);
436 return gfx::ToCeiledVector2d(gfx::ScaleVector2d( 429 return gfx::ToCeiledVector2d(gfx::ScaleVector2d(
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 overscroll_rounding_error_ = gfx::Vector2dF(); 575 overscroll_rounding_error_ = gfx::Vector2dF();
583 gfx::Vector2dF scaled_overscroll_delta = 576 gfx::Vector2dF scaled_overscroll_delta =
584 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale); 577 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale);
585 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( 578 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d(
586 scaled_overscroll_delta + overscroll_rounding_error_); 579 scaled_overscroll_delta + overscroll_rounding_error_);
587 overscroll_rounding_error_ = 580 overscroll_rounding_error_ =
588 scaled_overscroll_delta - rounded_overscroll_delta; 581 scaled_overscroll_delta - rounded_overscroll_delta;
589 client_->DidOverscroll(rounded_overscroll_delta); 582 client_->DidOverscroll(rounded_overscroll_delta);
590 } 583 }
591 584
592 void BrowserViewRenderer::EnsureContinuousInvalidation(
593 bool force_invalidate,
594 bool skip_reschedule_tick) {
595 if (force_invalidate)
596 invalidate_after_composite_ = true;
597
598 // This method should be called again when any of these conditions change.
599 bool need_invalidate =
600 compositor_needs_continuous_invalidate_ || invalidate_after_composite_;
601 if (!need_invalidate || block_invalidates_)
602 return;
603
604 if (!compositor_needs_continuous_invalidate_ && invalidate_after_composite_)
605 invalidate_after_composite_ = false;
606
607 // Always call view invalidate. We rely the Android framework to ignore the
608 // invalidate when it's not needed such as when view is not visible.
609 client_->PostInvalidate();
610
611 // Stop fallback ticks when one of these is true.
612 // 1) Webview is paused. Also need to check we are not in clear view since
613 // paused, offscreen still expect clear view to recover.
614 // 2) If we are attached to window and the window is not visible (eg when
615 // app is in the background). We are sure in this case the webview is used
616 // "on-screen" but that updates are not needed when in the background.
617 bool throttle_fallback_tick =
618 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_);
619 if (throttle_fallback_tick)
620 return;
621
622 block_invalidates_ = compositor_needs_continuous_invalidate_;
623 if (skip_reschedule_tick && fallback_tick_pending_)
624 return;
625
626 // Unretained here is safe because the callbacks are cancelled when
627 // they are destroyed.
628 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick,
629 base::Unretained(this)));
630 fallback_tick_fired_.Cancel();
631 fallback_tick_pending_ = false;
632
633 // No need to reschedule fallback tick if compositor does not need to be
634 // ticked. This can happen if this is reached because force_invalidate is
635 // true.
636 if (compositor_needs_continuous_invalidate_) {
637 fallback_tick_pending_ = true;
638 ui_task_runner_->PostTask(FROM_HERE, post_fallback_tick_.callback());
639 }
640 }
641
642 void BrowserViewRenderer::PostFallbackTick() {
643 DCHECK(fallback_tick_fired_.IsCancelled());
644 fallback_tick_fired_.Reset(base::Bind(&BrowserViewRenderer::FallbackTickFired,
645 base::Unretained(this)));
646 if (compositor_needs_continuous_invalidate_) {
647 ui_task_runner_->PostDelayedTask(
648 FROM_HERE,
649 fallback_tick_fired_.callback(),
650 base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds));
651 } else {
652 // Pretend we just composited to unblock further invalidates.
653 DidComposite();
654 }
655 }
656
657 void BrowserViewRenderer::FallbackTickFired() {
658 TRACE_EVENT1("android_webview",
659 "BrowserViewRenderer::FallbackTickFired",
660 "compositor_needs_continuous_invalidate_",
661 compositor_needs_continuous_invalidate_);
662
663 // This should only be called if OnDraw or DrawGL did not come in time, which
664 // means block_invalidates_ must still be true.
665 DCHECK(block_invalidates_);
666 fallback_tick_pending_ = false;
667 if (compositor_needs_continuous_invalidate_ && compositor_) {
668 if (hardware_enabled_) {
669 ReturnResourceFromParent();
670 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI());
671 scoped_ptr<cc::CompositorFrame> frame = CompositeHw();
672 if (frame.get()) {
673 shared_renderer_state_.SetCompositorFrameOnUI(frame.Pass(), true);
674 }
675 } else {
676 ForceFakeCompositeSW();
677 }
678 } else {
679 // Pretend we just composited to unblock further invalidates.
680 DidComposite();
681 }
682 }
683
684 void BrowserViewRenderer::ForceFakeCompositeSW() {
685 DCHECK(compositor_);
686 SkBitmap bitmap;
687 bitmap.allocN32Pixels(1, 1);
688 bitmap.eraseColor(0);
689 SkCanvas canvas(bitmap);
690 CompositeSW(&canvas);
691 }
692
693 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { 585 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) {
694 DCHECK(compositor_); 586 DCHECK(compositor_);
695 ReturnResourceFromParent(); 587 ReturnResourceFromParent();
696 bool result = compositor_->DemandDrawSw(canvas); 588 return compositor_->DemandDrawSw(canvas);
697 DidComposite();
698 return result;
699 } 589 }
700 590
701 void BrowserViewRenderer::DidComposite() { 591 void BrowserViewRenderer::UpdateNeedsVSyncs() {
702 block_invalidates_ = false; 592 bool needs_vsyncs = !is_paused_ && IsVisible() && compositor_needs_vsyncs_;
703 post_fallback_tick_.Cancel();
704 fallback_tick_fired_.Cancel();
705 fallback_tick_pending_ = false;
706 EnsureContinuousInvalidation(false, false);
707 }
708 593
709 void BrowserViewRenderer::DidSkipCompositeInDraw() { 594 if (needs_vsyncs_ == needs_vsyncs)
710 block_invalidates_ = false; 595 return;
711 EnsureContinuousInvalidation(true, true); 596
597 needs_vsyncs_ = needs_vsyncs;
598
599 if (needs_vsyncs_)
600 client_->RequestVSyncUpdate();
712 } 601 }
713 602
714 std::string BrowserViewRenderer::ToString() const { 603 std::string BrowserViewRenderer::ToString() const {
715 std::string str; 604 std::string str;
716 base::StringAppendF(&str, "is_paused: %d ", is_paused_); 605 base::StringAppendF(&str, "is_paused: %d ", is_paused_);
717 base::StringAppendF(&str, "view_visible: %d ", view_visible_); 606 base::StringAppendF(&str, "view_visible: %d ", view_visible_);
718 base::StringAppendF(&str, "window_visible: %d ", window_visible_); 607 base::StringAppendF(&str, "window_visible: %d ", window_visible_);
719 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); 608 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_);
720 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); 609 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_);
721 base::StringAppendF(&str, 610 base::StringAppendF(&str,
722 "compositor_needs_continuous_invalidate: %d ", 611 "compositor_needs_vsyncs_: %d ",
723 compositor_needs_continuous_invalidate_); 612 compositor_needs_vsyncs_);
724 base::StringAppendF(&str, "block_invalidates: %d ", block_invalidates_);
725 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); 613 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str());
726 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); 614 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_);
727 base::StringAppendF(&str, 615 base::StringAppendF(&str,
728 "global visible rect: %s ", 616 "global visible rect: %s ",
729 last_on_draw_global_visible_rect_.ToString().c_str()); 617 last_on_draw_global_visible_rect_.ToString().c_str());
730 base::StringAppendF( 618 base::StringAppendF(
731 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); 619 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str());
732 base::StringAppendF(&str, 620 base::StringAppendF(&str,
733 "overscroll_rounding_error_: %s ", 621 "overscroll_rounding_error_: %s ",
734 overscroll_rounding_error_.ToString().c_str()); 622 overscroll_rounding_error_.ToString().c_str());
735 base::StringAppendF( 623 base::StringAppendF(
736 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); 624 &str, "on_new_picture_enable: %d ", on_new_picture_enable_);
737 base::StringAppendF(&str, "clear_view: %d ", clear_view_); 625 base::StringAppendF(&str, "clear_view: %d ", clear_view_);
738 return str; 626 return str;
739 } 627 }
740 628
741 } // namespace android_webview 629 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698