Chromium Code Reviews| 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) { |