| 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 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 SkPictureRecorder recorder; | 340 SkPictureRecorder recorder; |
| 341 SkCanvas* rec_canvas = recorder.beginRecording(width, height, NULL, 0); | 341 SkCanvas* rec_canvas = recorder.beginRecording(width, height, NULL, 0); |
| 342 if (compositor_) { | 342 if (compositor_) { |
| 343 { | 343 { |
| 344 // Reset scroll back to the origin, will go back to the old | 344 // Reset scroll back to the origin, will go back to the old |
| 345 // value when scroll_reset is out of scope. | 345 // value when scroll_reset is out of scope. |
| 346 compositor_->DidChangeRootLayerScrollOffset(gfx::ScrollOffset()); | 346 compositor_->DidChangeRootLayerScrollOffset(gfx::ScrollOffset()); |
| 347 CompositeSW(rec_canvas); | 347 CompositeSW(rec_canvas); |
| 348 } | 348 } |
| 349 compositor_->DidChangeRootLayerScrollOffset( | 349 compositor_->DidChangeRootLayerScrollOffset( |
| 350 gfx::ScrollOffset(scroll_offset_dip_)); | 350 gfx::ScrollOffset(scroll_offset_css_)); |
| 351 } | 351 } |
| 352 return skia::AdoptRef(recorder.endRecording()); | 352 return skia::AdoptRef(recorder.endRecording()); |
| 353 } | 353 } |
| 354 | 354 |
| 355 void BrowserViewRenderer::EnableOnNewPicture(bool enabled) { | 355 void BrowserViewRenderer::EnableOnNewPicture(bool enabled) { |
| 356 on_new_picture_enable_ = enabled; | 356 on_new_picture_enable_ = enabled; |
| 357 } | 357 } |
| 358 | 358 |
| 359 void BrowserViewRenderer::ClearView() { | 359 void BrowserViewRenderer::ClearView() { |
| 360 TRACE_EVENT_INSTANT0("android_webview", | 360 TRACE_EVENT_INSTANT0("android_webview", |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 } | 527 } |
| 528 | 528 |
| 529 void BrowserViewRenderer::SetDipScale(float dip_scale) { | 529 void BrowserViewRenderer::SetDipScale(float dip_scale) { |
| 530 dip_scale_ = dip_scale; | 530 dip_scale_ = dip_scale; |
| 531 CHECK_GT(dip_scale_, 0.f); | 531 CHECK_GT(dip_scale_, 0.f); |
| 532 } | 532 } |
| 533 | 533 |
| 534 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { | 534 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { |
| 535 DCHECK_GT(dip_scale_, 0.f); | 535 DCHECK_GT(dip_scale_, 0.f); |
| 536 return gfx::ToCeiledVector2d(gfx::ScaleVector2d( | 536 return gfx::ToCeiledVector2d(gfx::ScaleVector2d( |
| 537 max_scroll_offset_dip_, dip_scale_ * page_scale_factor_)); | 537 max_scroll_offset_css_, dip_scale_ * page_scale_factor_)); |
| 538 } | 538 } |
| 539 | 539 |
| 540 void BrowserViewRenderer::ScrollTo(const gfx::Vector2d& scroll_offset) { | 540 void BrowserViewRenderer::ScrollTo(const gfx::Vector2d& scroll_offset) { |
| 541 gfx::Vector2d max_offset = max_scroll_offset(); | 541 gfx::Vector2d max_offset = max_scroll_offset(); |
| 542 gfx::Vector2dF scroll_offset_dip; | 542 gfx::Vector2dF scroll_offset_css; |
| 543 // To preserve the invariant that scrolling to the maximum physical pixel | 543 // To preserve the invariant that scrolling to the maximum physical pixel |
| 544 // value also scrolls to the maximum dip pixel value we transform the physical | 544 // value also scrolls to the maximum dip pixel value we transform the physical |
| 545 // offset into the dip offset by using a proportion (instead of dividing by | 545 // offset into the dip offset by using a proportion (instead of dividing by |
| 546 // dip_scale * page_scale_factor). | 546 // dip_scale * page_scale_factor). |
| 547 if (max_offset.x()) { | 547 if (max_offset.x()) { |
| 548 scroll_offset_dip.set_x((scroll_offset.x() * max_scroll_offset_dip_.x()) / | 548 scroll_offset_css.set_x((scroll_offset.x() * max_scroll_offset_css_.x()) / |
| 549 max_offset.x()); | 549 max_offset.x()); |
| 550 } | 550 } |
| 551 if (max_offset.y()) { | 551 if (max_offset.y()) { |
| 552 scroll_offset_dip.set_y((scroll_offset.y() * max_scroll_offset_dip_.y()) / | 552 scroll_offset_css.set_y((scroll_offset.y() * max_scroll_offset_css_.y()) / |
| 553 max_offset.y()); | 553 max_offset.y()); |
| 554 } | 554 } |
| 555 | 555 |
| 556 DCHECK_LE(0.f, scroll_offset_dip.x()); | 556 DCHECK_LE(0.f, scroll_offset_css.x()); |
| 557 DCHECK_LE(0.f, scroll_offset_dip.y()); | 557 DCHECK_LE(0.f, scroll_offset_css.y()); |
| 558 DCHECK(scroll_offset_dip.x() < max_scroll_offset_dip_.x() || | 558 DCHECK(scroll_offset_css.x() < max_scroll_offset_css_.x() || |
| 559 scroll_offset_dip.x() - max_scroll_offset_dip_.x() < kEpsilon) | 559 scroll_offset_css.x() - max_scroll_offset_css_.x() < kEpsilon) |
| 560 << scroll_offset_dip.x() << " " << max_scroll_offset_dip_.x(); | 560 << scroll_offset_css.x() << " " << max_scroll_offset_css_.x(); |
| 561 DCHECK(scroll_offset_dip.y() < max_scroll_offset_dip_.y() || | 561 DCHECK(scroll_offset_css.y() < max_scroll_offset_css_.y() || |
| 562 scroll_offset_dip.y() - max_scroll_offset_dip_.y() < kEpsilon) | 562 scroll_offset_css.y() - max_scroll_offset_css_.y() < kEpsilon) |
| 563 << scroll_offset_dip.y() << " " << max_scroll_offset_dip_.y(); | 563 << scroll_offset_css.y() << " " << max_scroll_offset_css_.y(); |
| 564 | 564 |
| 565 if (scroll_offset_dip_ == scroll_offset_dip) | 565 if (scroll_offset_css_ == scroll_offset_css) |
| 566 return; | 566 return; |
| 567 | 567 |
| 568 scroll_offset_dip_ = scroll_offset_dip; | 568 scroll_offset_css_ = scroll_offset_css; |
| 569 | 569 |
| 570 TRACE_EVENT_INSTANT2("android_webview", | 570 TRACE_EVENT_INSTANT2("android_webview", "BrowserViewRenderer::ScrollTo", |
| 571 "BrowserViewRenderer::ScrollTo", | 571 TRACE_EVENT_SCOPE_THREAD, "x", scroll_offset_css.x(), |
| 572 TRACE_EVENT_SCOPE_THREAD, | 572 "y", scroll_offset_css.y()); |
| 573 "x", | |
| 574 scroll_offset_dip.x(), | |
| 575 "y", | |
| 576 scroll_offset_dip.y()); | |
| 577 | 573 |
| 578 if (compositor_) { | 574 if (compositor_) { |
| 579 compositor_->DidChangeRootLayerScrollOffset( | 575 compositor_->DidChangeRootLayerScrollOffset( |
| 580 gfx::ScrollOffset(scroll_offset_dip_)); | 576 gfx::ScrollOffset(scroll_offset_css_)); |
| 581 } | 577 } |
| 582 } | 578 } |
| 583 | 579 |
| 584 void BrowserViewRenderer::DidUpdateContent() { | 580 void BrowserViewRenderer::DidUpdateContent() { |
| 585 TRACE_EVENT_INSTANT0("android_webview", | 581 TRACE_EVENT_INSTANT0("android_webview", |
| 586 "BrowserViewRenderer::DidUpdateContent", | 582 "BrowserViewRenderer::DidUpdateContent", |
| 587 TRACE_EVENT_SCOPE_THREAD); | 583 TRACE_EVENT_SCOPE_THREAD); |
| 588 clear_view_ = false; | 584 clear_view_ = false; |
| 589 if (on_new_picture_enable_) | 585 if (on_new_picture_enable_) |
| 590 client_->OnNewPicture(); | 586 client_->OnNewPicture(); |
| 591 } | 587 } |
| 592 | 588 |
| 593 void BrowserViewRenderer::SetTotalRootLayerScrollOffset( | 589 void BrowserViewRenderer::SetTotalRootLayerScrollOffset( |
| 594 const gfx::Vector2dF& scroll_offset_dip) { | 590 const gfx::Vector2dF& scroll_offset_css) { |
| 595 if (scroll_offset_dip_ == scroll_offset_dip) | 591 if (scroll_offset_css_ == scroll_offset_css) |
| 596 return; | 592 return; |
| 597 scroll_offset_dip_ = scroll_offset_dip; | 593 scroll_offset_css_ = scroll_offset_css; |
| 598 | 594 |
| 599 gfx::Vector2d max_offset = max_scroll_offset(); | 595 gfx::Vector2d max_offset = max_scroll_offset(); |
| 600 gfx::Vector2d scroll_offset; | 596 gfx::Vector2d scroll_offset; |
| 601 // For an explanation as to why this is done this way see the comment in | 597 // For an explanation as to why this is done this way see the comment in |
| 602 // BrowserViewRenderer::ScrollTo. | 598 // BrowserViewRenderer::ScrollTo. |
| 603 if (max_scroll_offset_dip_.x()) { | 599 if (max_scroll_offset_css_.x()) { |
| 604 scroll_offset.set_x((scroll_offset_dip.x() * max_offset.x()) / | 600 scroll_offset.set_x((scroll_offset_css.x() * max_offset.x()) / |
| 605 max_scroll_offset_dip_.x()); | 601 max_scroll_offset_css_.x()); |
| 606 } | 602 } |
| 607 | 603 |
| 608 if (max_scroll_offset_dip_.y()) { | 604 if (max_scroll_offset_css_.y()) { |
| 609 scroll_offset.set_y((scroll_offset_dip.y() * max_offset.y()) / | 605 scroll_offset.set_y((scroll_offset_css.y() * max_offset.y()) / |
| 610 max_scroll_offset_dip_.y()); | 606 max_scroll_offset_css_.y()); |
| 611 } | 607 } |
| 612 | 608 |
| 613 DCHECK_LE(0, scroll_offset.x()); | 609 DCHECK_LE(0, scroll_offset.x()); |
| 614 DCHECK_LE(0, scroll_offset.y()); | 610 DCHECK_LE(0, scroll_offset.y()); |
| 615 DCHECK_LE(scroll_offset.x(), max_offset.x()); | 611 DCHECK_LE(scroll_offset.x(), max_offset.x()); |
| 616 DCHECK_LE(scroll_offset.y(), max_offset.y()); | 612 DCHECK_LE(scroll_offset.y(), max_offset.y()); |
| 617 | 613 |
| 618 client_->ScrollContainerViewTo(scroll_offset); | 614 client_->ScrollContainerViewTo(scroll_offset); |
| 619 } | 615 } |
| 620 | 616 |
| 621 void BrowserViewRenderer::UpdateRootLayerState( | 617 void BrowserViewRenderer::UpdateRootLayerState( |
| 622 const gfx::Vector2dF& total_scroll_offset_dip, | 618 const gfx::Vector2dF& total_scroll_offset_css, |
| 623 const gfx::Vector2dF& max_scroll_offset_dip, | 619 const gfx::Vector2dF& max_scroll_offset_css, |
| 624 const gfx::SizeF& scrollable_size_dip, | 620 const gfx::SizeF& scrollable_size_css, |
| 625 float page_scale_factor, | 621 float page_scale_factor, |
| 626 float min_page_scale_factor, | 622 float min_page_scale_factor, |
| 627 float max_page_scale_factor) { | 623 float max_page_scale_factor) { |
| 628 TRACE_EVENT_INSTANT1( | 624 TRACE_EVENT_INSTANT1( |
| 629 "android_webview", | 625 "android_webview", "BrowserViewRenderer::UpdateRootLayerState", |
| 630 "BrowserViewRenderer::UpdateRootLayerState", | 626 TRACE_EVENT_SCOPE_THREAD, "state", |
| 631 TRACE_EVENT_SCOPE_THREAD, | 627 RootLayerStateAsValue(total_scroll_offset_css, scrollable_size_css)); |
| 632 "state", | |
| 633 RootLayerStateAsValue(total_scroll_offset_dip, scrollable_size_dip)); | |
| 634 | 628 |
| 635 DCHECK_GE(max_scroll_offset_dip.x(), 0.f); | 629 DCHECK_GE(max_scroll_offset_css.x(), 0.f); |
| 636 DCHECK_GE(max_scroll_offset_dip.y(), 0.f); | 630 DCHECK_GE(max_scroll_offset_css.y(), 0.f); |
| 637 DCHECK_GT(page_scale_factor, 0.f); | 631 DCHECK_GT(page_scale_factor, 0.f); |
| 638 // SetDipScale should have been called at least once before this is called. | 632 // SetDipScale should have been called at least once before this is called. |
| 639 DCHECK_GT(dip_scale_, 0.f); | 633 DCHECK_GT(dip_scale_, 0.f); |
| 640 | 634 |
| 641 if (max_scroll_offset_dip_ != max_scroll_offset_dip || | 635 if (max_scroll_offset_css_ != max_scroll_offset_css || |
| 642 scrollable_size_dip_ != scrollable_size_dip || | 636 scrollable_size_css_ != scrollable_size_css || |
| 643 page_scale_factor_ != page_scale_factor || | 637 page_scale_factor_ != page_scale_factor || |
| 644 min_page_scale_factor_ != min_page_scale_factor || | 638 min_page_scale_factor_ != min_page_scale_factor || |
| 645 max_page_scale_factor_ != max_page_scale_factor) { | 639 max_page_scale_factor_ != max_page_scale_factor) { |
| 646 max_scroll_offset_dip_ = max_scroll_offset_dip; | 640 max_scroll_offset_css_ = max_scroll_offset_css; |
| 647 scrollable_size_dip_ = scrollable_size_dip; | 641 scrollable_size_css_ = scrollable_size_css; |
| 648 page_scale_factor_ = page_scale_factor; | 642 page_scale_factor_ = page_scale_factor; |
| 649 min_page_scale_factor_ = min_page_scale_factor; | 643 min_page_scale_factor_ = min_page_scale_factor; |
| 650 max_page_scale_factor_ = max_page_scale_factor; | 644 max_page_scale_factor_ = max_page_scale_factor; |
| 651 | 645 |
| 652 client_->UpdateScrollState(max_scroll_offset(), scrollable_size_dip, | 646 client_->UpdateScrollState(max_scroll_offset(), scrollable_size_css, |
| 653 page_scale_factor, min_page_scale_factor, | 647 page_scale_factor, min_page_scale_factor, |
| 654 max_page_scale_factor); | 648 max_page_scale_factor); |
| 655 } | 649 } |
| 656 SetTotalRootLayerScrollOffset(total_scroll_offset_dip); | 650 SetTotalRootLayerScrollOffset(total_scroll_offset_css); |
| 657 } | 651 } |
| 658 | 652 |
| 659 scoped_refptr<base::trace_event::ConvertableToTraceFormat> | 653 scoped_refptr<base::trace_event::ConvertableToTraceFormat> |
| 660 BrowserViewRenderer::RootLayerStateAsValue( | 654 BrowserViewRenderer::RootLayerStateAsValue( |
| 661 const gfx::Vector2dF& total_scroll_offset_dip, | 655 const gfx::Vector2dF& total_scroll_offset_css, |
| 662 const gfx::SizeF& scrollable_size_dip) { | 656 const gfx::SizeF& scrollable_size_css) { |
| 663 scoped_refptr<base::trace_event::TracedValue> state = | 657 scoped_refptr<base::trace_event::TracedValue> state = |
| 664 new base::trace_event::TracedValue(); | 658 new base::trace_event::TracedValue(); |
| 665 | 659 |
| 666 state->SetDouble("total_scroll_offset_dip.x", total_scroll_offset_dip.x()); | 660 state->SetDouble("total_scroll_offset_css.x", total_scroll_offset_css.x()); |
| 667 state->SetDouble("total_scroll_offset_dip.y", total_scroll_offset_dip.y()); | 661 state->SetDouble("total_scroll_offset_css.y", total_scroll_offset_css.y()); |
| 668 | 662 |
| 669 state->SetDouble("max_scroll_offset_dip.x", max_scroll_offset_dip_.x()); | 663 state->SetDouble("max_scroll_offset_css.x", max_scroll_offset_css_.x()); |
| 670 state->SetDouble("max_scroll_offset_dip.y", max_scroll_offset_dip_.y()); | 664 state->SetDouble("max_scroll_offset_css.y", max_scroll_offset_css_.y()); |
| 671 | 665 |
| 672 state->SetDouble("scrollable_size_dip.width", scrollable_size_dip.width()); | 666 state->SetDouble("scrollable_size_css.width", scrollable_size_css.width()); |
| 673 state->SetDouble("scrollable_size_dip.height", scrollable_size_dip.height()); | 667 state->SetDouble("scrollable_size_css.height", scrollable_size_css.height()); |
| 674 | 668 |
| 675 state->SetDouble("page_scale_factor", page_scale_factor_); | 669 state->SetDouble("page_scale_factor", page_scale_factor_); |
| 676 return state; | 670 return state; |
| 677 } | 671 } |
| 678 | 672 |
| 679 void BrowserViewRenderer::DidOverscroll( | 673 void BrowserViewRenderer::DidOverscroll( |
| 680 const gfx::Vector2dF& accumulated_overscroll, | 674 const gfx::Vector2dF& accumulated_overscroll, |
| 681 const gfx::Vector2dF& latest_overscroll_delta, | 675 const gfx::Vector2dF& latest_overscroll_delta, |
| 682 const gfx::Vector2dF& current_fling_velocity) { | 676 const gfx::Vector2dF& current_fling_velocity) { |
| 683 const float physical_pixel_scale = dip_scale_ * page_scale_factor_; | 677 const float physical_pixel_scale = dip_scale_ * page_scale_factor_; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 base::StringAppendF(&str, "window_visible: %d ", window_visible_); | 784 base::StringAppendF(&str, "window_visible: %d ", window_visible_); |
| 791 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); | 785 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); |
| 792 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); | 786 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); |
| 793 base::StringAppendF(&str, "fallback_tick_pending: %d ", | 787 base::StringAppendF(&str, "fallback_tick_pending: %d ", |
| 794 fallback_tick_pending_); | 788 fallback_tick_pending_); |
| 795 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); | 789 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); |
| 796 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); | 790 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); |
| 797 base::StringAppendF(&str, | 791 base::StringAppendF(&str, |
| 798 "global visible rect: %s ", | 792 "global visible rect: %s ", |
| 799 last_on_draw_global_visible_rect_.ToString().c_str()); | 793 last_on_draw_global_visible_rect_.ToString().c_str()); |
| 800 base::StringAppendF( | 794 base::StringAppendF(&str, "scroll_offset_css: %s ", |
| 801 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); | 795 scroll_offset_css_.ToString().c_str()); |
| 802 base::StringAppendF(&str, | 796 base::StringAppendF(&str, |
| 803 "overscroll_rounding_error_: %s ", | 797 "overscroll_rounding_error_: %s ", |
| 804 overscroll_rounding_error_.ToString().c_str()); | 798 overscroll_rounding_error_.ToString().c_str()); |
| 805 base::StringAppendF( | 799 base::StringAppendF( |
| 806 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); | 800 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); |
| 807 base::StringAppendF(&str, "clear_view: %d ", clear_view_); | 801 base::StringAppendF(&str, "clear_view: %d ", clear_view_); |
| 808 return str; | 802 return str; |
| 809 } | 803 } |
| 810 | 804 |
| 811 } // namespace android_webview | 805 } // namespace android_webview |
| OLD | NEW |