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

Unified Diff: cc/trees/layer_tree_impl.cc

Issue 21091004: Fix bottom/right fixed-pos with non-overlay scrollbars. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_impl.cc
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index d69e7ff2e863c4410de1242e36c74666c2a2af52..93ad0a79b18870ce553fdcaa99d467cc86e9df94 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -143,11 +143,43 @@ LayerImpl* LayerTreeImpl::RootContainerLayer() const {
return root_scroll_layer_ ? root_scroll_layer_->parent() : NULL;
}
+LayerImpl* LayerTreeImpl::ViewportLayer() const {
+ // Return the first ancestor of the root container layer which has
+ // nonzero bounds.
+ LayerImpl* root_container = RootContainerLayer();
+ if (!root_container)
+ return NULL;
+
+ LayerImpl* ancestor = root_container->parent();
+ while (ancestor) {
+ if (!ancestor->bounds().IsEmpty())
+ return ancestor;
+ ancestor = ancestor->parent();
+ }
+ return NULL;
+}
+
LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const {
DCHECK(IsActiveTree());
return currently_scrolling_layer_;
}
+int LayerTreeImpl::NonOverlayScrollbarThickness(
+ ScrollbarOrientation orientation) const {
+ LayerImpl* viewport = ViewportLayer();
+ LayerImpl* root_container = RootContainerLayer();
+ if (!viewport || !root_container)
+ return 0;
+
+ DCHECK_GE(viewport->bounds().width(), root_container->bounds().width());
+ DCHECK_GE(viewport->bounds().height(), root_container->bounds().height());
+
+ if (orientation == VERTICAL)
+ return viewport->bounds().width() - root_container->bounds().width();
+ else
+ return viewport->bounds().height() - root_container->bounds().height();
+}
+
void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) {
if (currently_scrolling_layer_ == layer)
return;
@@ -217,12 +249,8 @@ void LayerTreeImpl::UpdateMaxScrollOffset() {
// The scrollable viewport size is based on device viewport instead of Blink's
// container layer, so we need to adjust for non-overlay scrollbars.
- ScrollbarLayerImpl* horiz = root_scroll->horizontal_scrollbar_layer();
- ScrollbarLayerImpl* vertical = root_scroll->vertical_scrollbar_layer();
- if (horiz && !horiz->is_overlay_scrollbar())
- max_scroll.set_y(max_scroll.y() + horiz->thumb_thickness());
- if (vertical && !vertical->is_overlay_scrollbar())
- max_scroll.set_x(max_scroll.x() + vertical->thumb_thickness());
+ max_scroll.set_x(max_scroll.x() + NonOverlayScrollbarThickness(VERTICAL));
enne (OOO) 2013/07/30 02:32:17 This code seems like it'd be cleaner if it set Ren
aelias_OOO_until_Jul13 2013/07/30 02:52:00 OK, I'll try that. It will be useful for root ove
enne (OOO) 2013/07/30 03:44:47 Oh, I see what you're getting at. What would make
aelias_OOO_until_Jul13 2013/07/30 04:06:13 That actually is not correct. In your page scale
+ max_scroll.set_y(max_scroll.y() + NonOverlayScrollbarThickness(HORIZONTAL));
// The viewport may be larger than the contents in some cases, such as
// having a vertical scrollbar but no horizontal overflow.
@@ -258,7 +286,7 @@ void LayerTreeImpl::UpdateSolidColorScrollbars() {
}
void LayerTreeImpl::UpdateDrawProperties() {
- if (IsActiveTree() && RootScrollLayer() && RootContainerLayer())
+ if (IsActiveTree())
UpdateRootScrollLayerSizeDelta();
if (settings().solid_color_scrollbars &&
@@ -526,22 +554,25 @@ void LayerTreeImpl::SetRootLayerScrollOffsetDelegate(
}
void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() {
- LayerImpl* root_scroll = RootScrollLayer();
- LayerImpl* root_container = RootContainerLayer();
- DCHECK(root_scroll);
- DCHECK(root_container);
- DCHECK(IsActiveTree());
-
- gfx::Vector2dF scrollable_viewport_size =
- gfx::RectF(ScrollableViewportSize()).bottom_right() - gfx::PointF();
-
- gfx::Vector2dF original_viewport_size =
- gfx::RectF(root_container->bounds()).bottom_right() -
- gfx::PointF();
- original_viewport_size.Scale(1 / page_scale_factor());
+ LayerImpl* viewport_layer = ViewportLayer();
+ if (!viewport_layer)
+ return;
- root_scroll->SetFixedContainerSizeDelta(
- scrollable_viewport_size - original_viewport_size);
+ DCHECK(IsActiveTree());
+ DCHECK(root_scroll_layer_);
+
+ // This corrects fixed-position elements for 1) dynamic viewport size changes
+ // caused by things like URL-bar hiding, and 2) impl-side page scale delta.
+ gfx::SizeF true_viewport_size =
+ gfx::ScaleSize(layer_tree_host_impl_->VisibleViewportSize(),
+ 1 / total_page_scale_factor());
+ gfx::SizeF blink_perceived_viewport_size =
+ gfx::ScaleSize(viewport_layer->bounds(), 1 / page_scale_factor());
enne (OOO) 2013/07/30 02:32:17 Just to make sure I'm reading this correctly, View
aelias_OOO_until_Jul13 2013/07/30 02:52:00 It doesn't matter because it's a delta. This is c
enne (OOO) 2013/07/30 03:44:47 I worked through an example, and I'll buy that exp
+ gfx::Vector2dF delta(
+ true_viewport_size.width() - blink_perceived_viewport_size.width(),
+ true_viewport_size.height() - blink_perceived_viewport_size.height());
+
+ root_scroll_layer_->SetFixedContainerSizeDelta(delta);
}
void LayerTreeImpl::SetLatencyInfo(const ui::LatencyInfo& latency_info) {
« no previous file with comments | « cc/trees/layer_tree_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698