| Index: cc/trees/layer_tree_host_impl.cc
|
| diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
|
| index 5e21974d5802a02a71f1ebf7b93e3040112d56d3..0091ee5bb148f176610ff2126ba23bcba24d2d19 100644
|
| --- a/cc/trees/layer_tree_host_impl.cc
|
| +++ b/cc/trees/layer_tree_host_impl.cc
|
| @@ -2773,8 +2773,8 @@ InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated(
|
| if (!scroll_node->data.scrollable)
|
| continue;
|
|
|
| - LayerImpl* layer_impl = active_tree_->LayerById(scroll_node->owner_id);
|
| - gfx::ScrollOffset current_offset = layer_impl->CurrentScrollOffset();
|
| + gfx::ScrollOffset current_offset =
|
| + scroll_tree.current_scroll_offset(scroll_node->owner_id);
|
| gfx::ScrollOffset target_offset =
|
| ScrollOffsetWithDelta(current_offset, pending_delta);
|
| target_offset.SetToMax(gfx::ScrollOffset());
|
| @@ -2795,7 +2795,7 @@ InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated(
|
| std::abs(actual_delta.y()) > kEpsilon);
|
|
|
| if (!can_layer_scroll) {
|
| - layer_impl->ScrollBy(actual_delta);
|
| + scroll_tree.ScrollBy(scroll_node, actual_delta, active_tree());
|
| pending_delta -= actual_delta;
|
| continue;
|
| }
|
| @@ -2814,14 +2814,15 @@ InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated(
|
| return scroll_status;
|
| }
|
|
|
| -gfx::Vector2dF LayerTreeHostImpl::ScrollLayerWithViewportSpaceDelta(
|
| - LayerImpl* layer_impl,
|
| +gfx::Vector2dF LayerTreeHostImpl::ScrollNodeWithViewportSpaceDelta(
|
| + ScrollNode* scroll_node,
|
| const gfx::PointF& viewport_point,
|
| - const gfx::Vector2dF& viewport_delta) {
|
| + const gfx::Vector2dF& viewport_delta,
|
| + ScrollTree* scroll_tree) {
|
| // Layers with non-invertible screen space transforms should not have passed
|
| // the scroll hit test in the first place.
|
| const gfx::Transform screen_space_transform =
|
| - layer_impl->ScreenSpaceTransform();
|
| + scroll_tree->ScreenSpaceTransform(scroll_node->id);
|
| DCHECK(screen_space_transform.IsInvertible());
|
| gfx::Transform inverse_screen_space_transform(
|
| gfx::Transform::kSkipInitialization);
|
| @@ -2859,10 +2860,13 @@ gfx::Vector2dF LayerTreeHostImpl::ScrollLayerWithViewportSpaceDelta(
|
| return gfx::Vector2dF();
|
|
|
| // Apply the scroll delta.
|
| - gfx::ScrollOffset previous_offset = layer_impl->CurrentScrollOffset();
|
| - layer_impl->ScrollBy(local_end_point - local_start_point);
|
| + gfx::ScrollOffset previous_offset =
|
| + scroll_tree->current_scroll_offset(scroll_node->owner_id);
|
| + scroll_tree->ScrollBy(scroll_node, local_end_point - local_start_point,
|
| + active_tree());
|
| gfx::ScrollOffset scrolled =
|
| - layer_impl->CurrentScrollOffset() - previous_offset;
|
| + scroll_tree->current_scroll_offset(scroll_node->owner_id) -
|
| + previous_offset;
|
|
|
| // Get the end point in the layer's content space so we can apply its
|
| // ScreenSpaceTransform.
|
| @@ -2881,16 +2885,20 @@ gfx::Vector2dF LayerTreeHostImpl::ScrollLayerWithViewportSpaceDelta(
|
| return actual_viewport_end_point - viewport_point;
|
| }
|
|
|
| -static gfx::Vector2dF ScrollLayerWithLocalDelta(
|
| - LayerImpl* layer_impl,
|
| +static gfx::Vector2dF ScrollNodeWithLocalDelta(
|
| + ScrollNode* scroll_node,
|
| const gfx::Vector2dF& local_delta,
|
| - float page_scale_factor) {
|
| - gfx::ScrollOffset previous_offset = layer_impl->CurrentScrollOffset();
|
| + float page_scale_factor,
|
| + LayerTreeImpl* layer_tree_impl) {
|
| + ScrollTree& scroll_tree = layer_tree_impl->property_trees()->scroll_tree;
|
| + gfx::ScrollOffset previous_offset =
|
| + scroll_tree.current_scroll_offset(scroll_node->owner_id);
|
| gfx::Vector2dF delta = local_delta;
|
| delta.Scale(1.f / page_scale_factor);
|
| - layer_impl->ScrollBy(delta);
|
| + scroll_tree.ScrollBy(scroll_node, delta, layer_tree_impl);
|
| gfx::ScrollOffset scrolled =
|
| - layer_impl->CurrentScrollOffset() - previous_offset;
|
| + scroll_tree.current_scroll_offset(scroll_node->owner_id) -
|
| + previous_offset;
|
| gfx::Vector2dF consumed_scroll(scrolled.x(), scrolled.y());
|
| consumed_scroll.Scale(page_scale_factor);
|
|
|
| @@ -2899,10 +2907,12 @@ static gfx::Vector2dF ScrollLayerWithLocalDelta(
|
|
|
| // TODO(danakj): Make this into two functions, one with delta, one with
|
| // viewport_point, no bool required.
|
| -gfx::Vector2dF LayerTreeHostImpl::ScrollLayer(LayerImpl* layer_impl,
|
| - const gfx::Vector2dF& delta,
|
| - const gfx::Point& viewport_point,
|
| - bool is_direct_manipulation) {
|
| +gfx::Vector2dF LayerTreeHostImpl::ScrollSingleNode(
|
| + ScrollNode* scroll_node,
|
| + const gfx::Vector2dF& delta,
|
| + const gfx::Point& viewport_point,
|
| + bool is_direct_manipulation,
|
| + ScrollTree* scroll_tree) {
|
| // Events representing direct manipulation of the screen (such as gesture
|
| // events) need to be transformed from viewport coordinates to local layer
|
| // coordinates so that the scrolling contents exactly follow the user's
|
| @@ -2911,14 +2921,15 @@ gfx::Vector2dF LayerTreeHostImpl::ScrollLayer(LayerImpl* layer_impl,
|
| // can just apply them directly, but the page scale factor is applied to the
|
| // scroll delta.
|
| if (is_direct_manipulation) {
|
| - return ScrollLayerWithViewportSpaceDelta(
|
| - layer_impl, gfx::PointF(viewport_point), delta);
|
| + return ScrollNodeWithViewportSpaceDelta(
|
| + scroll_node, gfx::PointF(viewport_point), delta, scroll_tree);
|
| }
|
| float scale_factor = active_tree()->current_page_scale_factor();
|
| - return ScrollLayerWithLocalDelta(layer_impl, delta, scale_factor);
|
| + return ScrollNodeWithLocalDelta(scroll_node, delta, scale_factor,
|
| + active_tree());
|
| }
|
|
|
| -void LayerTreeHostImpl::ApplyScroll(LayerImpl* layer,
|
| +void LayerTreeHostImpl::ApplyScroll(ScrollNode* scroll_node,
|
| ScrollState* scroll_state) {
|
| DCHECK(scroll_state);
|
| gfx::Point viewport_point(scroll_state->start_position_x(),
|
| @@ -2929,7 +2940,7 @@ void LayerTreeHostImpl::ApplyScroll(LayerImpl* layer,
|
| // details.
|
| const float kEpsilon = 0.1f;
|
|
|
| - if (layer == InnerViewportScrollLayer()) {
|
| + if (scroll_node->data.is_inner_viewport_scroll_layer) {
|
| bool affect_top_controls = !wheel_scrolling_;
|
| Viewport::ScrollResult result = viewport()->ScrollBy(
|
| delta, viewport_point, scroll_state->is_direct_manipulation(),
|
| @@ -2940,15 +2951,17 @@ void LayerTreeHostImpl::ApplyScroll(LayerImpl* layer,
|
| std::abs(result.content_scrolled_delta.y()) > kEpsilon);
|
| scroll_state->ConsumeDelta(applied_delta.x(), applied_delta.y());
|
| } else {
|
| - applied_delta = ScrollLayer(layer, delta, viewport_point,
|
| - scroll_state->is_direct_manipulation());
|
| + applied_delta = ScrollSingleNode(
|
| + scroll_node, delta, viewport_point,
|
| + scroll_state->is_direct_manipulation(),
|
| + &scroll_state->layer_tree_impl()->property_trees()->scroll_tree);
|
| }
|
|
|
| // If the layer wasn't able to move, try the next one in the hierarchy.
|
| bool scrolled = std::abs(applied_delta.x()) > kEpsilon;
|
| scrolled = scrolled || std::abs(applied_delta.y()) > kEpsilon;
|
|
|
| - if (scrolled && layer != InnerViewportScrollLayer()) {
|
| + if (scrolled && !scroll_node->data.is_inner_viewport_scroll_layer) {
|
| // If the applied delta is within 45 degrees of the input
|
| // delta, bail out to make it easier to scroll just one layer
|
| // in one direction without affecting any of its parents.
|
| @@ -2969,9 +2982,7 @@ void LayerTreeHostImpl::ApplyScroll(LayerImpl* layer,
|
| if (!scrolled)
|
| return;
|
|
|
| - scroll_state->set_current_native_scrolling_node(
|
| - active_tree()->property_trees()->scroll_tree.Node(
|
| - layer->scroll_tree_index()));
|
| + scroll_state->set_current_native_scrolling_node(scroll_node);
|
| }
|
|
|
| void LayerTreeHostImpl::DistributeScrollDelta(ScrollState* scroll_state) {
|
| @@ -3085,7 +3096,6 @@ bool LayerTreeHostImpl::ScrollVerticallyByPage(const gfx::Point& viewport_point,
|
| if (scroll_node) {
|
| for (; scroll_tree.parent(scroll_node);
|
| scroll_node = scroll_tree.parent(scroll_node)) {
|
| - LayerImpl* layer_impl = active_tree_->LayerById(scroll_node->owner_id);
|
| // The inner viewport layer represents the viewport.
|
| if (!scroll_node->data.scrollable ||
|
| scroll_node->data.is_outer_viewport_scroll_layer)
|
| @@ -3103,7 +3113,7 @@ bool LayerTreeHostImpl::ScrollVerticallyByPage(const gfx::Point& viewport_point,
|
| gfx::Vector2dF delta = gfx::Vector2dF(0.f, page);
|
|
|
| gfx::Vector2dF applied_delta =
|
| - ScrollLayerWithLocalDelta(layer_impl, delta, 1.f);
|
| + ScrollNodeWithLocalDelta(scroll_node, delta, 1.f, active_tree());
|
|
|
| if (!applied_delta.IsZero()) {
|
| client_->SetNeedsCommitOnImplThread();
|
|
|