summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorwjmaclean@chromium.org <wjmaclean@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-28 22:25:18 +0000
committerwjmaclean@chromium.org <wjmaclean@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-28 22:25:18 +0000
commitfe739dfd8c80b4c4d46c7af20af16f6eddcfba96 (patch)
treea285ae202326a2f4752b48b1f3e34f0df202110a /cc
parentf170c8b175f619f40e160b36bead172b704edb9c (diff)
downloadchromium_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.cc44
-rw-r--r--cc/layers/scrollbar_layer_unittest.cc1
-rw-r--r--cc/trees/layer_tree_host_impl_unittest.cc1
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());