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

Unified Diff: cc/trees/layer_tree_host_impl.cc

Issue 2388563002: Clean up viewport scrolling methods in CC (Closed)
Patch Set: Fix tests Created 4 years, 2 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_host_impl.h ('k') | ui/events/blink/input_handler_proxy.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 4aa0886dfb80d80425acf157f5d0e7d8daf1e872..e2f030db3572957978629a976ba005350b1499db 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -452,8 +452,8 @@ void LayerTreeHostImpl::AnimateInternal(bool active_tree) {
if (input_handler_client_) {
// This animates fling scrolls. But on Android WebView root flings are
// controlled by the application, so the compositor does not animate them.
- bool ignore_fling = settings_.ignore_root_layer_flings &&
- IsCurrentlyScrollingInnerViewport();
+ bool ignore_fling =
+ settings_.ignore_root_layer_flings && IsCurrentlyScrollingViewport();
if (!ignore_fling) {
// This does not set did_animate, because if the InputHandlerClient
// changes anything it will be through the InputHandler interface which
@@ -542,16 +542,17 @@ void LayerTreeHostImpl::StartPageScaleAnimation(
}
void LayerTreeHostImpl::SetNeedsAnimateInput() {
- DCHECK(!IsCurrentlyScrollingInnerViewport() ||
+ DCHECK(!IsCurrentlyScrollingViewport() ||
!settings_.ignore_root_layer_flings);
SetNeedsOneBeginImplFrame();
}
-bool LayerTreeHostImpl::IsCurrentlyScrollingInnerViewport() const {
+bool LayerTreeHostImpl::IsCurrentlyScrollingViewport() const {
LayerImpl* scrolling_layer = CurrentlyScrollingLayer();
if (!scrolling_layer)
return false;
- return scrolling_layer == InnerViewportScrollLayer();
+ DCHECK(viewport());
+ return scrolling_layer == viewport()->MainScrollLayer();
}
bool LayerTreeHostImpl::IsCurrentlyScrollingLayerAt(
@@ -580,11 +581,9 @@ bool LayerTreeHostImpl::IsCurrentlyScrollingLayerAt(
return true;
// For active scrolling state treat the inner/outer viewports interchangeably.
- if ((scrolling_layer_impl == InnerViewportScrollLayer() &&
- test_layer_impl == OuterViewportScrollLayer()) ||
- (scrolling_layer_impl == OuterViewportScrollLayer() &&
- test_layer_impl == InnerViewportScrollLayer())) {
- return true;
+ if (scrolling_layer_impl == InnerViewportScrollLayer() ||
+ scrolling_layer_impl == OuterViewportScrollLayer()) {
+ return test_layer_impl == viewport()->MainScrollLayer();
}
return false;
@@ -1929,7 +1928,7 @@ bool LayerTreeHostImpl::IsActivelyScrolling() const {
// On Android WebView root flings are controlled by the application,
// so the compositor does not animate them and can't tell if they
// are actually animating. So assume there are none.
- if (settings_.ignore_root_layer_flings && IsCurrentlyScrollingInnerViewport())
+ if (settings_.ignore_root_layer_flings && IsCurrentlyScrollingViewport())
return false;
return did_lock_scrolling_layer_;
}
@@ -2551,15 +2550,14 @@ LayerImpl* LayerTreeHostImpl::FindScrollLayerForDeviceViewportPoint(
}
}
- // Falling back to the root scroll layer ensures generation of root overscroll
- // notifications. The inner viewport layer represents the viewport during
- // scrolling.
- if (!potentially_scrolling_layer_impl)
- potentially_scrolling_layer_impl = InnerViewportScrollLayer();
-
- // The inner viewport layer represents the viewport.
- if (potentially_scrolling_layer_impl == OuterViewportScrollLayer())
- potentially_scrolling_layer_impl = InnerViewportScrollLayer();
+ // Falling back to the viewport layer ensures generation of root overscroll
+ // notifications. We use the viewport's main scroll layer to represent the
+ // viewport in scrolling code.
+ if (!potentially_scrolling_layer_impl ||
+ potentially_scrolling_layer_impl == OuterViewportScrollLayer() ||
+ potentially_scrolling_layer_impl == InnerViewportScrollLayer()) {
+ potentially_scrolling_layer_impl = viewport()->MainScrollLayer();
+ }
if (potentially_scrolling_layer_impl) {
// Ensure that final layer scrolls on impl thread (crbug.com/625100)
@@ -2636,7 +2634,8 @@ InputHandler::ScrollStatus LayerTreeHostImpl::RootScrollBegin(
ClearCurrentlyScrollingLayer();
- return ScrollBeginImpl(scroll_state, InnerViewportScrollLayer(), type);
+ DCHECK(viewport());
+ return ScrollBeginImpl(scroll_state, viewport()->MainScrollLayer(), type);
}
InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBegin(
@@ -2987,7 +2986,11 @@ void LayerTreeHostImpl::ApplyScroll(ScrollNode* scroll_node,
// details.
const float kEpsilon = 0.1f;
- if (scroll_node->is_inner_viewport_scroll_layer) {
+ bool is_viewport_scroll_layer =
+ viewport()->MainScrollLayer() &&
+ scroll_node->owner_id == viewport()->MainScrollLayer()->id();
+
+ if (is_viewport_scroll_layer) {
bool affect_top_controls = !wheel_scrolling_;
Viewport::ScrollResult result = viewport()->ScrollBy(
delta, viewport_point, scroll_state->is_direct_manipulation(),
@@ -3008,7 +3011,7 @@ void LayerTreeHostImpl::ApplyScroll(ScrollNode* scroll_node,
bool scrolled = std::abs(applied_delta.x()) > kEpsilon;
scrolled = scrolled || std::abs(applied_delta.y()) > kEpsilon;
- if (scrolled && !scroll_node->is_inner_viewport_scroll_layer) {
+ if (scrolled && !is_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.
@@ -3044,12 +3047,16 @@ void LayerTreeHostImpl::DistributeScrollDelta(ScrollState* scroll_state) {
for (; scroll_tree.parent(scroll_node);
scroll_node = scroll_tree.parent(scroll_node)) {
if (scroll_node->is_outer_viewport_scroll_layer) {
+ // TODO(bokan): This should use Viewport::MainScrollLayer once that
+ // returns the outer viewport scroll layer.
// Don't chain scrolls past the outer viewport scroll layer. Once we
- // reach that, we should scroll the viewport, which is represented by
- // the inner viewport scroll layer.
- ScrollNode* inner_viewport_scroll_node =
- scroll_tree.Node(InnerViewportScrollLayer()->scroll_tree_index());
- current_scroll_chain.push_front(inner_viewport_scroll_node);
+ // reach that, we should scroll the viewport which is represented by the
+ // main viewport scroll layer.
+ DCHECK(viewport()->MainScrollLayer());
+ ScrollNode* viewport_scroll_node = scroll_tree.Node(
+ viewport()->MainScrollLayer()->scroll_tree_index());
+ DCHECK(viewport_scroll_node);
+ current_scroll_chain.push_front(viewport_scroll_node);
break;
}
@@ -3245,6 +3252,7 @@ void LayerTreeHostImpl::MouseMoveAt(const gfx::Point& viewport_point) {
LayerImpl* scroll_layer_impl = FindScrollLayerForDeviceViewportPoint(
device_viewport_point, InputHandler::TOUCHSCREEN, layer_impl,
&scroll_on_main_thread, &main_thread_scrolling_reasons);
+ // Scrollbars for the viewport are registered with the outer viewport layer.
if (scroll_layer_impl == InnerViewportScrollLayer())
scroll_layer_impl = OuterViewportScrollLayer();
if (scroll_on_main_thread || !scroll_layer_impl)
@@ -3293,8 +3301,7 @@ void LayerTreeHostImpl::PinchGestureBegin() {
pinch_gesture_active_ = true;
client_->RenewTreePriority();
pinch_gesture_end_should_clear_scrolling_layer_ = !CurrentlyScrollingLayer();
- active_tree_->SetCurrentlyScrollingLayer(
- active_tree_->InnerViewportScrollLayer());
+ active_tree_->SetCurrentlyScrollingLayer(viewport()->MainScrollLayer());
top_controls_manager_->PinchBegin();
}
@@ -3372,27 +3379,6 @@ void LayerTreeHostImpl::SetFullViewportDamage() {
SetViewportDamage(gfx::Rect(DrawViewportSize()));
}
-void LayerTreeHostImpl::ScrollViewportInnerFirst(gfx::Vector2dF scroll_delta) {
- DCHECK(InnerViewportScrollLayer());
- LayerImpl* scroll_layer = InnerViewportScrollLayer();
-
- gfx::Vector2dF unused_delta = scroll_layer->ScrollBy(scroll_delta);
- if (!unused_delta.IsZero() && OuterViewportScrollLayer())
- OuterViewportScrollLayer()->ScrollBy(unused_delta);
-}
-
-void LayerTreeHostImpl::ScrollViewportBy(gfx::Vector2dF scroll_delta) {
- DCHECK(InnerViewportScrollLayer());
- LayerImpl* scroll_layer = OuterViewportScrollLayer()
- ? OuterViewportScrollLayer()
- : InnerViewportScrollLayer();
-
- gfx::Vector2dF unused_delta = scroll_layer->ScrollBy(scroll_delta);
-
- if (!unused_delta.IsZero() && (scroll_layer == OuterViewportScrollLayer()))
- InnerViewportScrollLayer()->ScrollBy(unused_delta);
-}
-
bool LayerTreeHostImpl::AnimatePageScale(base::TimeTicks monotonic_time) {
if (!page_scale_animation_)
return false;
@@ -3407,7 +3393,8 @@ bool LayerTreeHostImpl::AnimatePageScale(base::TimeTicks monotonic_time) {
gfx::ScrollOffset next_scroll = gfx::ScrollOffset(
page_scale_animation_->ScrollOffsetAtTime(monotonic_time));
- ScrollViewportInnerFirst(next_scroll.DeltaFrom(scroll_total));
+ DCHECK(viewport());
+ viewport()->ScrollByInnerFirst(next_scroll.DeltaFrom(scroll_total));
if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) {
page_scale_animation_ = nullptr;
@@ -3435,8 +3422,8 @@ bool LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) {
if (scroll.IsZero())
return false;
- ScrollViewportBy(gfx::ScaleVector2d(
- scroll, 1.f / active_tree_->current_page_scale_factor()));
+ DCHECK(viewport());
+ viewport()->ScrollBy(scroll, gfx::Point(), false, false);
client_->SetNeedsCommitOnImplThread();
client_->RenewTreePriority();
return true;
@@ -3520,6 +3507,8 @@ void LayerTreeHostImpl::UnregisterScrollbarAnimationController(
ScrollbarAnimationController*
LayerTreeHostImpl::ScrollbarAnimationControllerForId(
int scroll_layer_id) const {
+ // The viewport layers have only one set of scrollbars and their controller
+ // is registered with the outer viewport.
if (InnerViewportScrollLayer() && OuterViewportScrollLayer() &&
scroll_layer_id == InnerViewportScrollLayer()->id())
scroll_layer_id = OuterViewportScrollLayer()->id();
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | ui/events/blink/input_handler_proxy.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698