| 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 "base/auto_reset.h" | 9 #include "base/auto_reset.h" | 
| 9 #include "base/command_line.h" | 10 #include "base/command_line.h" | 
| 10 #include "base/logging.h" | 11 #include "base/logging.h" | 
| 11 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" | 
| 12 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" | 
| 13 #include "base/supports_user_data.h" | 14 #include "base/supports_user_data.h" | 
| 14 #include "base/trace_event/trace_event_argument.h" | 15 #include "base/trace_event/trace_event_argument.h" | 
| 15 #include "cc/output/compositor_frame.h" | 16 #include "cc/output/compositor_frame.h" | 
| 16 #include "content/public/browser/web_contents.h" | 17 #include "content/public/browser/web_contents.h" | 
| 17 #include "content/public/common/content_switches.h" | 18 #include "content/public/common/content_switches.h" | 
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 91       view_visible_(false), | 92       view_visible_(false), | 
| 92       window_visible_(false), | 93       window_visible_(false), | 
| 93       attached_to_window_(false), | 94       attached_to_window_(false), | 
| 94       hardware_enabled_(false), | 95       hardware_enabled_(false), | 
| 95       dip_scale_(0.0), | 96       dip_scale_(0.0), | 
| 96       page_scale_factor_(1.0), | 97       page_scale_factor_(1.0), | 
| 97       on_new_picture_enable_(false), | 98       on_new_picture_enable_(false), | 
| 98       clear_view_(false), | 99       clear_view_(false), | 
| 99       offscreen_pre_raster_(false), | 100       offscreen_pre_raster_(false), | 
| 100       compositor_needs_continuous_invalidate_(false), | 101       compositor_needs_continuous_invalidate_(false), | 
| 101       invalidate_after_composite_(false), |  | 
| 102       block_invalidates_(false), | 102       block_invalidates_(false), | 
| 103       fallback_tick_pending_(false) { | 103       fallback_tick_pending_(false) { | 
| 104 } | 104 } | 
| 105 | 105 | 
| 106 BrowserViewRenderer::~BrowserViewRenderer() { | 106 BrowserViewRenderer::~BrowserViewRenderer() { | 
| 107 } | 107 } | 
| 108 | 108 | 
| 109 void BrowserViewRenderer::RegisterWithWebContents( | 109 void BrowserViewRenderer::RegisterWithWebContents( | 
| 110     content::WebContents* web_contents) { | 110     content::WebContents* web_contents) { | 
| 111   web_contents->SetUserData(kBrowserViewRendererUserDataKey, | 111   web_contents->SetUserData(kBrowserViewRendererUserDataKey, | 
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 209   if (!hardware_enabled_) { | 209   if (!hardware_enabled_) { | 
| 210     TRACE_EVENT0("android_webview", "InitializeHwDraw"); | 210     TRACE_EVENT0("android_webview", "InitializeHwDraw"); | 
| 211     hardware_enabled_ = compositor_->InitializeHwDraw(); | 211     hardware_enabled_ = compositor_->InitializeHwDraw(); | 
| 212   } | 212   } | 
| 213   if (!hardware_enabled_) { | 213   if (!hardware_enabled_) { | 
| 214     TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_HardwareNotEnabled", | 214     TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_HardwareNotEnabled", | 
| 215                          TRACE_EVENT_SCOPE_THREAD); | 215                          TRACE_EVENT_SCOPE_THREAD); | 
| 216     return false; | 216     return false; | 
| 217   } | 217   } | 
| 218 | 218 | 
| 219   ReturnResourceFromParent(); | 219   return CompositeHw(); | 
| 220   if (shared_renderer_state_.HasCompositorFrameOnUI()) { |  | 
| 221     TRACE_EVENT_INSTANT0("android_webview", |  | 
| 222                          "EarlyOut_PreviousFrameUnconsumed", |  | 
| 223                          TRACE_EVENT_SCOPE_THREAD); |  | 
| 224     DidSkipCompositeInDraw(); |  | 
| 225     return true; |  | 
| 226   } |  | 
| 227 |  | 
| 228   scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); |  | 
| 229   if (!frame.get()) { |  | 
| 230     TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", |  | 
| 231                          TRACE_EVENT_SCOPE_THREAD); |  | 
| 232     return false; |  | 
| 233   } |  | 
| 234 |  | 
| 235   shared_renderer_state_.SetCompositorFrameOnUI(frame.Pass(), false); |  | 
| 236   return true; |  | 
| 237 } | 220 } | 
| 238 | 221 | 
| 239 scoped_ptr<cc::CompositorFrame> BrowserViewRenderer::CompositeHw() { | 222 bool BrowserViewRenderer::CompositeHw() { | 
|  | 223   ReturnResourceFromParent(); | 
| 240   compositor_->SetMemoryPolicy(CalculateDesiredMemoryPolicy()); | 224   compositor_->SetMemoryPolicy(CalculateDesiredMemoryPolicy()); | 
| 241 | 225 | 
| 242   parent_draw_constraints_ = | 226   ParentCompositorDrawConstraints parent_draw_constraints = | 
| 243       shared_renderer_state_.GetParentDrawConstraintsOnUI(); | 227       shared_renderer_state_.GetParentDrawConstraintsOnUI(); | 
| 244   gfx::Size surface_size(size_); | 228   gfx::Size surface_size(size_); | 
| 245   gfx::Rect viewport(surface_size); | 229   gfx::Rect viewport(surface_size); | 
| 246   gfx::Rect clip = viewport; | 230   gfx::Rect clip = viewport; | 
| 247   gfx::Transform transform_for_tile_priority = | 231   gfx::Transform transform_for_tile_priority = | 
| 248       parent_draw_constraints_.transform; | 232       parent_draw_constraints.transform; | 
| 249 | 233 | 
| 250   // If the WebView is on a layer, WebView does not know what transform is | 234   // If the WebView is on a layer, WebView does not know what transform is | 
| 251   // applied onto the layer so global visible rect does not make sense here. | 235   // applied onto the layer so global visible rect does not make sense here. | 
| 252   // In this case, just use the surface rect for tiling. | 236   // In this case, just use the surface rect for tiling. | 
| 253   gfx::Rect viewport_rect_for_tile_priority; | 237   gfx::Rect viewport_rect_for_tile_priority; | 
| 254 | 238 | 
| 255   // Leave viewport_rect_for_tile_priority empty if offscreen_pre_raster_ is on. | 239   // Leave viewport_rect_for_tile_priority empty if offscreen_pre_raster_ is on. | 
| 256   if (!offscreen_pre_raster_) { | 240   if (!offscreen_pre_raster_) { | 
| 257     if (parent_draw_constraints_.is_layer || | 241     if (parent_draw_constraints.is_layer) { | 
| 258         last_on_draw_global_visible_rect_.IsEmpty()) { | 242       viewport_rect_for_tile_priority = parent_draw_constraints.surface_rect; | 
| 259       viewport_rect_for_tile_priority = parent_draw_constraints_.surface_rect; |  | 
| 260     } else { | 243     } else { | 
| 261       viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; | 244       viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; | 
| 262     } | 245     } | 
| 263   } | 246   } | 
| 264 | 247 | 
| 265   scoped_ptr<cc::CompositorFrame> frame = | 248   scoped_ptr<cc::CompositorFrame> frame = | 
| 266       compositor_->DemandDrawHw(surface_size, | 249       compositor_->DemandDrawHw(surface_size, | 
| 267                                 gfx::Transform(), | 250                                 gfx::Transform(), | 
| 268                                 viewport, | 251                                 viewport, | 
| 269                                 clip, | 252                                 clip, | 
| 270                                 viewport_rect_for_tile_priority, | 253                                 viewport_rect_for_tile_priority, | 
| 271                                 transform_for_tile_priority); | 254                                 transform_for_tile_priority); | 
| 272   if (frame.get()) | 255   if (!frame.get()) { | 
| 273     DidComposite(); | 256     TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", | 
| 274   return frame.Pass(); | 257                          TRACE_EVENT_SCOPE_THREAD); | 
|  | 258     return false; | 
|  | 259   } | 
|  | 260 | 
|  | 261   scoped_ptr<ChildFrame> child_frame = make_scoped_ptr( | 
|  | 262       new ChildFrame(frame.Pass(), viewport_rect_for_tile_priority, | 
|  | 263                      transform_for_tile_priority, offscreen_pre_raster_, | 
|  | 264                      parent_draw_constraints.is_layer)); | 
|  | 265 | 
|  | 266   DidComposite(); | 
|  | 267   // Uncommitted frame can happen with consecutive fallback ticks. | 
|  | 268   ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); | 
|  | 269   shared_renderer_state_.SetCompositorFrameOnUI(child_frame.Pass()); | 
|  | 270   return true; | 
| 275 } | 271 } | 
| 276 | 272 | 
| 277 void BrowserViewRenderer::UpdateParentDrawConstraints() { | 273 void BrowserViewRenderer::UpdateParentDrawConstraints() { | 
| 278   // Post an invalidate if the parent draw constraints are stale and there is | 274   EnsureContinuousInvalidation(true); | 
| 279   // no pending invalidate. |  | 
| 280   bool needs_force_invalidate = |  | 
| 281       shared_renderer_state_.NeedsForceInvalidateOnNextDrawGLOnUI(); |  | 
| 282   if (needs_force_invalidate || |  | 
| 283       !parent_draw_constraints_.Equals( |  | 
| 284           shared_renderer_state_.GetParentDrawConstraintsOnUI())) { |  | 
| 285     shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(false); |  | 
| 286     EnsureContinuousInvalidation(true, needs_force_invalidate); |  | 
| 287   } |  | 
| 288 } | 275 } | 
| 289 | 276 | 
| 290 void BrowserViewRenderer::ReturnUnusedResource( | 277 void BrowserViewRenderer::ReturnUnusedResource( | 
| 291     scoped_ptr<cc::CompositorFrame> frame) { | 278     scoped_ptr<ChildFrame> child_frame) { | 
| 292   if (!frame.get()) | 279   if (!child_frame.get() || !child_frame->frame.get()) | 
| 293     return; | 280     return; | 
| 294 | 281 | 
| 295   cc::CompositorFrameAck frame_ack; | 282   cc::CompositorFrameAck frame_ack; | 
| 296   cc::TransferableResource::ReturnResources( | 283   cc::TransferableResource::ReturnResources( | 
| 297       frame->delegated_frame_data->resource_list, &frame_ack.resources); | 284       child_frame->frame->delegated_frame_data->resource_list, | 
|  | 285       &frame_ack.resources); | 
| 298   if (compositor_ && !frame_ack.resources.empty()) | 286   if (compositor_ && !frame_ack.resources.empty()) | 
| 299     compositor_->ReturnResources(frame_ack); | 287     compositor_->ReturnResources(frame_ack); | 
| 300 } | 288 } | 
| 301 | 289 | 
| 302 void BrowserViewRenderer::ReturnResourceFromParent() { | 290 void BrowserViewRenderer::ReturnResourceFromParent() { | 
| 303   cc::CompositorFrameAck frame_ack; | 291   cc::CompositorFrameAck frame_ack; | 
| 304   shared_renderer_state_.SwapReturnedResourcesOnUI(&frame_ack.resources); | 292   shared_renderer_state_.SwapReturnedResourcesOnUI(&frame_ack.resources); | 
| 305   if (compositor_ && !frame_ack.resources.empty()) { | 293   if (compositor_ && !frame_ack.resources.empty()) { | 
| 306     compositor_->ReturnResources(frame_ack); | 294     compositor_->ReturnResources(frame_ack); | 
| 307   } | 295   } | 
| 308 } | 296 } | 
| 309 | 297 | 
| 310 void BrowserViewRenderer::DidSkipCommitFrame() { |  | 
| 311   // Treat it the same way as skipping onDraw. |  | 
| 312   DidSkipCompositeInDraw(); |  | 
| 313 } |  | 
| 314 |  | 
| 315 void BrowserViewRenderer::DetachFunctorFromView() { | 298 void BrowserViewRenderer::DetachFunctorFromView() { | 
| 316   client_->DetachFunctorFromView(); | 299   client_->DetachFunctorFromView(); | 
| 317 } | 300 } | 
| 318 | 301 | 
| 319 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { | 302 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { | 
| 320   return CanOnDraw() && CompositeSW(canvas); | 303   return CanOnDraw() && CompositeSW(canvas); | 
| 321 } | 304 } | 
| 322 | 305 | 
| 323 skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width, | 306 skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width, | 
| 324                                                             int height) { | 307                                                             int height) { | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 349 | 332 | 
| 350 void BrowserViewRenderer::ClearView() { | 333 void BrowserViewRenderer::ClearView() { | 
| 351   TRACE_EVENT_INSTANT0("android_webview", | 334   TRACE_EVENT_INSTANT0("android_webview", | 
| 352                        "BrowserViewRenderer::ClearView", | 335                        "BrowserViewRenderer::ClearView", | 
| 353                        TRACE_EVENT_SCOPE_THREAD); | 336                        TRACE_EVENT_SCOPE_THREAD); | 
| 354   if (clear_view_) | 337   if (clear_view_) | 
| 355     return; | 338     return; | 
| 356 | 339 | 
| 357   clear_view_ = true; | 340   clear_view_ = true; | 
| 358   // Always invalidate ignoring the compositor to actually clear the webview. | 341   // Always invalidate ignoring the compositor to actually clear the webview. | 
| 359   EnsureContinuousInvalidation(true, false); | 342   EnsureContinuousInvalidation(true); | 
| 360 } | 343 } | 
| 361 | 344 | 
| 362 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { | 345 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { | 
| 363   // TODO(hush): anything to do when the setting is toggled? | 346   // TODO(hush): anything to do when the setting is toggled? | 
| 364   offscreen_pre_raster_ = enable; | 347   offscreen_pre_raster_ = enable; | 
| 365 } | 348 } | 
| 366 | 349 | 
| 367 void BrowserViewRenderer::SetIsPaused(bool paused) { | 350 void BrowserViewRenderer::SetIsPaused(bool paused) { | 
| 368   TRACE_EVENT_INSTANT1("android_webview", | 351   TRACE_EVENT_INSTANT1("android_webview", | 
| 369                        "BrowserViewRenderer::SetIsPaused", | 352                        "BrowserViewRenderer::SetIsPaused", | 
| 370                        TRACE_EVENT_SCOPE_THREAD, | 353                        TRACE_EVENT_SCOPE_THREAD, | 
| 371                        "paused", | 354                        "paused", | 
| 372                        paused); | 355                        paused); | 
| 373   is_paused_ = paused; | 356   is_paused_ = paused; | 
| 374   EnsureContinuousInvalidation(false, false); | 357   EnsureContinuousInvalidation(false); | 
| 375 } | 358 } | 
| 376 | 359 | 
| 377 void BrowserViewRenderer::SetViewVisibility(bool view_visible) { | 360 void BrowserViewRenderer::SetViewVisibility(bool view_visible) { | 
| 378   TRACE_EVENT_INSTANT1("android_webview", | 361   TRACE_EVENT_INSTANT1("android_webview", | 
| 379                        "BrowserViewRenderer::SetViewVisibility", | 362                        "BrowserViewRenderer::SetViewVisibility", | 
| 380                        TRACE_EVENT_SCOPE_THREAD, | 363                        TRACE_EVENT_SCOPE_THREAD, | 
| 381                        "view_visible", | 364                        "view_visible", | 
| 382                        view_visible); | 365                        view_visible); | 
| 383   view_visible_ = view_visible; | 366   view_visible_ = view_visible; | 
| 384 } | 367 } | 
| 385 | 368 | 
| 386 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) { | 369 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) { | 
| 387   TRACE_EVENT_INSTANT1("android_webview", | 370   TRACE_EVENT_INSTANT1("android_webview", | 
| 388                        "BrowserViewRenderer::SetWindowVisibility", | 371                        "BrowserViewRenderer::SetWindowVisibility", | 
| 389                        TRACE_EVENT_SCOPE_THREAD, | 372                        TRACE_EVENT_SCOPE_THREAD, | 
| 390                        "window_visible", | 373                        "window_visible", | 
| 391                        window_visible); | 374                        window_visible); | 
| 392   window_visible_ = window_visible; | 375   window_visible_ = window_visible; | 
| 393   EnsureContinuousInvalidation(false, false); | 376   EnsureContinuousInvalidation(false); | 
| 394 } | 377 } | 
| 395 | 378 | 
| 396 void BrowserViewRenderer::OnSizeChanged(int width, int height) { | 379 void BrowserViewRenderer::OnSizeChanged(int width, int height) { | 
| 397   TRACE_EVENT_INSTANT2("android_webview", | 380   TRACE_EVENT_INSTANT2("android_webview", | 
| 398                        "BrowserViewRenderer::OnSizeChanged", | 381                        "BrowserViewRenderer::OnSizeChanged", | 
| 399                        TRACE_EVENT_SCOPE_THREAD, | 382                        TRACE_EVENT_SCOPE_THREAD, | 
| 400                        "width", | 383                        "width", | 
| 401                        width, | 384                        width, | 
| 402                        "height", | 385                        "height", | 
| 403                        height); | 386                        height); | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 464   if (compositor_needs_continuous_invalidate_ == invalidate) | 447   if (compositor_needs_continuous_invalidate_ == invalidate) | 
| 465     return; | 448     return; | 
| 466 | 449 | 
| 467   TRACE_EVENT_INSTANT1("android_webview", | 450   TRACE_EVENT_INSTANT1("android_webview", | 
| 468                        "BrowserViewRenderer::SetContinuousInvalidate", | 451                        "BrowserViewRenderer::SetContinuousInvalidate", | 
| 469                        TRACE_EVENT_SCOPE_THREAD, | 452                        TRACE_EVENT_SCOPE_THREAD, | 
| 470                        "invalidate", | 453                        "invalidate", | 
| 471                        invalidate); | 454                        invalidate); | 
| 472   compositor_needs_continuous_invalidate_ = invalidate; | 455   compositor_needs_continuous_invalidate_ = invalidate; | 
| 473 | 456 | 
| 474   EnsureContinuousInvalidation(false, false); | 457   EnsureContinuousInvalidation(false); | 
| 475 } | 458 } | 
| 476 | 459 | 
| 477 void BrowserViewRenderer::SetDipScale(float dip_scale) { | 460 void BrowserViewRenderer::SetDipScale(float dip_scale) { | 
| 478   dip_scale_ = dip_scale; | 461   dip_scale_ = dip_scale; | 
| 479   CHECK_GT(dip_scale_, 0.f); | 462   CHECK_GT(dip_scale_, 0.f); | 
| 480 } | 463 } | 
| 481 | 464 | 
| 482 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { | 465 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { | 
| 483   DCHECK_GT(dip_scale_, 0.f); | 466   DCHECK_GT(dip_scale_, 0.f); | 
| 484   return gfx::ToCeiledVector2d(gfx::ScaleVector2d( | 467   return gfx::ToCeiledVector2d(gfx::ScaleVector2d( | 
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 634     overscroll_rounding_error_ = gfx::Vector2dF(); | 617     overscroll_rounding_error_ = gfx::Vector2dF(); | 
| 635   gfx::Vector2dF scaled_overscroll_delta = | 618   gfx::Vector2dF scaled_overscroll_delta = | 
| 636       gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale); | 619       gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale); | 
| 637   gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( | 620   gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( | 
| 638       scaled_overscroll_delta + overscroll_rounding_error_); | 621       scaled_overscroll_delta + overscroll_rounding_error_); | 
| 639   overscroll_rounding_error_ = | 622   overscroll_rounding_error_ = | 
| 640       scaled_overscroll_delta - rounded_overscroll_delta; | 623       scaled_overscroll_delta - rounded_overscroll_delta; | 
| 641   client_->DidOverscroll(rounded_overscroll_delta); | 624   client_->DidOverscroll(rounded_overscroll_delta); | 
| 642 } | 625 } | 
| 643 | 626 | 
| 644 void BrowserViewRenderer::EnsureContinuousInvalidation( | 627 void BrowserViewRenderer::EnsureContinuousInvalidation(bool force_invalidate) { | 
| 645     bool force_invalidate, |  | 
| 646     bool skip_reschedule_tick) { |  | 
| 647   if (force_invalidate) |  | 
| 648     invalidate_after_composite_ = true; |  | 
| 649 |  | 
| 650   // This method should be called again when any of these conditions change. | 628   // This method should be called again when any of these conditions change. | 
| 651   bool need_invalidate = | 629   bool need_invalidate = | 
| 652       compositor_needs_continuous_invalidate_ || invalidate_after_composite_; | 630       compositor_needs_continuous_invalidate_ || force_invalidate; | 
| 653   if (!need_invalidate || block_invalidates_) | 631   if (!need_invalidate || block_invalidates_) | 
| 654     return; | 632     return; | 
| 655 | 633 | 
| 656   if (!compositor_needs_continuous_invalidate_ && invalidate_after_composite_) |  | 
| 657     invalidate_after_composite_ = false; |  | 
| 658 |  | 
| 659   // Always call view invalidate. We rely the Android framework to ignore the | 634   // Always call view invalidate. We rely the Android framework to ignore the | 
| 660   // invalidate when it's not needed such as when view is not visible. | 635   // invalidate when it's not needed such as when view is not visible. | 
| 661   client_->PostInvalidate(); | 636   client_->PostInvalidate(); | 
| 662 | 637 | 
| 663   // Stop fallback ticks when one of these is true. | 638   // Stop fallback ticks when one of these is true. | 
| 664   // 1) Webview is paused. Also need to check we are not in clear view since | 639   // 1) Webview is paused. Also need to check we are not in clear view since | 
| 665   // paused, offscreen still expect clear view to recover. | 640   // paused, offscreen still expect clear view to recover. | 
| 666   // 2) If we are attached to window and the window is not visible (eg when | 641   // 2) If we are attached to window and the window is not visible (eg when | 
| 667   // app is in the background). We are sure in this case the webview is used | 642   // app is in the background). We are sure in this case the webview is used | 
| 668   // "on-screen" but that updates are not needed when in the background. | 643   // "on-screen" but that updates are not needed when in the background. | 
| 669   bool throttle_fallback_tick = | 644   bool throttle_fallback_tick = | 
| 670       (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_); | 645       (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_); | 
| 671   if (throttle_fallback_tick) | 646   if (throttle_fallback_tick) | 
| 672     return; | 647     return; | 
| 673 | 648 | 
| 674   block_invalidates_ = compositor_needs_continuous_invalidate_; | 649   block_invalidates_ = compositor_needs_continuous_invalidate_; | 
| 675   if (skip_reschedule_tick && fallback_tick_pending_) | 650   if (fallback_tick_pending_) | 
| 676     return; | 651     return; | 
| 677 | 652 | 
| 678   // Unretained here is safe because the callbacks are cancelled when | 653   // Unretained here is safe because the callbacks are cancelled when | 
| 679   // they are destroyed. | 654   // they are destroyed. | 
| 680   post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick, | 655   post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick, | 
| 681                                        base::Unretained(this))); | 656                                        base::Unretained(this))); | 
| 682   fallback_tick_fired_.Cancel(); | 657   fallback_tick_fired_.Cancel(); | 
| 683   fallback_tick_pending_ = false; | 658   fallback_tick_pending_ = false; | 
| 684 | 659 | 
| 685   // No need to reschedule fallback tick if compositor does not need to be | 660   // No need to reschedule fallback tick if compositor does not need to be | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 711                "BrowserViewRenderer::FallbackTickFired", | 686                "BrowserViewRenderer::FallbackTickFired", | 
| 712                "compositor_needs_continuous_invalidate_", | 687                "compositor_needs_continuous_invalidate_", | 
| 713                compositor_needs_continuous_invalidate_); | 688                compositor_needs_continuous_invalidate_); | 
| 714 | 689 | 
| 715   // This should only be called if OnDraw or DrawGL did not come in time, which | 690   // This should only be called if OnDraw or DrawGL did not come in time, which | 
| 716   // means block_invalidates_ must still be true. | 691   // means block_invalidates_ must still be true. | 
| 717   DCHECK(block_invalidates_); | 692   DCHECK(block_invalidates_); | 
| 718   fallback_tick_pending_ = false; | 693   fallback_tick_pending_ = false; | 
| 719   if (compositor_needs_continuous_invalidate_ && compositor_) { | 694   if (compositor_needs_continuous_invalidate_ && compositor_) { | 
| 720     if (hardware_enabled_) { | 695     if (hardware_enabled_) { | 
| 721       ReturnResourceFromParent(); | 696       CompositeHw(); | 
| 722       ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); |  | 
| 723       scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); |  | 
| 724       if (frame.get()) { |  | 
| 725         shared_renderer_state_.SetCompositorFrameOnUI(frame.Pass(), true); |  | 
| 726       } |  | 
| 727     } else { | 697     } else { | 
| 728       ForceFakeCompositeSW(); | 698       ForceFakeCompositeSW(); | 
| 729     } | 699     } | 
| 730   } else { | 700   } else { | 
| 731     // Pretend we just composited to unblock further invalidates. | 701     // Pretend we just composited to unblock further invalidates. | 
| 732     DidComposite(); | 702     DidComposite(); | 
| 733   } | 703   } | 
| 734 } | 704 } | 
| 735 | 705 | 
| 736 void BrowserViewRenderer::ForceFakeCompositeSW() { | 706 void BrowserViewRenderer::ForceFakeCompositeSW() { | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 748   bool result = compositor_->DemandDrawSw(canvas); | 718   bool result = compositor_->DemandDrawSw(canvas); | 
| 749   DidComposite(); | 719   DidComposite(); | 
| 750   return result; | 720   return result; | 
| 751 } | 721 } | 
| 752 | 722 | 
| 753 void BrowserViewRenderer::DidComposite() { | 723 void BrowserViewRenderer::DidComposite() { | 
| 754   block_invalidates_ = false; | 724   block_invalidates_ = false; | 
| 755   post_fallback_tick_.Cancel(); | 725   post_fallback_tick_.Cancel(); | 
| 756   fallback_tick_fired_.Cancel(); | 726   fallback_tick_fired_.Cancel(); | 
| 757   fallback_tick_pending_ = false; | 727   fallback_tick_pending_ = false; | 
| 758   EnsureContinuousInvalidation(false, false); | 728   EnsureContinuousInvalidation(false); | 
| 759 } |  | 
| 760 |  | 
| 761 void BrowserViewRenderer::DidSkipCompositeInDraw() { |  | 
| 762   block_invalidates_ = false; |  | 
| 763   EnsureContinuousInvalidation(true, true); |  | 
| 764 } | 729 } | 
| 765 | 730 | 
| 766 std::string BrowserViewRenderer::ToString() const { | 731 std::string BrowserViewRenderer::ToString() const { | 
| 767   std::string str; | 732   std::string str; | 
| 768   base::StringAppendF(&str, "is_paused: %d ", is_paused_); | 733   base::StringAppendF(&str, "is_paused: %d ", is_paused_); | 
| 769   base::StringAppendF(&str, "view_visible: %d ", view_visible_); | 734   base::StringAppendF(&str, "view_visible: %d ", view_visible_); | 
| 770   base::StringAppendF(&str, "window_visible: %d ", window_visible_); | 735   base::StringAppendF(&str, "window_visible: %d ", window_visible_); | 
| 771   base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); | 736   base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); | 
| 772   base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); | 737   base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); | 
| 773   base::StringAppendF(&str, | 738   base::StringAppendF(&str, | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 784   base::StringAppendF(&str, | 749   base::StringAppendF(&str, | 
| 785                       "overscroll_rounding_error_: %s ", | 750                       "overscroll_rounding_error_: %s ", | 
| 786                       overscroll_rounding_error_.ToString().c_str()); | 751                       overscroll_rounding_error_.ToString().c_str()); | 
| 787   base::StringAppendF( | 752   base::StringAppendF( | 
| 788       &str, "on_new_picture_enable: %d ", on_new_picture_enable_); | 753       &str, "on_new_picture_enable: %d ", on_new_picture_enable_); | 
| 789   base::StringAppendF(&str, "clear_view: %d ", clear_view_); | 754   base::StringAppendF(&str, "clear_view: %d ", clear_view_); | 
| 790   return str; | 755   return str; | 
| 791 } | 756 } | 
| 792 | 757 | 
| 793 }  // namespace android_webview | 758 }  // namespace android_webview | 
| OLD | NEW | 
|---|