diff options
author | wjmaclean@chromium.org <wjmaclean@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-28 22:25:18 +0000 |
---|---|---|
committer | wjmaclean@chromium.org <wjmaclean@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-28 22:25:18 +0000 |
commit | fe739dfd8c80b4c4d46c7af20af16f6eddcfba96 (patch) | |
tree | a285ae202326a2f4752b48b1f3e34f0df202110a /cc | |
parent | f170c8b175f619f40e160b36bead172b704edb9c (diff) | |
download | chromium_src-fe739dfd8c80b4c4d46c7af20af16f6eddcfba96.zip chromium_src-fe739dfd8c80b4c4d46c7af20af16f6eddcfba96.tar.gz chromium_src-fe739dfd8c80b4c4d46c7af20af16f6eddcfba96.tar.bz2 |
Scrollbars should get notifications from all scrollable layers up to container.
The thumb position of a scrollbar is dependant on the scroll offsets of all
scrollable layers from the scrollbar's designated scroll layer up to its
container layer. It also needs to know about geometry changes in its
scroll and container layers. This CL revises the mechanism that registers
a scrollbar to receive notifications to include all intervening scrollable
layers.
BUG=346393
Review URL: https://codereview.chromium.org/254643002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@266674 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc')
-rw-r--r-- | cc/layers/scrollbar_layer_impl_base.cc | 44 | ||||
-rw-r--r-- | cc/layers/scrollbar_layer_unittest.cc | 1 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_impl_unittest.cc | 1 |
3 files changed, 38 insertions, 8 deletions
diff --git a/cc/layers/scrollbar_layer_impl_base.cc b/cc/layers/scrollbar_layer_impl_base.cc index 978e8b8..dc9b92e 100644 --- a/cc/layers/scrollbar_layer_impl_base.cc +++ b/cc/layers/scrollbar_layer_impl_base.cc @@ -47,16 +47,44 @@ ScrollbarLayerImplBase* ScrollbarLayerImplBase::ToScrollbarLayer() { return this; } +namespace { + +typedef void (LayerImpl::*ScrollbarRegistrationOperation)( + ScrollbarLayerImplBase*); + +void RegisterScrollbarWithLayers(ScrollbarLayerImplBase* scrollbar, + LayerImpl* container_layer, + LayerImpl* scroll_layer, + ScrollbarRegistrationOperation operation) { + if (!container_layer || !scroll_layer) + return; + + DCHECK(scrollbar); + + // Scrollbars must be notifed of changes to their scroll and container layers + // and all scrollable layers in between. + for (LayerImpl* current_layer = scroll_layer; + current_layer && current_layer != container_layer->parent(); + current_layer = current_layer->parent()) { + // TODO(wjmaclean) We shouldn't need to exempt the scroll_layer from the + // scrollable() test below. https://crbug.com/367858. + if (current_layer->scrollable() || current_layer == container_layer || + current_layer == scroll_layer) + (current_layer->*operation)(scrollbar); + } +} +} // namespace + void ScrollbarLayerImplBase::SetScrollLayerById(int id) { LayerImpl* scroll_layer = layer_tree_impl()->LayerById(id); if (scroll_layer_ == scroll_layer) return; - if (scroll_layer_) - scroll_layer_->RemoveScrollbar(this); + RegisterScrollbarWithLayers( + this, clip_layer_, scroll_layer_, &LayerImpl::RemoveScrollbar); scroll_layer_ = scroll_layer; - if (scroll_layer_) - scroll_layer_->AddScrollbar(this); + RegisterScrollbarWithLayers( + this, clip_layer_, scroll_layer_, &LayerImpl::AddScrollbar); } void ScrollbarLayerImplBase::SetClipLayerById(int id) { @@ -64,11 +92,11 @@ void ScrollbarLayerImplBase::SetClipLayerById(int id) { if (clip_layer_ == clip_layer) return; - if (clip_layer_) - clip_layer_->RemoveScrollbar(this); + RegisterScrollbarWithLayers( + this, clip_layer_, scroll_layer_, &LayerImpl::RemoveScrollbar); clip_layer_ = clip_layer; - if (clip_layer_) - clip_layer_->AddScrollbar(this); + RegisterScrollbarWithLayers( + this, clip_layer_, scroll_layer_, &LayerImpl::AddScrollbar); } gfx::Rect ScrollbarLayerImplBase::ScrollbarLayerRectToContentRect( diff --git a/cc/layers/scrollbar_layer_unittest.cc b/cc/layers/scrollbar_layer_unittest.cc index 22a2664..2f9ede6 100644 --- a/cc/layers/scrollbar_layer_unittest.cc +++ b/cc/layers/scrollbar_layer_unittest.cc @@ -52,6 +52,7 @@ LayerImpl* LayerImplForScrollAreaAndScrollbar(FakeLayerTreeHost* host, } else { child2 = PaintedScrollbarLayer::Create(scrollbar.Pass(), child1->id()); } + child2->ToScrollbarLayer()->SetClipLayer(layer_tree_root->id()); layer_tree_root->AddChild(child1); layer_tree_root->InsertChild(child2, reverse_order ? 0 : 1); host->SetRootLayer(layer_tree_root); diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 3711ca7..f9a4f79 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc @@ -1477,6 +1477,7 @@ void LayerTreeHostImplTest::SetupMouseMoveAtWithDeviceScale( scrollbar->SetBounds(gfx::Size(15, viewport_size.height())); scrollbar->SetContentBounds(gfx::Size(15, viewport_size.height())); scrollbar->SetPosition(gfx::Point(285, 0)); + scrollbar->SetClipLayerById(1); scrollbar->SetScrollLayerById(2); scroll->AddChild(contents.Pass()); |