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

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

Issue 256303006: Make LayerScrollOffsetDelegate updates consistent. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 7 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 | Annotate | Revision Log
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/shared_renderer_state.h" 8 #include "android_webview/browser/shared_renderer_state.h"
9 #include "android_webview/public/browser/draw_gl.h" 9 #include "android_webview/public/browser/draw_gl.h"
10 #include "base/android/jni_android.h" 10 #include "base/android/jni_android.h"
11 #include "base/auto_reset.h" 11 #include "base/auto_reset.h"
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/debug/trace_event.h" 13 #include "base/debug/trace_event.h"
14 #include "base/json/json_writer.h"
14 #include "base/logging.h" 15 #include "base/logging.h"
15 #include "base/strings/string_number_conversions.h" 16 #include "base/strings/string_number_conversions.h"
16 #include "base/strings/stringprintf.h" 17 #include "base/strings/stringprintf.h"
17 #include "content/public/browser/android/synchronous_compositor.h" 18 #include "content/public/browser/android/synchronous_compositor.h"
18 #include "content/public/browser/browser_thread.h" 19 #include "content/public/browser/browser_thread.h"
19 #include "content/public/browser/web_contents.h" 20 #include "content/public/browser/web_contents.h"
20 #include "content/public/common/content_switches.h" 21 #include "content/public/common/content_switches.h"
21 #include "third_party/skia/include/core/SkBitmap.h" 22 #include "third_party/skia/include/core/SkBitmap.h"
22 #include "third_party/skia/include/core/SkCanvas.h" 23 #include "third_party/skia/include/core/SkCanvas.h"
23 #include "third_party/skia/include/core/SkPicture.h" 24 #include "third_party/skia/include/core/SkPicture.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 } 67 }
67 68
68 private: 69 private:
69 gfx::Vector2dF* scoped_variable_; 70 gfx::Vector2dF* scoped_variable_;
70 gfx::Vector2dF original_value_; 71 gfx::Vector2dF original_value_;
71 base::Lock& lock_; 72 base::Lock& lock_;
72 73
73 DISALLOW_COPY_AND_ASSIGN(AutoResetWithLock); 74 DISALLOW_COPY_AND_ASSIGN(AutoResetWithLock);
74 }; 75 };
75 76
77 class TracedValue : public base::debug::ConvertableToTraceFormat {
78 public:
79 explicit TracedValue(base::Value* value) : value_(value) {}
80 static scoped_refptr<base::debug::ConvertableToTraceFormat> FromValue(
81 base::Value* value) {
82 return scoped_refptr<base::debug::ConvertableToTraceFormat>(
83 new TracedValue(value));
84 }
85 virtual void AppendAsTraceFormat(std::string* out) const OVERRIDE {
86 std::string tmp;
87 base::JSONWriter::Write(value_.get(), &tmp);
88 *out += tmp;
89 }
90
91 private:
92 virtual ~TracedValue() {}
93 scoped_ptr<base::Value> value_;
94
95 DISALLOW_COPY_AND_ASSIGN(TracedValue);
96 };
97
76 } // namespace 98 } // namespace
77 99
78 // static 100 // static
79 void BrowserViewRenderer::CalculateTileMemoryPolicy() { 101 void BrowserViewRenderer::CalculateTileMemoryPolicy() {
80 CommandLine* cl = CommandLine::ForCurrentProcess(); 102 CommandLine* cl = CommandLine::ForCurrentProcess();
81 const char kDefaultTileSize[] = "384"; 103 const char kDefaultTileSize[] = "384";
82 104
83 if (!cl->HasSwitch(switches::kDefaultTileWidth)) 105 if (!cl->HasSwitch(switches::kDefaultTileWidth))
84 cl->AppendSwitchASCII(switches::kDefaultTileWidth, kDefaultTileSize); 106 cl->AppendSwitchASCII(switches::kDefaultTileWidth, kDefaultTileSize);
85 107
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 DCHECK_LE(scroll_offset_dip.y(), max_scroll_offset_dip_.y()); 500 DCHECK_LE(scroll_offset_dip.y(), max_scroll_offset_dip_.y());
479 501
480 { 502 {
481 base::AutoLock lock(render_thread_lock_); 503 base::AutoLock lock(render_thread_lock_);
482 if (scroll_offset_dip_ == scroll_offset_dip) 504 if (scroll_offset_dip_ == scroll_offset_dip)
483 return; 505 return;
484 506
485 scroll_offset_dip_ = scroll_offset_dip; 507 scroll_offset_dip_ = scroll_offset_dip;
486 } 508 }
487 509
510 TRACE_EVENT_INSTANT2("android_webview",
511 "BrowserViewRenderer::ScrollTo",
512 TRACE_EVENT_SCOPE_THREAD,
513 "x",
514 scroll_offset_dip.x(),
515 "y",
516 scroll_offset_dip.y());
517
488 if (has_compositor_) 518 if (has_compositor_)
489 shared_renderer_state_->GetCompositor()-> 519 shared_renderer_state_->GetCompositor()->
490 DidChangeRootLayerScrollOffset(); 520 DidChangeRootLayerScrollOffset();
491 } 521 }
492 522
493 void BrowserViewRenderer::DidUpdateContent() { 523 void BrowserViewRenderer::DidUpdateContent() {
494 if (!ui_task_runner_->BelongsToCurrentThread()) { 524 if (!ui_task_runner_->BelongsToCurrentThread()) {
495 ui_task_runner_->PostTask(FROM_HERE, 525 ui_task_runner_->PostTask(FROM_HERE,
496 base::Bind(&BrowserViewRenderer::DidUpdateContent, 526 base::Bind(&BrowserViewRenderer::DidUpdateContent,
497 ui_thread_weak_ptr_)); 527 ui_thread_weak_ptr_));
498 return; 528 return;
499 } 529 }
500 TRACE_EVENT_INSTANT0("android_webview", 530 TRACE_EVENT_INSTANT0("android_webview",
501 "BrowserViewRenderer::DidUpdateContent", 531 "BrowserViewRenderer::DidUpdateContent",
502 TRACE_EVENT_SCOPE_THREAD); 532 TRACE_EVENT_SCOPE_THREAD);
503 clear_view_ = false; 533 clear_view_ = false;
504 if (on_new_picture_enable_) 534 if (on_new_picture_enable_)
505 client_->OnNewPicture(); 535 client_->OnNewPicture();
506 } 536 }
507 537
508 void BrowserViewRenderer::SetMaxRootLayerScrollOffset(
509 gfx::Vector2dF new_value_dip) {
510 if (!ui_task_runner_->BelongsToCurrentThread()) {
511 ui_task_runner_->PostTask(
512 FROM_HERE,
513 base::Bind(&BrowserViewRenderer::SetMaxRootLayerScrollOffset,
514 ui_thread_weak_ptr_,
515 new_value_dip));
516 return;
517 }
518 DCHECK_GT(dip_scale_, 0);
519
520 max_scroll_offset_dip_ = new_value_dip;
521 DCHECK_LE(0, max_scroll_offset_dip_.x());
522 DCHECK_LE(0, max_scroll_offset_dip_.y());
523
524 client_->SetMaxContainerViewScrollOffset(max_scroll_offset());
525 }
526
527 void BrowserViewRenderer::SetTotalRootLayerScrollOffset( 538 void BrowserViewRenderer::SetTotalRootLayerScrollOffset(
528 gfx::Vector2dF scroll_offset_dip) { 539 gfx::Vector2dF scroll_offset_dip) {
529 if (!ui_task_runner_->BelongsToCurrentThread()) {
530 ui_task_runner_->PostTask(
531 FROM_HERE,
532 base::Bind(&BrowserViewRenderer::SetTotalRootLayerScrollOffset,
533 ui_thread_weak_ptr_,
534 scroll_offset_dip));
535 return;
536 }
537 540
538 { 541 {
539 base::AutoLock lock(render_thread_lock_); 542 base::AutoLock lock(render_thread_lock_);
540 // TOOD(mkosiba): Add a DCHECK to say that this does _not_ get called during 543 // TOOD(mkosiba): Add a DCHECK to say that this does _not_ get called during
541 // DrawGl when http://crbug.com/249972 is fixed. 544 // DrawGl when http://crbug.com/249972 is fixed.
542 if (scroll_offset_dip_ == scroll_offset_dip) 545 if (scroll_offset_dip_ == scroll_offset_dip)
543 return; 546 return;
544 547
545 scroll_offset_dip_ = scroll_offset_dip; 548 scroll_offset_dip_ = scroll_offset_dip;
546 } 549 }
547 550
548 gfx::Vector2d max_offset = max_scroll_offset(); 551 gfx::Vector2d max_offset = max_scroll_offset();
549 gfx::Vector2d scroll_offset; 552 gfx::Vector2d scroll_offset;
550 // For an explanation as to why this is done this way see the comment in 553 // For an explanation as to why this is done this way see the comment in
551 // BrowserViewRenderer::ScrollTo. 554 // BrowserViewRenderer::ScrollTo.
552 if (max_scroll_offset_dip_.x()) { 555 if (max_scroll_offset_dip_.x()) {
553 scroll_offset.set_x((scroll_offset_dip.x() * max_offset.x()) / 556 scroll_offset.set_x((scroll_offset_dip.x() * max_offset.x()) /
554 max_scroll_offset_dip_.x()); 557 max_scroll_offset_dip_.x());
555 } 558 }
556 559
557 if (max_scroll_offset_dip_.y()) { 560 if (max_scroll_offset_dip_.y()) {
558 scroll_offset.set_y((scroll_offset_dip.y() * max_offset.y()) / 561 scroll_offset.set_y((scroll_offset_dip.y() * max_offset.y()) /
559 max_scroll_offset_dip_.y()); 562 max_scroll_offset_dip_.y());
560 } 563 }
561 564
562 DCHECK(0 <= scroll_offset.x()); 565 DCHECK(0 <= scroll_offset.x());
563 DCHECK(0 <= scroll_offset.y()); 566 DCHECK(0 <= scroll_offset.y());
564 // Disabled because the conditions are being violated while running 567 DCHECK(scroll_offset.x() <= max_offset.x());
565 // AwZoomTest.testMagnification, see http://crbug.com/340648 568 DCHECK(scroll_offset.y() <= max_offset.y());
566 // DCHECK(scroll_offset.x() <= max_offset.x());
567 // DCHECK(scroll_offset.y() <= max_offset.y());
568 569
569 client_->ScrollContainerViewTo(scroll_offset); 570 client_->ScrollContainerViewTo(scroll_offset);
570 } 571 }
571 572
572 gfx::Vector2dF BrowserViewRenderer::GetTotalRootLayerScrollOffset() { 573 gfx::Vector2dF BrowserViewRenderer::GetTotalRootLayerScrollOffset() {
573 base::AutoLock lock(render_thread_lock_); 574 base::AutoLock lock(render_thread_lock_);
574 return scroll_offset_dip_; 575 return scroll_offset_dip_;
575 } 576 }
576 577
577 bool BrowserViewRenderer::IsExternalFlingActive() const { 578 bool BrowserViewRenderer::IsExternalFlingActive() const {
578 if (!ui_task_runner_->BelongsToCurrentThread()) { 579 if (!ui_task_runner_->BelongsToCurrentThread()) {
579 // TODO(boliu): This is short term hack since we cannot call into 580 // TODO(boliu): This is short term hack since we cannot call into
580 // view system on non-UI thread. 581 // view system on non-UI thread.
581 return false; 582 return false;
582 } 583 }
583 return client_->IsFlingActive(); 584 return client_->IsFlingActive();
584 } 585 }
585 586
586 void BrowserViewRenderer::SetRootLayerPageScaleFactorAndLimits( 587 void BrowserViewRenderer::UpdateRootLayerState(
588 const gfx::Vector2dF& total_scroll_offset_dip,
589 const gfx::Vector2dF& max_scroll_offset_dip,
590 const gfx::SizeF& scrollable_size_dip,
587 float page_scale_factor, 591 float page_scale_factor,
588 float min_page_scale_factor, 592 float min_page_scale_factor,
589 float max_page_scale_factor) { 593 float max_page_scale_factor) {
590 if (!ui_task_runner_->BelongsToCurrentThread()) { 594 if (!ui_task_runner_->BelongsToCurrentThread()) {
591 ui_task_runner_->PostTask( 595 ui_task_runner_->PostTask(
592 FROM_HERE, 596 FROM_HERE,
593 base::Bind(&BrowserViewRenderer::SetRootLayerPageScaleFactorAndLimits, 597 base::Bind(&BrowserViewRenderer::UpdateRootLayerState,
594 ui_thread_weak_ptr_, 598 ui_thread_weak_ptr_,
599 total_scroll_offset_dip,
600 max_scroll_offset_dip,
601 scrollable_size_dip,
595 page_scale_factor, 602 page_scale_factor,
596 min_page_scale_factor, 603 min_page_scale_factor,
597 max_page_scale_factor)); 604 max_page_scale_factor));
598 return; 605 return;
599 } 606 }
607 TRACE_EVENT_INSTANT1(
608 "android_webview",
609 "BrowserViewRenderer::UpdateRootLayerState",
610 TRACE_EVENT_SCOPE_THREAD,
611 "state",
612 TracedValue::FromValue(
613 RootLayerStateAsValue(total_scroll_offset_dip, scrollable_size_dip)
614 .release()));
615
616 DCHECK_GT(dip_scale_, 0);
617
618 max_scroll_offset_dip_ = max_scroll_offset_dip;
619 DCHECK_LE(0, max_scroll_offset_dip_.x());
620 DCHECK_LE(0, max_scroll_offset_dip_.y());
621
600 page_scale_factor_ = page_scale_factor; 622 page_scale_factor_ = page_scale_factor;
601 DCHECK_GT(page_scale_factor_, 0); 623 DCHECK_GT(page_scale_factor_, 0);
602 client_->SetPageScaleFactorAndLimits( 624
603 page_scale_factor, min_page_scale_factor, max_page_scale_factor); 625 client_->UpdateScrollState(max_scroll_offset(),
604 client_->SetMaxContainerViewScrollOffset(max_scroll_offset()); 626 scrollable_size_dip,
627 page_scale_factor,
628 min_page_scale_factor,
629 max_page_scale_factor);
630 SetTotalRootLayerScrollOffset(total_scroll_offset_dip);
605 } 631 }
606 632
607 void BrowserViewRenderer::SetRootLayerScrollableSize( 633 scoped_ptr<base::Value> BrowserViewRenderer::RootLayerStateAsValue(
608 gfx::SizeF scrollable_size) { 634 const gfx::Vector2dF& total_scroll_offset_dip,
609 if (!ui_task_runner_->BelongsToCurrentThread()) { 635 const gfx::SizeF& scrollable_size_dip) {
610 ui_task_runner_->PostTask( 636 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue);
611 FROM_HERE, 637
612 base::Bind(&BrowserViewRenderer::SetRootLayerScrollableSize, 638 state->SetDouble("total_scroll_offset_dip.x", total_scroll_offset_dip.x());
613 ui_thread_weak_ptr_, 639 state->SetDouble("total_scroll_offset_dip.y", total_scroll_offset_dip.y());
614 scrollable_size)); 640
615 return; 641 state->SetDouble("max_scroll_offset_dip.x", max_scroll_offset_dip_.x());
616 } 642 state->SetDouble("max_scroll_offset_dip.y", max_scroll_offset_dip_.y());
617 client_->SetContentsSize(scrollable_size); 643
644 state->SetDouble("scrollable_size_dip.width", scrollable_size_dip.width());
645 state->SetDouble("scrollable_size_dip.height", scrollable_size_dip.height());
646
647 state->SetDouble("page_scale_factor", page_scale_factor_);
648 return state.PassAs<base::Value>();
618 } 649 }
619 650
620 void BrowserViewRenderer::DidOverscroll(gfx::Vector2dF accumulated_overscroll, 651 void BrowserViewRenderer::DidOverscroll(gfx::Vector2dF accumulated_overscroll,
621 gfx::Vector2dF latest_overscroll_delta, 652 gfx::Vector2dF latest_overscroll_delta,
622 gfx::Vector2dF current_fling_velocity) { 653 gfx::Vector2dF current_fling_velocity) {
623 if (!ui_task_runner_->BelongsToCurrentThread()) { 654 if (!ui_task_runner_->BelongsToCurrentThread()) {
624 ui_task_runner_->PostTask( 655 ui_task_runner_->PostTask(
625 FROM_HERE, 656 FROM_HERE,
626 base::Bind(&BrowserViewRenderer::DidOverscroll, 657 base::Bind(&BrowserViewRenderer::DidOverscroll,
627 ui_thread_weak_ptr_, 658 ui_thread_weak_ptr_,
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 base::StringAppendF(&str, 799 base::StringAppendF(&str,
769 "surface width height: [%d %d] ", 800 "surface width height: [%d %d] ",
770 draw_info->width, 801 draw_info->width,
771 draw_info->height); 802 draw_info->height);
772 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer); 803 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer);
773 } 804 }
774 return str; 805 return str;
775 } 806 }
776 807
777 } // namespace android_webview 808 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/browser/browser_view_renderer.h ('k') | android_webview/browser/browser_view_renderer_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698