| OLD | NEW |
| 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/logging.h" | 10 #include "base/logging.h" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 compositor_(NULL), | 61 compositor_(NULL), |
| 62 is_paused_(false), | 62 is_paused_(false), |
| 63 view_visible_(false), | 63 view_visible_(false), |
| 64 window_visible_(false), | 64 window_visible_(false), |
| 65 attached_to_window_(false), | 65 attached_to_window_(false), |
| 66 hardware_enabled_(false), | 66 hardware_enabled_(false), |
| 67 dip_scale_(0.0), | 67 dip_scale_(0.0), |
| 68 page_scale_factor_(1.0), | 68 page_scale_factor_(1.0), |
| 69 on_new_picture_enable_(false), | 69 on_new_picture_enable_(false), |
| 70 clear_view_(false), | 70 clear_view_(false), |
| 71 invalidate_after_composite_(false), | |
| 72 block_invalidates_(false), | 71 block_invalidates_(false), |
| 73 fallback_tick_pending_(false) { | 72 fallback_tick_pending_(false) { |
| 74 } | 73 } |
| 75 | 74 |
| 76 BrowserViewRenderer::~BrowserViewRenderer() { | 75 BrowserViewRenderer::~BrowserViewRenderer() { |
| 77 } | 76 } |
| 78 | 77 |
| 79 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() { | 78 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() { |
| 80 return &shared_renderer_state_; | 79 return &shared_renderer_state_; |
| 81 } | 80 } |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 if (!hardware_enabled_) { | 169 if (!hardware_enabled_) { |
| 171 TRACE_EVENT0("android_webview", "InitializeHwDraw"); | 170 TRACE_EVENT0("android_webview", "InitializeHwDraw"); |
| 172 hardware_enabled_ = compositor_->InitializeHwDraw(); | 171 hardware_enabled_ = compositor_->InitializeHwDraw(); |
| 173 } | 172 } |
| 174 if (!hardware_enabled_) { | 173 if (!hardware_enabled_) { |
| 175 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_HardwareNotEnabled", | 174 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_HardwareNotEnabled", |
| 176 TRACE_EVENT_SCOPE_THREAD); | 175 TRACE_EVENT_SCOPE_THREAD); |
| 177 return false; | 176 return false; |
| 178 } | 177 } |
| 179 | 178 |
| 180 if (last_on_draw_global_visible_rect_.IsEmpty() && | 179 return CompositeHw(); |
| 181 parent_draw_constraints_.surface_rect.IsEmpty()) { | |
| 182 TRACE_EVENT_INSTANT0("android_webview", | |
| 183 "EarlyOut_EmptyVisibleRect", | |
| 184 TRACE_EVENT_SCOPE_THREAD); | |
| 185 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(true); | |
| 186 return true; | |
| 187 } | |
| 188 | |
| 189 ReturnResourceFromParent(); | |
| 190 if (shared_renderer_state_.HasCompositorFrameOnUI()) { | |
| 191 TRACE_EVENT_INSTANT0("android_webview", | |
| 192 "EarlyOut_PreviousFrameUnconsumed", | |
| 193 TRACE_EVENT_SCOPE_THREAD); | |
| 194 DidSkipCompositeInDraw(); | |
| 195 return true; | |
| 196 } | |
| 197 | |
| 198 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); | |
| 199 if (!frame.get()) { | |
| 200 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", | |
| 201 TRACE_EVENT_SCOPE_THREAD); | |
| 202 return false; | |
| 203 } | |
| 204 | |
| 205 shared_renderer_state_.SetCompositorFrameOnUI(frame.Pass(), false); | |
| 206 return true; | |
| 207 } | 180 } |
| 208 | 181 |
| 209 scoped_ptr<cc::CompositorFrame> BrowserViewRenderer::CompositeHw() { | 182 bool BrowserViewRenderer::CompositeHw() { |
| 183 ReturnResourceFromParent(); |
| 184 |
| 210 compositor_->SetMemoryPolicy(CalculateDesiredMemoryPolicy()); | 185 compositor_->SetMemoryPolicy(CalculateDesiredMemoryPolicy()); |
| 211 | 186 |
| 212 parent_draw_constraints_ = | 187 parent_draw_constraints_ = |
| 213 shared_renderer_state_.GetParentDrawConstraintsOnUI(); | 188 shared_renderer_state_.GetParentDrawConstraintsOnUI(); |
| 214 gfx::Size surface_size(size_); | 189 gfx::Size surface_size(size_); |
| 215 gfx::Rect viewport(surface_size); | 190 gfx::Rect viewport(surface_size); |
| 216 gfx::Rect clip = viewport; | 191 gfx::Rect clip = viewport; |
| 217 gfx::Transform transform_for_tile_priority = | 192 gfx::Transform transform_for_tile_priority = |
| 218 parent_draw_constraints_.transform; | 193 parent_draw_constraints_.transform; |
| 219 | 194 |
| 220 // If the WebView is on a layer, WebView does not know what transform is | 195 // If the WebView is on a layer, WebView does not know what transform is |
| 221 // applied onto the layer so global visible rect does not make sense here. | 196 // applied onto the layer so global visible rect does not make sense here. |
| 222 // In this case, just use the surface rect for tiling. | 197 // In this case, just use the surface rect for tiling. |
| 223 gfx::Rect viewport_rect_for_tile_priority; | 198 gfx::Rect viewport_rect_for_tile_priority; |
| 224 if (parent_draw_constraints_.is_layer || | 199 if (parent_draw_constraints_.is_layer) { |
| 225 last_on_draw_global_visible_rect_.IsEmpty()) { | |
| 226 viewport_rect_for_tile_priority = parent_draw_constraints_.surface_rect; | 200 viewport_rect_for_tile_priority = parent_draw_constraints_.surface_rect; |
| 227 } else { | 201 } else { |
| 228 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; | 202 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; |
| 229 } | 203 } |
| 230 | 204 |
| 231 scoped_ptr<cc::CompositorFrame> frame = | 205 scoped_ptr<cc::CompositorFrame> frame = |
| 232 compositor_->DemandDrawHw(surface_size, | 206 compositor_->DemandDrawHw(surface_size, |
| 233 gfx::Transform(), | 207 gfx::Transform(), |
| 234 viewport, | 208 viewport, |
| 235 clip, | 209 clip, |
| 236 viewport_rect_for_tile_priority, | 210 viewport_rect_for_tile_priority, |
| 237 transform_for_tile_priority); | 211 transform_for_tile_priority); |
| 238 if (frame.get()) | 212 |
| 239 DidComposite(); | 213 if (!frame.get()) { |
| 240 return frame.Pass(); | 214 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", |
| 215 TRACE_EVENT_SCOPE_THREAD); |
| 216 return false; |
| 217 } |
| 218 |
| 219 DidComposite(); |
| 220 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); |
| 221 shared_renderer_state_.SetCompositorFrameOnUI(frame.Pass()); |
| 222 return true; |
| 241 } | 223 } |
| 242 | 224 |
| 243 void BrowserViewRenderer::ForceCompositeHw() { | 225 void BrowserViewRenderer::UpdateParentDrawConstraints() { |
| 244 ReturnResourceFromParent(); | 226 if (!parent_draw_constraints_.Equals( |
| 245 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); | 227 shared_renderer_state_.GetParentDrawConstraintsOnUI())) { |
| 246 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); | 228 PostInvalidateWithFallback(); |
| 247 if (frame.get()) { | |
| 248 shared_renderer_state_.SetCompositorFrameOnUI(frame.Pass(), true); | |
| 249 } | 229 } |
| 250 } | 230 } |
| 251 | 231 |
| 252 void BrowserViewRenderer::UpdateParentDrawConstraints() { | |
| 253 // Post an invalidate if the parent draw constraints are stale and there is | |
| 254 // no pending invalidate. | |
| 255 bool needs_force_invalidate = | |
| 256 shared_renderer_state_.NeedsForceInvalidateOnNextDrawGLOnUI(); | |
| 257 if (needs_force_invalidate || | |
| 258 !parent_draw_constraints_.Equals( | |
| 259 shared_renderer_state_.GetParentDrawConstraintsOnUI())) { | |
| 260 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(false); | |
| 261 PostInvalidateWithFallback(needs_force_invalidate); | |
| 262 } | |
| 263 } | |
| 264 | |
| 265 void BrowserViewRenderer::ReturnUnusedResource( | 232 void BrowserViewRenderer::ReturnUnusedResource( |
| 266 scoped_ptr<cc::CompositorFrame> frame) { | 233 scoped_ptr<cc::CompositorFrame> frame) { |
| 267 if (!frame.get()) | 234 if (!frame.get()) |
| 268 return; | 235 return; |
| 269 | 236 |
| 270 cc::CompositorFrameAck frame_ack; | 237 cc::CompositorFrameAck frame_ack; |
| 271 cc::TransferableResource::ReturnResources( | 238 cc::TransferableResource::ReturnResources( |
| 272 frame->delegated_frame_data->resource_list, &frame_ack.resources); | 239 frame->delegated_frame_data->resource_list, &frame_ack.resources); |
| 273 if (compositor_ && !frame_ack.resources.empty()) | 240 if (compositor_ && !frame_ack.resources.empty()) |
| 274 compositor_->ReturnResources(frame_ack); | 241 compositor_->ReturnResources(frame_ack); |
| 275 } | 242 } |
| 276 | 243 |
| 277 void BrowserViewRenderer::ReturnResourceFromParent() { | 244 void BrowserViewRenderer::ReturnResourceFromParent() { |
| 278 cc::CompositorFrameAck frame_ack; | 245 cc::CompositorFrameAck frame_ack; |
| 279 shared_renderer_state_.SwapReturnedResourcesOnUI(&frame_ack.resources); | 246 shared_renderer_state_.SwapReturnedResourcesOnUI(&frame_ack.resources); |
| 280 if (compositor_ && !frame_ack.resources.empty()) { | 247 if (compositor_ && !frame_ack.resources.empty()) { |
| 281 compositor_->ReturnResources(frame_ack); | 248 compositor_->ReturnResources(frame_ack); |
| 282 } | 249 } |
| 283 } | 250 } |
| 284 | 251 |
| 285 void BrowserViewRenderer::DidSkipCommitFrame() { | |
| 286 // Treat it the same way as skipping onDraw. | |
| 287 DidSkipCompositeInDraw(); | |
| 288 } | |
| 289 | |
| 290 void BrowserViewRenderer::InvalidateOnFunctorDestroy() { | 252 void BrowserViewRenderer::InvalidateOnFunctorDestroy() { |
| 291 client_->InvalidateOnFunctorDestroy(); | 253 client_->InvalidateOnFunctorDestroy(); |
| 292 } | 254 } |
| 293 | 255 |
| 294 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { | 256 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { |
| 295 return CanOnDraw() && CompositeSW(canvas); | 257 return CanOnDraw() && CompositeSW(canvas); |
| 296 } | 258 } |
| 297 | 259 |
| 298 skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width, | 260 skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width, |
| 299 int height) { | 261 int height) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 324 | 286 |
| 325 void BrowserViewRenderer::ClearView() { | 287 void BrowserViewRenderer::ClearView() { |
| 326 TRACE_EVENT_INSTANT0("android_webview", | 288 TRACE_EVENT_INSTANT0("android_webview", |
| 327 "BrowserViewRenderer::ClearView", | 289 "BrowserViewRenderer::ClearView", |
| 328 TRACE_EVENT_SCOPE_THREAD); | 290 TRACE_EVENT_SCOPE_THREAD); |
| 329 if (clear_view_) | 291 if (clear_view_) |
| 330 return; | 292 return; |
| 331 | 293 |
| 332 clear_view_ = true; | 294 clear_view_ = true; |
| 333 // Always invalidate ignoring the compositor to actually clear the webview. | 295 // Always invalidate ignoring the compositor to actually clear the webview. |
| 334 PostInvalidateWithFallback(false); | 296 PostInvalidateWithFallback(); |
| 335 } | 297 } |
| 336 | 298 |
| 337 void BrowserViewRenderer::SetIsPaused(bool paused) { | 299 void BrowserViewRenderer::SetIsPaused(bool paused) { |
| 338 TRACE_EVENT_INSTANT1("android_webview", | 300 TRACE_EVENT_INSTANT1("android_webview", |
| 339 "BrowserViewRenderer::SetIsPaused", | 301 "BrowserViewRenderer::SetIsPaused", |
| 340 TRACE_EVENT_SCOPE_THREAD, | 302 TRACE_EVENT_SCOPE_THREAD, |
| 341 "paused", | 303 "paused", |
| 342 paused); | 304 paused); |
| 343 is_paused_ = paused; | 305 is_paused_ = paused; |
| 344 UpdateCompositorIsActive(); | 306 UpdateCompositorIsActive(); |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( | 558 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( |
| 597 scaled_overscroll_delta + overscroll_rounding_error_); | 559 scaled_overscroll_delta + overscroll_rounding_error_); |
| 598 overscroll_rounding_error_ = | 560 overscroll_rounding_error_ = |
| 599 scaled_overscroll_delta - rounded_overscroll_delta; | 561 scaled_overscroll_delta - rounded_overscroll_delta; |
| 600 client_->DidOverscroll(rounded_overscroll_delta); | 562 client_->DidOverscroll(rounded_overscroll_delta); |
| 601 } | 563 } |
| 602 | 564 |
| 603 void BrowserViewRenderer::PostInvalidate() { | 565 void BrowserViewRenderer::PostInvalidate() { |
| 604 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate", | 566 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate", |
| 605 TRACE_EVENT_SCOPE_THREAD); | 567 TRACE_EVENT_SCOPE_THREAD); |
| 606 PostInvalidateWithFallback(false); | 568 PostInvalidateWithFallback(); |
| 607 } | 569 } |
| 608 | 570 |
| 609 void BrowserViewRenderer::PostInvalidateWithFallback( | 571 void BrowserViewRenderer::PostInvalidateWithFallback() { |
| 610 bool skip_reschedule_tick) { | |
| 611 if (block_invalidates_) { | 572 if (block_invalidates_) { |
| 612 invalidate_after_composite_ = true; | |
| 613 return; | 573 return; |
| 614 } | 574 } |
| 615 | 575 |
| 616 // Always call view invalidate. We rely the Android framework to ignore the | 576 // Always call view invalidate. We rely the Android framework to ignore the |
| 617 // invalidate when it's not needed such as when view is not visible. | 577 // invalidate when it's not needed such as when view is not visible. |
| 618 client_->PostInvalidate(); | 578 client_->PostInvalidate(); |
| 619 | 579 |
| 620 // Always clear any queued invalidates when posting a new one. | |
| 621 invalidate_after_composite_ = false; | |
| 622 | |
| 623 // Stop fallback ticks when one of these is true. | 580 // Stop fallback ticks when one of these is true. |
| 624 // 1) Webview is paused. Also need to check we are not in clear view since | 581 // 1) Webview is paused. Also need to check we are not in clear view since |
| 625 // paused, offscreen still expect clear view to recover. | 582 // paused, offscreen still expect clear view to recover. |
| 626 // 2) If we are attached to window and the window is not visible (eg when | 583 // 2) If we are attached to window and the window is not visible (eg when |
| 627 // app is in the background). We are sure in this case the webview is used | 584 // app is in the background). We are sure in this case the webview is used |
| 628 // "on-screen" but that updates are not needed when in the background. | 585 // "on-screen" but that updates are not needed when in the background. |
| 629 bool throttle_fallback_tick = | 586 bool throttle_fallback_tick = |
| 630 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_); | 587 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_); |
| 631 | 588 |
| 632 if (throttle_fallback_tick) | 589 if (throttle_fallback_tick) |
| 633 return; | 590 return; |
| 634 | 591 |
| 635 // Start blocking any invalidates posted. Eventually DidComposite or | 592 // Start blocking any invalidates posted. Eventually DidComposite or |
| 636 // DidSkipCompositeInDraw will be called either via onDraw or the fallback | 593 // DidSkipCompositeInDraw will be called either via onDraw or the fallback |
| 637 // tick and invalidates will be unblocked. | 594 // tick and invalidates will be unblocked. |
| 638 block_invalidates_ = true; | 595 block_invalidates_ = true; |
| 639 | 596 |
| 640 if (skip_reschedule_tick && fallback_tick_pending_) | 597 if (fallback_tick_pending_) |
| 641 return; | 598 return; |
| 642 | 599 |
| 643 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick, | 600 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick, |
| 644 base::Unretained(this))); | 601 base::Unretained(this))); |
| 645 fallback_tick_fired_.Cancel(); | 602 fallback_tick_fired_.Cancel(); |
| 646 | 603 |
| 647 fallback_tick_pending_ = true; | 604 fallback_tick_pending_ = true; |
| 648 ui_task_runner_->PostTask(FROM_HERE, post_fallback_tick_.callback()); | 605 ui_task_runner_->PostTask(FROM_HERE, post_fallback_tick_.callback()); |
| 649 } | 606 } |
| 650 | 607 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 663 } | 620 } |
| 664 | 621 |
| 665 void BrowserViewRenderer::FallbackTickFired() { | 622 void BrowserViewRenderer::FallbackTickFired() { |
| 666 TRACE_EVENT0("android_webview", "BrowserViewRenderer::FallbackTickFired"); | 623 TRACE_EVENT0("android_webview", "BrowserViewRenderer::FallbackTickFired"); |
| 667 // This should only be called if OnDraw or DrawGL did not come in time, which | 624 // This should only be called if OnDraw or DrawGL did not come in time, which |
| 668 // means block_invalidates_ must still be true. | 625 // means block_invalidates_ must still be true. |
| 669 DCHECK(block_invalidates_); | 626 DCHECK(block_invalidates_); |
| 670 fallback_tick_pending_ = false; | 627 fallback_tick_pending_ = false; |
| 671 if (compositor_) { | 628 if (compositor_) { |
| 672 if (hardware_enabled_) { | 629 if (hardware_enabled_) { |
| 673 ForceCompositeHw(); | 630 CompositeHw(); |
| 674 } else { | 631 } else { |
| 675 ForceFakeCompositeSW(); | 632 ForceFakeCompositeSW(); |
| 676 } | 633 } |
| 677 } | 634 } |
| 678 // Pretend we just composited to unblock further invalidates. | 635 // Pretend we just composited to unblock further invalidates. |
| 679 DidComposite(); | 636 DidComposite(); |
| 680 } | 637 } |
| 681 | 638 |
| 682 void BrowserViewRenderer::ForceFakeCompositeSW() { | 639 void BrowserViewRenderer::ForceFakeCompositeSW() { |
| 683 DCHECK(compositor_); | 640 DCHECK(compositor_); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 695 DidComposite(); | 652 DidComposite(); |
| 696 return result; | 653 return result; |
| 697 } | 654 } |
| 698 | 655 |
| 699 void BrowserViewRenderer::DidComposite() { | 656 void BrowserViewRenderer::DidComposite() { |
| 700 block_invalidates_ = false; | 657 block_invalidates_ = false; |
| 701 | 658 |
| 702 post_fallback_tick_.Cancel(); | 659 post_fallback_tick_.Cancel(); |
| 703 fallback_tick_fired_.Cancel(); | 660 fallback_tick_fired_.Cancel(); |
| 704 fallback_tick_pending_ = false; | 661 fallback_tick_pending_ = false; |
| 705 | |
| 706 if (invalidate_after_composite_) | |
| 707 PostInvalidateWithFallback(false); | |
| 708 } | |
| 709 | |
| 710 void BrowserViewRenderer::DidSkipCompositeInDraw() { | |
| 711 block_invalidates_ = false; | |
| 712 PostInvalidateWithFallback(true); | |
| 713 } | 662 } |
| 714 | 663 |
| 715 void BrowserViewRenderer::UpdateCompositorIsActive() { | 664 void BrowserViewRenderer::UpdateCompositorIsActive() { |
| 716 if (compositor_) | 665 if (compositor_) |
| 717 compositor_->SetIsActive(!is_paused_ && | 666 compositor_->SetIsActive(!is_paused_ && |
| 718 (!attached_to_window_ || window_visible_)); | 667 (!attached_to_window_ || window_visible_)); |
| 719 } | 668 } |
| 720 | 669 |
| 721 std::string BrowserViewRenderer::ToString() const { | 670 std::string BrowserViewRenderer::ToString() const { |
| 722 std::string str; | 671 std::string str; |
| 723 base::StringAppendF(&str, "is_paused: %d ", is_paused_); | 672 base::StringAppendF(&str, "is_paused: %d ", is_paused_); |
| 724 base::StringAppendF(&str, "view_visible: %d ", view_visible_); | 673 base::StringAppendF(&str, "view_visible: %d ", view_visible_); |
| 725 base::StringAppendF(&str, "window_visible: %d ", window_visible_); | 674 base::StringAppendF(&str, "window_visible: %d ", window_visible_); |
| 726 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); | 675 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); |
| 727 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); | 676 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); |
| 728 base::StringAppendF(&str, "invalidate_after_composite: %d ", | |
| 729 invalidate_after_composite_); | |
| 730 base::StringAppendF(&str, "block_invalidates: %d ", block_invalidates_); | 677 base::StringAppendF(&str, "block_invalidates: %d ", block_invalidates_); |
| 731 base::StringAppendF(&str, "fallback_tick_pending: %d ", | 678 base::StringAppendF(&str, "fallback_tick_pending: %d ", |
| 732 fallback_tick_pending_); | 679 fallback_tick_pending_); |
| 733 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); | 680 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); |
| 734 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); | 681 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); |
| 735 base::StringAppendF(&str, | 682 base::StringAppendF(&str, |
| 736 "global visible rect: %s ", | 683 "global visible rect: %s ", |
| 737 last_on_draw_global_visible_rect_.ToString().c_str()); | 684 last_on_draw_global_visible_rect_.ToString().c_str()); |
| 738 base::StringAppendF( | 685 base::StringAppendF( |
| 739 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); | 686 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); |
| 740 base::StringAppendF(&str, | 687 base::StringAppendF(&str, |
| 741 "overscroll_rounding_error_: %s ", | 688 "overscroll_rounding_error_: %s ", |
| 742 overscroll_rounding_error_.ToString().c_str()); | 689 overscroll_rounding_error_.ToString().c_str()); |
| 743 base::StringAppendF( | 690 base::StringAppendF( |
| 744 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); | 691 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); |
| 745 base::StringAppendF(&str, "clear_view: %d ", clear_view_); | 692 base::StringAppendF(&str, "clear_view: %d ", clear_view_); |
| 746 return str; | 693 return str; |
| 747 } | 694 } |
| 748 | 695 |
| 749 } // namespace android_webview | 696 } // namespace android_webview |
| OLD | NEW |