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

Side by Side Diff: ui/views/controls/scroll_view.cc

Issue 2813353002: Ensure that the focus ring in the bookmarks bar does not paint outside the parent view. (Closed)
Patch Set: Rename layer notification to OnChildLayerChanged() Created 3 years, 8 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "ui/views/controls/scroll_view.h" 5 #include "ui/views/controls/scroll_view.h"
6 6
7 #include "base/feature_list.h" 7 #include "base/feature_list.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "ui/base/material_design/material_design_controller.h" 10 #include "ui/base/material_design/material_design_controller.h"
(...skipping 14 matching lines...) Expand all
25 25
26 const base::Feature kToolkitViewsScrollWithLayers { 26 const base::Feature kToolkitViewsScrollWithLayers {
27 "ToolkitViewsScrollWithLayers", 27 "ToolkitViewsScrollWithLayers",
28 #if defined(OS_MACOSX) 28 #if defined(OS_MACOSX)
29 base::FEATURE_ENABLED_BY_DEFAULT 29 base::FEATURE_ENABLED_BY_DEFAULT
30 #else 30 #else
31 base::FEATURE_DISABLED_BY_DEFAULT 31 base::FEATURE_DISABLED_BY_DEFAULT
32 #endif 32 #endif
33 }; 33 };
34 34
35 // Set if the kToolkitViewsScrollWithLayers feature is enabled.
36 // TODO(ananta)
37 // Remove this when the feature is enabled by default.
38 bool g_scroll_with_layers_enabled = false;
39
35 class ScrollCornerView : public View { 40 class ScrollCornerView : public View {
36 public: 41 public:
37 ScrollCornerView() {} 42 ScrollCornerView() {}
38 43
39 void OnPaint(gfx::Canvas* canvas) override { 44 void OnPaint(gfx::Canvas* canvas) override {
40 ui::NativeTheme::ExtraParams ignored; 45 ui::NativeTheme::ExtraParams ignored;
41 GetNativeTheme()->Paint(canvas->sk_canvas(), 46 GetNativeTheme()->Paint(canvas->sk_canvas(),
42 ui::NativeTheme::kScrollbarCorner, 47 ui::NativeTheme::kScrollbarCorner,
43 ui::NativeTheme::kNormal, 48 ui::NativeTheme::kNormal,
44 GetLocalBounds(), 49 GetLocalBounds(),
(...skipping 15 matching lines...) Expand all
60 return current_pos; 65 return current_pos;
61 } 66 }
62 67
63 // Make sure the content is not scrolled out of bounds 68 // Make sure the content is not scrolled out of bounds
64 void ConstrainScrollToBounds(View* viewport, View* view) { 69 void ConstrainScrollToBounds(View* viewport, View* view) {
65 if (!view) 70 if (!view)
66 return; 71 return;
67 72
68 // Note that even when ScrollView::ScrollsWithLayers() is true, the header row 73 // Note that even when ScrollView::ScrollsWithLayers() is true, the header row
69 // scrolls by repainting. 74 // scrolls by repainting.
70 const bool scrolls_with_layers = viewport->layer() != nullptr; 75 const bool scrolls_with_layers =
76 g_scroll_with_layers_enabled && viewport->layer() != nullptr;
sky 2017/04/17 15:24:01 Make ScrollView have a member for scroll_with_laye
ananta 2017/04/18 03:04:25 Done.
71 if (scrolls_with_layers) { 77 if (scrolls_with_layers) {
72 DCHECK(view->layer()); 78 DCHECK(view->layer());
73 DCHECK_EQ(0, view->x()); 79 DCHECK_EQ(0, view->x());
74 DCHECK_EQ(0, view->y()); 80 DCHECK_EQ(0, view->y());
75 } 81 }
76 gfx::ScrollOffset offset = scrolls_with_layers 82 gfx::ScrollOffset offset = scrolls_with_layers
77 ? view->layer()->CurrentScrollOffset() 83 ? view->layer()->CurrentScrollOffset()
78 : gfx::ScrollOffset(-view->x(), -view->y()); 84 : gfx::ScrollOffset(-view->x(), -view->y());
79 85
80 int x = CheckScrollBounds(viewport->width(), view->width(), offset.x()); 86 int x = CheckScrollBounds(viewport->width(), view->width(), offset.x());
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 AddChildView(header_viewport_); 165 AddChildView(header_viewport_);
160 166
161 // Don't add the scrollbars as children until we discover we need them 167 // Don't add the scrollbars as children until we discover we need them
162 // (ShowOrHideScrollBar). 168 // (ShowOrHideScrollBar).
163 horiz_sb_->SetVisible(false); 169 horiz_sb_->SetVisible(false);
164 horiz_sb_->set_controller(this); 170 horiz_sb_->set_controller(this);
165 vert_sb_->SetVisible(false); 171 vert_sb_->SetVisible(false);
166 vert_sb_->set_controller(this); 172 vert_sb_->set_controller(this);
167 corner_view_->SetVisible(false); 173 corner_view_->SetVisible(false);
168 174
169 if (!base::FeatureList::IsEnabled(kToolkitViewsScrollWithLayers)) 175 g_scroll_with_layers_enabled =
176 base::FeatureList::IsEnabled(kToolkitViewsScrollWithLayers);
177 if (!g_scroll_with_layers_enabled)
170 return; 178 return;
179
171 EnableViewPortLayer(); 180 EnableViewPortLayer();
172 } 181 }
173 182
174 ScrollView::~ScrollView() { 183 ScrollView::~ScrollView() {
175 // The scrollbars may not have been added, delete them to ensure they get 184 // The scrollbars may not have been added, delete them to ensure they get
176 // deleted. 185 // deleted.
177 delete horiz_sb_; 186 delete horiz_sb_;
178 delete vert_sb_; 187 delete vert_sb_;
179 delete corner_view_; 188 delete corner_view_;
180 } 189 }
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 } 529 }
521 530
522 const char* ScrollView::GetClassName() const { 531 const char* ScrollView::GetClassName() const {
523 return kViewClassName; 532 return kViewClassName;
524 } 533 }
525 534
526 void ScrollView::OnNativeThemeChanged(const ui::NativeTheme* theme) { 535 void ScrollView::OnNativeThemeChanged(const ui::NativeTheme* theme) {
527 UpdateBorder(); 536 UpdateBorder();
528 } 537 }
529 538
539 void ScrollView::OnChildLayerChanged(View* child) {
540 EnableViewPortLayer();
541 }
542
530 void ScrollView::ScrollToPosition(ScrollBar* source, int position) { 543 void ScrollView::ScrollToPosition(ScrollBar* source, int position) {
531 if (!contents_) 544 if (!contents_)
532 return; 545 return;
533 546
534 gfx::ScrollOffset offset = CurrentOffset(); 547 gfx::ScrollOffset offset = CurrentOffset();
535 if (source == horiz_sb_ && horiz_sb_->visible()) { 548 if (source == horiz_sb_ && horiz_sb_->visible()) {
536 position = AdjustPosition(offset.x(), position, contents_->width(), 549 position = AdjustPosition(offset.x(), position, contents_->width(),
537 contents_viewport_->width()); 550 contents_viewport_->width());
538 if (offset.x() == position) 551 if (offset.x() == position)
539 return; 552 return;
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 // and commits a frame, which isn't true in some tests. 723 // and commits a frame, which isn't true in some tests.
711 // See http://crbug.com/637521. 724 // See http://crbug.com/637521.
712 OnLayerScrolled(offset); 725 OnLayerScrolled(offset);
713 } else { 726 } else {
714 contents_->SetPosition(gfx::Point(-offset.x(), -offset.y())); 727 contents_->SetPosition(gfx::Point(-offset.x(), -offset.y()));
715 ScrollHeader(); 728 ScrollHeader();
716 } 729 }
717 } 730 }
718 731
719 bool ScrollView::ScrollsWithLayers() const { 732 bool ScrollView::ScrollsWithLayers() const {
733 if (!g_scroll_with_layers_enabled)
734 return false;
720 // Just check for the presence of a layer since it's cheaper than querying the 735 // Just check for the presence of a layer since it's cheaper than querying the
721 // Feature flag each time. 736 // Feature flag each time.
722 return contents_viewport_->layer() != nullptr; 737 return contents_viewport_->layer() != nullptr;
723 } 738 }
724 739
725 void ScrollView::EnableViewPortLayer() { 740 void ScrollView::EnableViewPortLayer() {
741 if (viewport_layer_enabled_)
742 return;
743
744 viewport_layer_enabled_ = true;
726 background_color_ = SK_ColorWHITE; 745 background_color_ = SK_ColorWHITE;
727 contents_viewport_->set_background( 746 contents_viewport_->set_background(
728 Background::CreateSolidBackground(background_color_)); 747 Background::CreateSolidBackground(background_color_));
729 contents_viewport_->SetPaintToLayer(); 748 contents_viewport_->SetPaintToLayer();
730 contents_viewport_->layer()->SetMasksToBounds(true); 749 contents_viewport_->layer()->SetMasksToBounds(true);
731 } 750 }
732 751
733 void ScrollView::OnLayerScrolled(const gfx::ScrollOffset&) { 752 void ScrollView::OnLayerScrolled(const gfx::ScrollOffset&) {
734 UpdateScrollBarPositions(); 753 UpdateScrollBarPositions();
735 ScrollHeader(); 754 ScrollHeader();
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 849
831 VariableRowHeightScrollHelper::RowInfo 850 VariableRowHeightScrollHelper::RowInfo
832 FixedRowHeightScrollHelper::GetRowInfo(int y) { 851 FixedRowHeightScrollHelper::GetRowInfo(int y) {
833 if (y < top_margin_) 852 if (y < top_margin_)
834 return RowInfo(0, top_margin_); 853 return RowInfo(0, top_margin_);
835 return RowInfo((y - top_margin_) / row_height_ * row_height_ + top_margin_, 854 return RowInfo((y - top_margin_) / row_height_ * row_height_ + top_margin_,
836 row_height_); 855 row_height_);
837 } 856 }
838 857
839 } // namespace views 858 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698