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

Unified Diff: ui/views/widget/root_view.cc

Issue 472303004: Do not dispatch gesture events to disabled views (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 | « no previous file | ui/views/widget/root_view_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/widget/root_view.cc
diff --git a/ui/views/widget/root_view.cc b/ui/views/widget/root_view.cc
index 627b845b5364966d3649c5822823351cf3696f28..0860fe07144363334cb5151a85cce4324a3ba452 100644
--- a/ui/views/widget/root_view.cc
+++ b/ui/views/widget/root_view.cc
@@ -639,6 +639,24 @@ View::DragInfo* RootView::GetDragInfo() {
void RootView::DispatchGestureEvent(ui::GestureEvent* event) {
if (gesture_handler_) {
+ // Disabled views are permitted to be targets of gesture events, but
+ // gesture events should never actually be dispatched to them.
+ if (!gesture_handler_->enabled()) {
+ event->SetHandled();
sadrul 2014/08/15 18:58:52 the indent here seems off
tdanderson 2014/08/15 20:21:50 Done.
+
+ if (event->type() == ui::ET_GESTURE_END) {
+ DCHECK_EQ(1, event->details().touch_points());
+ // In case a drag was in progress, reset all the handlers. Otherwise,
+ // just reset the gesture handler.
+ if (gesture_handler_ == mouse_pressed_handler_)
+ SetMouseHandler(NULL);
+ else
+ gesture_handler_ = NULL;
+ }
sadrul 2014/08/15 18:58:52 Can you combine this block with the code below in
tdanderson 2014/08/15 20:21:50 Done. (I didn't do this originally because the pla
+
+ return;
+ }
+
// |gesture_handler_| can be deleted during processing. In particular, it
// will be set to NULL if the view is deleted or removed from the tree as
// a result of an event dispatch.
@@ -715,9 +733,19 @@ void RootView::DispatchGestureEvent(ui::GestureEvent* event) {
for (gesture_handler_ = gesture_handler;
gesture_handler_ && (gesture_handler_ != this);
gesture_handler_ = gesture_handler_->parent()) {
- // Disabled views eat events but are treated as not handled.
- if (!gesture_handler_->enabled())
+ // Disabled views are permitted to be targets of gesture events, but
+ // gesture events should never actually be dispatched to them.
+ if (!gesture_handler_->enabled()) {
+ event->SetHandled();
+
+ // Last ui::ET_GESTURE_END should not set the gesture_handler_.
+ if (event->type() == ui::ET_GESTURE_END) {
+ DCHECK_EQ(1, event->details().touch_points());
+ gesture_handler_ = NULL;
+ }
+
return;
+ }
// See if this view wants to handle the Gesture.
ui::GestureEvent gesture_event(*event,
« no previous file with comments | « no previous file | ui/views/widget/root_view_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698