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

Unified Diff: cc/trees/layer_tree_host_impl.cc

Issue 2471523002: Make touch events uncancelable during fling when they are on the current active scroll layer (Closed)
Patch Set: clean up code Created 4 years, 1 month 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
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 ead5db73d6b313687d5e2193cc69a19024c1293d..c8104e97930bdd04bcf6df2e72d7c2a1c65cb23d 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -155,6 +155,22 @@ void RecordCompositorSlowScrollMetric(InputHandler::ScrollInputType type,
}
}
+// Similar to LayerImpl::HasAncestor, but walks up the scroll parents.
+static bool HasScrollAncestor(LayerImpl* child, LayerImpl* scroll_ancestor) {
+ DCHECK(scroll_ancestor);
+ if (!child)
+ return false;
+ ScrollTree& scroll_tree =
+ child->layer_tree_impl()->property_trees()->scroll_tree;
+ ScrollNode* scroll_node = scroll_tree.Node(child->scroll_tree_index());
+ for (; scroll_tree.parent(scroll_node);
bokan 2016/11/04 19:32:55 This will avoid comparing against the root layer.
+ scroll_node = scroll_tree.parent(scroll_node)) {
+ if (scroll_node->scrollable)
+ return scroll_node->owner_id == scroll_ancestor->id();
+ }
+ return false;
+}
+
} // namespace
DEFINE_SCOPED_UMA_HISTOGRAM_TIMER(PendingTreeDurationHistogramTimer,
@@ -591,7 +607,7 @@ EventListenerProperties LayerTreeHostImpl::GetEventListenerProperties(
return active_tree_->event_listener_properties(event_class);
}
-bool LayerTreeHostImpl::DoTouchEventsBlockScrollAt(
+InputHandler::TouchStartHitResult LayerTreeHostImpl::DoTouchEventsBlockScrollAt(
const gfx::Point& viewport_point) {
gfx::PointF device_viewport_point = gfx::ScalePoint(
gfx::PointF(viewport_point), active_tree_->device_scale_factor());
@@ -601,7 +617,16 @@ bool LayerTreeHostImpl::DoTouchEventsBlockScrollAt(
LayerImpl* layer_impl =
active_tree_->FindLayerThatIsHitByPointInTouchHandlerRegion(
device_viewport_point);
- return layer_impl != NULL;
+ if (layer_impl == NULL)
+ return TouchStartHitResult::HANDLER;
+
+ if (!CurrentlyScrollingLayer())
+ return TouchStartHitResult::SAME_LAYER;
tdresser 2016/11/04 17:15:20 I don't understand this, but I might just be confu
bokan 2016/11/04 19:32:55 +1, I don't know what these returns mean.
+
+ bool is_ancestor =
+ HasScrollAncestor(layer_impl, active_tree_->CurrentlyScrollingLayer());
bokan 2016/11/04 19:32:55 What should happen if layer_impl == CurrentlyScrol
+ return is_ancestor ? TouchStartHitResult::SAME_LAYER
+ : TouchStartHitResult::DIFFERENT_LAYER;
}
std::unique_ptr<SwapPromiseMonitor>
@@ -2575,22 +2600,6 @@ LayerImpl* LayerTreeHostImpl::FindScrollLayerForDeviceViewportPoint(
return potentially_scrolling_layer_impl;
}
-// Similar to LayerImpl::HasAncestor, but walks up the scroll parents.
-static bool HasScrollAncestor(LayerImpl* child, LayerImpl* scroll_ancestor) {
- DCHECK(scroll_ancestor);
- if (!child)
- return false;
- ScrollTree& scroll_tree =
- child->layer_tree_impl()->property_trees()->scroll_tree;
- ScrollNode* scroll_node = scroll_tree.Node(child->scroll_tree_index());
- for (; scroll_tree.parent(scroll_node);
- scroll_node = scroll_tree.parent(scroll_node)) {
- if (scroll_node->scrollable)
- return scroll_node->owner_id == scroll_ancestor->id();
- }
- return false;
-}
-
InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBeginImpl(
ScrollState* scroll_state,
LayerImpl* scrolling_layer_impl,
@@ -2685,7 +2694,6 @@ InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBegin(
if (scroll_on_main_thread) {
RecordCompositorSlowScrollMetric(type, MAIN_THREAD);
-
scroll_status.thread = SCROLL_ON_MAIN_THREAD;
return scroll_status;
}

Powered by Google App Engine
This is Rietveld 408576698