| 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 "android_webview/browser/child_frame.h" | 8 #include "android_webview/browser/child_frame.h" |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 is_paused_(false), | 91 is_paused_(false), |
| 92 view_visible_(false), | 92 view_visible_(false), |
| 93 window_visible_(false), | 93 window_visible_(false), |
| 94 attached_to_window_(false), | 94 attached_to_window_(false), |
| 95 hardware_enabled_(false), | 95 hardware_enabled_(false), |
| 96 dip_scale_(0.0), | 96 dip_scale_(0.0), |
| 97 page_scale_factor_(1.0), | 97 page_scale_factor_(1.0), |
| 98 on_new_picture_enable_(false), | 98 on_new_picture_enable_(false), |
| 99 clear_view_(false), | 99 clear_view_(false), |
| 100 offscreen_pre_raster_(false), | 100 offscreen_pre_raster_(false), |
| 101 compositor_needs_continuous_invalidate_(false), |
| 102 block_invalidates_(false), |
| 101 fallback_tick_pending_(false) { | 103 fallback_tick_pending_(false) { |
| 102 } | 104 } |
| 103 | 105 |
| 104 BrowserViewRenderer::~BrowserViewRenderer() { | 106 BrowserViewRenderer::~BrowserViewRenderer() { |
| 105 } | 107 } |
| 106 | 108 |
| 107 void BrowserViewRenderer::RegisterWithWebContents( | 109 void BrowserViewRenderer::RegisterWithWebContents( |
| 108 content::WebContents* web_contents) { | 110 content::WebContents* web_contents) { |
| 109 web_contents->SetUserData(kBrowserViewRendererUserDataKey, | 111 web_contents->SetUserData(kBrowserViewRendererUserDataKey, |
| 110 new BrowserViewRendererUserData(this)); | 112 new BrowserViewRendererUserData(this)); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_ClearView", | 191 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_ClearView", |
| 190 TRACE_EVENT_SCOPE_THREAD); | 192 TRACE_EVENT_SCOPE_THREAD); |
| 191 return false; | 193 return false; |
| 192 } | 194 } |
| 193 | 195 |
| 194 return true; | 196 return true; |
| 195 } | 197 } |
| 196 | 198 |
| 197 bool BrowserViewRenderer::OnDrawHardware() { | 199 bool BrowserViewRenderer::OnDrawHardware() { |
| 198 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware"); | 200 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware"); |
| 199 | |
| 200 shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI(); | 201 shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI(); |
| 201 | 202 |
| 202 if (!CanOnDraw()) { | 203 if (!CanOnDraw()) { |
| 203 return false; | 204 return false; |
| 204 } | 205 } |
| 205 | 206 |
| 206 shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_); | 207 shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_); |
| 207 | 208 |
| 208 if (!hardware_enabled_) { | 209 if (!hardware_enabled_) { |
| 209 TRACE_EVENT0("android_webview", "InitializeHwDraw"); | 210 TRACE_EVENT0("android_webview", "InitializeHwDraw"); |
| 210 hardware_enabled_ = compositor_->InitializeHwDraw(); | 211 hardware_enabled_ = compositor_->InitializeHwDraw(); |
| 211 } | 212 } |
| 212 if (!hardware_enabled_) { | 213 if (!hardware_enabled_) { |
| 213 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_HardwareNotEnabled", | 214 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_HardwareNotEnabled", |
| 214 TRACE_EVENT_SCOPE_THREAD); | 215 TRACE_EVENT_SCOPE_THREAD); |
| 215 return false; | 216 return false; |
| 216 } | 217 } |
| 217 | 218 |
| 218 return CompositeHw(); | 219 return CompositeHw(); |
| 219 } | 220 } |
| 220 | 221 |
| 221 bool BrowserViewRenderer::CompositeHw() { | 222 bool BrowserViewRenderer::CompositeHw() { |
| 222 CancelFallbackTick(); | |
| 223 | |
| 224 ReturnResourceFromParent(); | 223 ReturnResourceFromParent(); |
| 225 compositor_->SetMemoryPolicy(CalculateDesiredMemoryPolicy()); | 224 compositor_->SetMemoryPolicy(CalculateDesiredMemoryPolicy()); |
| 226 | 225 |
| 227 ParentCompositorDrawConstraints parent_draw_constraints = | 226 ParentCompositorDrawConstraints parent_draw_constraints = |
| 228 shared_renderer_state_.GetParentDrawConstraintsOnUI(); | 227 shared_renderer_state_.GetParentDrawConstraintsOnUI(); |
| 229 gfx::Size surface_size(size_); | 228 gfx::Size surface_size(size_); |
| 230 gfx::Rect viewport(surface_size); | 229 gfx::Rect viewport(surface_size); |
| 231 gfx::Rect clip = viewport; | 230 gfx::Rect clip = viewport; |
| 232 gfx::Transform transform_for_tile_priority = | 231 gfx::Transform transform_for_tile_priority = |
| 233 parent_draw_constraints.transform; | 232 parent_draw_constraints.transform; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 257 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", | 256 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", |
| 258 TRACE_EVENT_SCOPE_THREAD); | 257 TRACE_EVENT_SCOPE_THREAD); |
| 259 return false; | 258 return false; |
| 260 } | 259 } |
| 261 | 260 |
| 262 scoped_ptr<ChildFrame> child_frame = make_scoped_ptr( | 261 scoped_ptr<ChildFrame> child_frame = make_scoped_ptr( |
| 263 new ChildFrame(frame.Pass(), viewport_rect_for_tile_priority, | 262 new ChildFrame(frame.Pass(), viewport_rect_for_tile_priority, |
| 264 transform_for_tile_priority, offscreen_pre_raster_, | 263 transform_for_tile_priority, offscreen_pre_raster_, |
| 265 parent_draw_constraints.is_layer)); | 264 parent_draw_constraints.is_layer)); |
| 266 | 265 |
| 266 DidComposite(); |
| 267 // Uncommitted frame can happen with consecutive fallback ticks. | 267 // Uncommitted frame can happen with consecutive fallback ticks. |
| 268 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); | 268 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); |
| 269 shared_renderer_state_.SetCompositorFrameOnUI(child_frame.Pass()); | 269 shared_renderer_state_.SetCompositorFrameOnUI(child_frame.Pass()); |
| 270 return true; | 270 return true; |
| 271 } | 271 } |
| 272 | 272 |
| 273 void BrowserViewRenderer::UpdateParentDrawConstraints() { | 273 void BrowserViewRenderer::UpdateParentDrawConstraints() { |
| 274 PostInvalidateWithFallback(); | 274 EnsureContinuousInvalidation(true); |
| 275 ParentCompositorDrawConstraints parent_draw_constraints = | 275 ParentCompositorDrawConstraints parent_draw_constraints = |
| 276 shared_renderer_state_.GetParentDrawConstraintsOnUI(); | 276 shared_renderer_state_.GetParentDrawConstraintsOnUI(); |
| 277 client_->ParentDrawConstraintsUpdated(parent_draw_constraints); | 277 client_->ParentDrawConstraintsUpdated(parent_draw_constraints); |
| 278 } | 278 } |
| 279 | 279 |
| 280 void BrowserViewRenderer::ReturnUnusedResource( | 280 void BrowserViewRenderer::ReturnUnusedResource( |
| 281 scoped_ptr<ChildFrame> child_frame) { | 281 scoped_ptr<ChildFrame> child_frame) { |
| 282 if (!child_frame.get() || !child_frame->frame.get()) | 282 if (!child_frame.get() || !child_frame->frame.get()) |
| 283 return; | 283 return; |
| 284 | 284 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 | 335 |
| 336 void BrowserViewRenderer::ClearView() { | 336 void BrowserViewRenderer::ClearView() { |
| 337 TRACE_EVENT_INSTANT0("android_webview", | 337 TRACE_EVENT_INSTANT0("android_webview", |
| 338 "BrowserViewRenderer::ClearView", | 338 "BrowserViewRenderer::ClearView", |
| 339 TRACE_EVENT_SCOPE_THREAD); | 339 TRACE_EVENT_SCOPE_THREAD); |
| 340 if (clear_view_) | 340 if (clear_view_) |
| 341 return; | 341 return; |
| 342 | 342 |
| 343 clear_view_ = true; | 343 clear_view_ = true; |
| 344 // Always invalidate ignoring the compositor to actually clear the webview. | 344 // Always invalidate ignoring the compositor to actually clear the webview. |
| 345 PostInvalidateWithFallback(); | 345 EnsureContinuousInvalidation(true); |
| 346 } | 346 } |
| 347 | 347 |
| 348 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { | 348 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { |
| 349 // TODO(hush): anything to do when the setting is toggled? | 349 // TODO(hush): anything to do when the setting is toggled? |
| 350 offscreen_pre_raster_ = enable; | 350 offscreen_pre_raster_ = enable; |
| 351 } | 351 } |
| 352 | 352 |
| 353 void BrowserViewRenderer::SetIsPaused(bool paused) { | 353 void BrowserViewRenderer::SetIsPaused(bool paused) { |
| 354 TRACE_EVENT_INSTANT1("android_webview", | 354 TRACE_EVENT_INSTANT1("android_webview", |
| 355 "BrowserViewRenderer::SetIsPaused", | 355 "BrowserViewRenderer::SetIsPaused", |
| 356 TRACE_EVENT_SCOPE_THREAD, | 356 TRACE_EVENT_SCOPE_THREAD, |
| 357 "paused", | 357 "paused", |
| 358 paused); | 358 paused); |
| 359 is_paused_ = paused; | 359 is_paused_ = paused; |
| 360 UpdateCompositorIsActive(); | 360 EnsureContinuousInvalidation(false); |
| 361 } | 361 } |
| 362 | 362 |
| 363 void BrowserViewRenderer::SetViewVisibility(bool view_visible) { | 363 void BrowserViewRenderer::SetViewVisibility(bool view_visible) { |
| 364 TRACE_EVENT_INSTANT1("android_webview", | 364 TRACE_EVENT_INSTANT1("android_webview", |
| 365 "BrowserViewRenderer::SetViewVisibility", | 365 "BrowserViewRenderer::SetViewVisibility", |
| 366 TRACE_EVENT_SCOPE_THREAD, | 366 TRACE_EVENT_SCOPE_THREAD, |
| 367 "view_visible", | 367 "view_visible", |
| 368 view_visible); | 368 view_visible); |
| 369 view_visible_ = view_visible; | 369 view_visible_ = view_visible; |
| 370 } | 370 } |
| 371 | 371 |
| 372 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) { | 372 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) { |
| 373 TRACE_EVENT_INSTANT1("android_webview", | 373 TRACE_EVENT_INSTANT1("android_webview", |
| 374 "BrowserViewRenderer::SetWindowVisibility", | 374 "BrowserViewRenderer::SetWindowVisibility", |
| 375 TRACE_EVENT_SCOPE_THREAD, | 375 TRACE_EVENT_SCOPE_THREAD, |
| 376 "window_visible", | 376 "window_visible", |
| 377 window_visible); | 377 window_visible); |
| 378 window_visible_ = window_visible; | 378 window_visible_ = window_visible; |
| 379 UpdateCompositorIsActive(); | 379 EnsureContinuousInvalidation(false); |
| 380 } | 380 } |
| 381 | 381 |
| 382 void BrowserViewRenderer::OnSizeChanged(int width, int height) { | 382 void BrowserViewRenderer::OnSizeChanged(int width, int height) { |
| 383 TRACE_EVENT_INSTANT2("android_webview", | 383 TRACE_EVENT_INSTANT2("android_webview", |
| 384 "BrowserViewRenderer::OnSizeChanged", | 384 "BrowserViewRenderer::OnSizeChanged", |
| 385 TRACE_EVENT_SCOPE_THREAD, | 385 TRACE_EVENT_SCOPE_THREAD, |
| 386 "width", | 386 "width", |
| 387 width, | 387 width, |
| 388 "height", | 388 "height", |
| 389 height); | 389 height); |
| 390 size_.SetSize(width, height); | 390 size_.SetSize(width, height); |
| 391 } | 391 } |
| 392 | 392 |
| 393 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) { | 393 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) { |
| 394 TRACE_EVENT2("android_webview", | 394 TRACE_EVENT2("android_webview", |
| 395 "BrowserViewRenderer::OnAttachedToWindow", | 395 "BrowserViewRenderer::OnAttachedToWindow", |
| 396 "width", | 396 "width", |
| 397 width, | 397 width, |
| 398 "height", | 398 "height", |
| 399 height); | 399 height); |
| 400 attached_to_window_ = true; | 400 attached_to_window_ = true; |
| 401 size_.SetSize(width, height); | 401 size_.SetSize(width, height); |
| 402 UpdateCompositorIsActive(); | |
| 403 } | 402 } |
| 404 | 403 |
| 405 void BrowserViewRenderer::OnDetachedFromWindow() { | 404 void BrowserViewRenderer::OnDetachedFromWindow() { |
| 406 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); | 405 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); |
| 407 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); | 406 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); |
| 408 attached_to_window_ = false; | 407 attached_to_window_ = false; |
| 409 DCHECK(!hardware_enabled_); | 408 DCHECK(!hardware_enabled_); |
| 410 UpdateCompositorIsActive(); | |
| 411 } | 409 } |
| 412 | 410 |
| 413 void BrowserViewRenderer::ReleaseHardware() { | 411 void BrowserViewRenderer::ReleaseHardware() { |
| 414 DCHECK(hardware_enabled_); | 412 DCHECK(hardware_enabled_); |
| 415 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); | 413 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); |
| 416 ReturnResourceFromParent(); | 414 ReturnResourceFromParent(); |
| 417 DCHECK(shared_renderer_state_.ReturnedResourcesEmptyOnUI()); | 415 DCHECK(shared_renderer_state_.ReturnedResourcesEmptyOnUI()); |
| 418 | 416 |
| 419 if (compositor_) { | 417 if (compositor_) { |
| 420 compositor_->ReleaseHwDraw(); | 418 compositor_->ReleaseHwDraw(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 432 return gfx::Rect(client_->GetLocationOnScreen(), size_); | 430 return gfx::Rect(client_->GetLocationOnScreen(), size_); |
| 433 } | 431 } |
| 434 | 432 |
| 435 void BrowserViewRenderer::DidInitializeCompositor( | 433 void BrowserViewRenderer::DidInitializeCompositor( |
| 436 content::SynchronousCompositor* compositor) { | 434 content::SynchronousCompositor* compositor) { |
| 437 TRACE_EVENT0("android_webview", | 435 TRACE_EVENT0("android_webview", |
| 438 "BrowserViewRenderer::DidInitializeCompositor"); | 436 "BrowserViewRenderer::DidInitializeCompositor"); |
| 439 DCHECK(compositor); | 437 DCHECK(compositor); |
| 440 DCHECK(!compositor_); | 438 DCHECK(!compositor_); |
| 441 compositor_ = compositor; | 439 compositor_ = compositor; |
| 442 UpdateCompositorIsActive(); | |
| 443 } | 440 } |
| 444 | 441 |
| 445 void BrowserViewRenderer::DidDestroyCompositor( | 442 void BrowserViewRenderer::DidDestroyCompositor( |
| 446 content::SynchronousCompositor* compositor) { | 443 content::SynchronousCompositor* compositor) { |
| 447 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); | 444 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); |
| 448 DCHECK(compositor_); | 445 DCHECK(compositor_); |
| 449 compositor_ = NULL; | 446 compositor_ = NULL; |
| 450 } | 447 } |
| 451 | 448 |
| 449 void BrowserViewRenderer::SetContinuousInvalidate(bool invalidate) { |
| 450 if (compositor_needs_continuous_invalidate_ == invalidate) |
| 451 return; |
| 452 |
| 453 TRACE_EVENT_INSTANT1("android_webview", |
| 454 "BrowserViewRenderer::SetContinuousInvalidate", |
| 455 TRACE_EVENT_SCOPE_THREAD, |
| 456 "invalidate", |
| 457 invalidate); |
| 458 compositor_needs_continuous_invalidate_ = invalidate; |
| 459 |
| 460 EnsureContinuousInvalidation(false); |
| 461 } |
| 462 |
| 452 void BrowserViewRenderer::SetDipScale(float dip_scale) { | 463 void BrowserViewRenderer::SetDipScale(float dip_scale) { |
| 453 dip_scale_ = dip_scale; | 464 dip_scale_ = dip_scale; |
| 454 CHECK_GT(dip_scale_, 0.f); | 465 CHECK_GT(dip_scale_, 0.f); |
| 455 } | 466 } |
| 456 | 467 |
| 457 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { | 468 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { |
| 458 DCHECK_GT(dip_scale_, 0.f); | 469 DCHECK_GT(dip_scale_, 0.f); |
| 459 return gfx::ToCeiledVector2d(gfx::ScaleVector2d( | 470 return gfx::ToCeiledVector2d(gfx::ScaleVector2d( |
| 460 max_scroll_offset_dip_, dip_scale_ * page_scale_factor_)); | 471 max_scroll_offset_dip_, dip_scale_ * page_scale_factor_)); |
| 461 } | 472 } |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 609 overscroll_rounding_error_ = gfx::Vector2dF(); | 620 overscroll_rounding_error_ = gfx::Vector2dF(); |
| 610 gfx::Vector2dF scaled_overscroll_delta = | 621 gfx::Vector2dF scaled_overscroll_delta = |
| 611 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale); | 622 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale); |
| 612 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( | 623 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( |
| 613 scaled_overscroll_delta + overscroll_rounding_error_); | 624 scaled_overscroll_delta + overscroll_rounding_error_); |
| 614 overscroll_rounding_error_ = | 625 overscroll_rounding_error_ = |
| 615 scaled_overscroll_delta - rounded_overscroll_delta; | 626 scaled_overscroll_delta - rounded_overscroll_delta; |
| 616 client_->DidOverscroll(rounded_overscroll_delta); | 627 client_->DidOverscroll(rounded_overscroll_delta); |
| 617 } | 628 } |
| 618 | 629 |
| 619 void BrowserViewRenderer::PostInvalidate() { | 630 void BrowserViewRenderer::EnsureContinuousInvalidation(bool force_invalidate) { |
| 620 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate", | 631 // This method should be called again when any of these conditions change. |
| 621 TRACE_EVENT_SCOPE_THREAD); | 632 bool need_invalidate = |
| 622 PostInvalidateWithFallback(); | 633 compositor_needs_continuous_invalidate_ || force_invalidate; |
| 623 } | 634 if (!need_invalidate || block_invalidates_) |
| 635 return; |
| 624 | 636 |
| 625 void BrowserViewRenderer::PostInvalidateWithFallback() { | |
| 626 // Always call view invalidate. We rely the Android framework to ignore the | 637 // Always call view invalidate. We rely the Android framework to ignore the |
| 627 // invalidate when it's not needed such as when view is not visible. | 638 // invalidate when it's not needed such as when view is not visible. |
| 628 client_->PostInvalidate(); | 639 client_->PostInvalidate(); |
| 629 | 640 |
| 630 // Stop fallback ticks when one of these is true. | 641 // Stop fallback ticks when one of these is true. |
| 631 // 1) Webview is paused. Also need to check we are not in clear view since | 642 // 1) Webview is paused. Also need to check we are not in clear view since |
| 632 // paused, offscreen still expect clear view to recover. | 643 // paused, offscreen still expect clear view to recover. |
| 633 // 2) If we are attached to window and the window is not visible (eg when | 644 // 2) If we are attached to window and the window is not visible (eg when |
| 634 // app is in the background). We are sure in this case the webview is used | 645 // app is in the background). We are sure in this case the webview is used |
| 635 // "on-screen" but that updates are not needed when in the background. | 646 // "on-screen" but that updates are not needed when in the background. |
| 636 bool throttle_fallback_tick = | 647 bool throttle_fallback_tick = |
| 637 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_); | 648 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_); |
| 638 | 649 if (throttle_fallback_tick) |
| 639 if (throttle_fallback_tick || fallback_tick_pending_) | |
| 640 return; | 650 return; |
| 641 | 651 |
| 642 DCHECK(post_fallback_tick_.IsCancelled()); | 652 block_invalidates_ = compositor_needs_continuous_invalidate_; |
| 643 DCHECK(fallback_tick_fired_.IsCancelled()); | 653 if (fallback_tick_pending_) |
| 654 return; |
| 644 | 655 |
| 656 // Unretained here is safe because the callbacks are cancelled when |
| 657 // they are destroyed. |
| 645 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick, | 658 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick, |
| 646 base::Unretained(this))); | 659 base::Unretained(this))); |
| 647 ui_task_runner_->PostTask(FROM_HERE, post_fallback_tick_.callback()); | |
| 648 fallback_tick_pending_ = true; | |
| 649 } | |
| 650 | |
| 651 void BrowserViewRenderer::CancelFallbackTick() { | |
| 652 post_fallback_tick_.Cancel(); | |
| 653 fallback_tick_fired_.Cancel(); | 660 fallback_tick_fired_.Cancel(); |
| 654 fallback_tick_pending_ = false; | 661 fallback_tick_pending_ = false; |
| 662 |
| 663 // No need to reschedule fallback tick if compositor does not need to be |
| 664 // ticked. This can happen if this is reached because force_invalidate is |
| 665 // true. |
| 666 if (compositor_needs_continuous_invalidate_) { |
| 667 fallback_tick_pending_ = true; |
| 668 ui_task_runner_->PostTask(FROM_HERE, post_fallback_tick_.callback()); |
| 669 } |
| 655 } | 670 } |
| 656 | 671 |
| 657 void BrowserViewRenderer::PostFallbackTick() { | 672 void BrowserViewRenderer::PostFallbackTick() { |
| 658 DCHECK(fallback_tick_fired_.IsCancelled()); | 673 DCHECK(fallback_tick_fired_.IsCancelled()); |
| 659 TRACE_EVENT0("android_webview", "BrowserViewRenderer::PostFallbackTick"); | |
| 660 post_fallback_tick_.Cancel(); | |
| 661 fallback_tick_fired_.Reset(base::Bind(&BrowserViewRenderer::FallbackTickFired, | 674 fallback_tick_fired_.Reset(base::Bind(&BrowserViewRenderer::FallbackTickFired, |
| 662 base::Unretained(this))); | 675 base::Unretained(this))); |
| 663 ui_task_runner_->PostDelayedTask( | 676 if (compositor_needs_continuous_invalidate_) { |
| 664 FROM_HERE, fallback_tick_fired_.callback(), | 677 ui_task_runner_->PostDelayedTask( |
| 665 base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds)); | 678 FROM_HERE, |
| 679 fallback_tick_fired_.callback(), |
| 680 base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds)); |
| 681 } else { |
| 682 // Pretend we just composited to unblock further invalidates. |
| 683 DidComposite(); |
| 684 } |
| 666 } | 685 } |
| 667 | 686 |
| 668 void BrowserViewRenderer::FallbackTickFired() { | 687 void BrowserViewRenderer::FallbackTickFired() { |
| 669 TRACE_EVENT0("android_webview", "BrowserViewRenderer::FallbackTickFired"); | 688 TRACE_EVENT1("android_webview", |
| 689 "BrowserViewRenderer::FallbackTickFired", |
| 690 "compositor_needs_continuous_invalidate_", |
| 691 compositor_needs_continuous_invalidate_); |
| 692 |
| 670 // This should only be called if OnDraw or DrawGL did not come in time, which | 693 // This should only be called if OnDraw or DrawGL did not come in time, which |
| 671 // means fallback_tick_pending_ must still be true. | 694 // means block_invalidates_ must still be true. |
| 672 DCHECK(fallback_tick_pending_); | 695 DCHECK(block_invalidates_); |
| 673 fallback_tick_fired_.Cancel(); | |
| 674 fallback_tick_pending_ = false; | 696 fallback_tick_pending_ = false; |
| 675 if (compositor_) { | 697 if (compositor_needs_continuous_invalidate_ && compositor_) { |
| 676 if (hardware_enabled_) { | 698 if (hardware_enabled_) { |
| 677 CompositeHw(); | 699 CompositeHw(); |
| 678 } else { | 700 } else { |
| 679 ForceFakeCompositeSW(); | 701 ForceFakeCompositeSW(); |
| 680 } | 702 } |
| 703 } else { |
| 704 // Pretend we just composited to unblock further invalidates. |
| 705 DidComposite(); |
| 681 } | 706 } |
| 682 } | 707 } |
| 683 | 708 |
| 684 void BrowserViewRenderer::ForceFakeCompositeSW() { | 709 void BrowserViewRenderer::ForceFakeCompositeSW() { |
| 685 DCHECK(compositor_); | 710 DCHECK(compositor_); |
| 686 SkBitmap bitmap; | 711 SkBitmap bitmap; |
| 687 bitmap.allocN32Pixels(1, 1); | 712 bitmap.allocN32Pixels(1, 1); |
| 688 bitmap.eraseColor(0); | 713 bitmap.eraseColor(0); |
| 689 SkCanvas canvas(bitmap); | 714 SkCanvas canvas(bitmap); |
| 690 CompositeSW(&canvas); | 715 CompositeSW(&canvas); |
| 691 } | 716 } |
| 692 | 717 |
| 693 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { | 718 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { |
| 694 DCHECK(compositor_); | 719 DCHECK(compositor_); |
| 695 CancelFallbackTick(); | |
| 696 ReturnResourceFromParent(); | 720 ReturnResourceFromParent(); |
| 697 return compositor_->DemandDrawSw(canvas); | 721 bool result = compositor_->DemandDrawSw(canvas); |
| 722 DidComposite(); |
| 723 return result; |
| 698 } | 724 } |
| 699 | 725 |
| 700 void BrowserViewRenderer::UpdateCompositorIsActive() { | 726 void BrowserViewRenderer::DidComposite() { |
| 701 if (compositor_) | 727 block_invalidates_ = false; |
| 702 compositor_->SetIsActive(!is_paused_ && | 728 post_fallback_tick_.Cancel(); |
| 703 (!attached_to_window_ || window_visible_)); | 729 fallback_tick_fired_.Cancel(); |
| 730 fallback_tick_pending_ = false; |
| 731 EnsureContinuousInvalidation(false); |
| 704 } | 732 } |
| 705 | 733 |
| 706 std::string BrowserViewRenderer::ToString() const { | 734 std::string BrowserViewRenderer::ToString() const { |
| 707 std::string str; | 735 std::string str; |
| 708 base::StringAppendF(&str, "is_paused: %d ", is_paused_); | 736 base::StringAppendF(&str, "is_paused: %d ", is_paused_); |
| 709 base::StringAppendF(&str, "view_visible: %d ", view_visible_); | 737 base::StringAppendF(&str, "view_visible: %d ", view_visible_); |
| 710 base::StringAppendF(&str, "window_visible: %d ", window_visible_); | 738 base::StringAppendF(&str, "window_visible: %d ", window_visible_); |
| 711 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); | 739 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); |
| 712 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); | 740 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); |
| 713 base::StringAppendF(&str, "fallback_tick_pending: %d ", | 741 base::StringAppendF(&str, |
| 714 fallback_tick_pending_); | 742 "compositor_needs_continuous_invalidate: %d ", |
| 743 compositor_needs_continuous_invalidate_); |
| 744 base::StringAppendF(&str, "block_invalidates: %d ", block_invalidates_); |
| 715 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); | 745 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); |
| 716 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); | 746 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); |
| 717 base::StringAppendF(&str, | 747 base::StringAppendF(&str, |
| 718 "global visible rect: %s ", | 748 "global visible rect: %s ", |
| 719 last_on_draw_global_visible_rect_.ToString().c_str()); | 749 last_on_draw_global_visible_rect_.ToString().c_str()); |
| 720 base::StringAppendF( | 750 base::StringAppendF( |
| 721 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); | 751 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); |
| 722 base::StringAppendF(&str, | 752 base::StringAppendF(&str, |
| 723 "overscroll_rounding_error_: %s ", | 753 "overscroll_rounding_error_: %s ", |
| 724 overscroll_rounding_error_.ToString().c_str()); | 754 overscroll_rounding_error_.ToString().c_str()); |
| 725 base::StringAppendF( | 755 base::StringAppendF( |
| 726 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); | 756 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); |
| 727 base::StringAppendF(&str, "clear_view: %d ", clear_view_); | 757 base::StringAppendF(&str, "clear_view: %d ", clear_view_); |
| 728 return str; | 758 return str; |
| 729 } | 759 } |
| 730 | 760 |
| 731 } // namespace android_webview | 761 } // namespace android_webview |
| OLD | NEW |