| Index: ui/views/controls/scroll_view.cc
 | 
| diff --git a/ui/views/controls/scroll_view.cc b/ui/views/controls/scroll_view.cc
 | 
| index 74cefcc61f7e9dd75aea8fc1593af824d7066290..c28b51349a29256aaea3138651c7fd2114859ae9 100644
 | 
| --- a/ui/views/controls/scroll_view.cc
 | 
| +++ b/ui/views/controls/scroll_view.cc
 | 
| @@ -61,13 +61,16 @@ int CheckScrollBounds(int viewport_size, int content_size, int current_pos) {
 | 
|  }
 | 
|  
 | 
|  // Make sure the content is not scrolled out of bounds
 | 
| -void ConstrainScrollToBounds(View* viewport, View* view) {
 | 
| +void ConstrainScrollToBounds(View* viewport,
 | 
| +                             View* view,
 | 
| +                             bool scroll_with_layers_enabled) {
 | 
|    if (!view)
 | 
|      return;
 | 
|  
 | 
|    // Note that even when ScrollView::ScrollsWithLayers() is true, the header row
 | 
|    // scrolls by repainting.
 | 
| -  const bool scrolls_with_layers = viewport->layer() != nullptr;
 | 
| +  const bool scrolls_with_layers =
 | 
| +      scroll_with_layers_enabled && viewport->layer() != nullptr;
 | 
|    if (scrolls_with_layers) {
 | 
|      DCHECK(view->layer());
 | 
|      DCHECK_EQ(0, view->x());
 | 
| @@ -152,7 +155,9 @@ ScrollView::ScrollView()
 | 
|        min_height_(-1),
 | 
|        max_height_(-1),
 | 
|        background_color_(SK_ColorTRANSPARENT),
 | 
| -      hide_horizontal_scrollbar_(false) {
 | 
| +      hide_horizontal_scrollbar_(false),
 | 
| +      scroll_with_layers_enabled_(
 | 
| +          base::FeatureList::IsEnabled(kToolkitViewsScrollWithLayers)) {
 | 
|    set_notify_enter_exit_on_child(true);
 | 
|  
 | 
|    AddChildView(contents_viewport_);
 | 
| @@ -166,8 +171,9 @@ ScrollView::ScrollView()
 | 
|    vert_sb_->set_controller(this);
 | 
|    corner_view_->SetVisible(false);
 | 
|  
 | 
| -  if (!base::FeatureList::IsEnabled(kToolkitViewsScrollWithLayers))
 | 
| +  if (!scroll_with_layers_enabled_)
 | 
|      return;
 | 
| +
 | 
|    EnableViewPortLayer();
 | 
|  }
 | 
|  
 | 
| @@ -450,8 +456,10 @@ void ScrollView::Layout() {
 | 
|    if (header_)
 | 
|      header_->Layout();
 | 
|  
 | 
| -  ConstrainScrollToBounds(header_viewport_, header_);
 | 
| -  ConstrainScrollToBounds(contents_viewport_, contents_);
 | 
| +  ConstrainScrollToBounds(header_viewport_, header_,
 | 
| +                          scroll_with_layers_enabled_);
 | 
| +  ConstrainScrollToBounds(contents_viewport_, contents_,
 | 
| +                          scroll_with_layers_enabled_);
 | 
|    SchedulePaint();
 | 
|    UpdateScrollBarPositions();
 | 
|  }
 | 
| @@ -527,6 +535,16 @@ void ScrollView::OnNativeThemeChanged(const ui::NativeTheme* theme) {
 | 
|    UpdateBorder();
 | 
|  }
 | 
|  
 | 
| +void ScrollView::ViewHierarchyChanged(
 | 
| +    const ViewHierarchyChangedDetails& details) {
 | 
| +  if (details.is_add && !viewport_layer_enabled_ && Contains(details.parent))
 | 
| +    EnableLayeringRecursivelyForChild(details.child);
 | 
| +}
 | 
| +
 | 
| +void ScrollView::OnChildLayerChanged(View* child) {
 | 
| +  EnableViewPortLayer();
 | 
| +}
 | 
| +
 | 
|  void ScrollView::ScrollToPosition(ScrollBar* source, int position) {
 | 
|    if (!contents_)
 | 
|      return;
 | 
| @@ -717,12 +735,18 @@ void ScrollView::ScrollToOffset(const gfx::ScrollOffset& offset) {
 | 
|  }
 | 
|  
 | 
|  bool ScrollView::ScrollsWithLayers() const {
 | 
| +  if (!scroll_with_layers_enabled_)
 | 
| +    return false;
 | 
|    // Just check for the presence of a layer since it's cheaper than querying the
 | 
|    // Feature flag each time.
 | 
|    return contents_viewport_->layer() != nullptr;
 | 
|  }
 | 
|  
 | 
|  void ScrollView::EnableViewPortLayer() {
 | 
| +  if (viewport_layer_enabled_)
 | 
| +    return;
 | 
| +
 | 
| +  viewport_layer_enabled_ = true;
 | 
|    background_color_ = SK_ColorWHITE;
 | 
|    contents_viewport_->set_background(
 | 
|        Background::CreateSolidBackground(background_color_));
 | 
| @@ -763,6 +787,22 @@ void ScrollView::UpdateBorder() {
 | 
|                : ui::NativeTheme::kColorId_UnfocusedBorderColor)));
 | 
|  }
 | 
|  
 | 
| +bool ScrollView::EnableLayeringRecursivelyForChild(View* view) {
 | 
| +  if (viewport_layer_enabled_ || scroll_with_layers_enabled_)
 | 
| +    return true;
 | 
| +
 | 
| +  if (view->layer()) {
 | 
| +    EnableViewPortLayer();
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  for (int i = 0; i < view->child_count(); ++i) {
 | 
| +    if (EnableLayeringRecursivelyForChild(view->child_at(i)))
 | 
| +      return true;
 | 
| +  }
 | 
| +  return false;
 | 
| +}
 | 
| +
 | 
|  // VariableRowHeightScrollHelper ----------------------------------------------
 | 
|  
 | 
|  VariableRowHeightScrollHelper::VariableRowHeightScrollHelper(
 | 
| 
 |