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

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

Issue 1556733002: Restore scrolloffset after exiting fullscreen. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: restore only when the page scale factor is back to the initial value Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "android_webview/browser/browser_view_renderer.h" 5 #include "android_webview/browser/browser_view_renderer.h"
6 6
7 #include "android_webview/browser/browser_view_renderer_client.h" 7 #include "android_webview/browser/browser_view_renderer_client.h"
8 #include "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
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
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
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
OLDNEW
« no previous file with comments | « android_webview/browser/browser_view_renderer.h ('k') | android_webview/java/src/org/chromium/android_webview/AwContents.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698