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

Side by Side Diff: ui/views/widget/root_view.cc

Issue 10790019: Add gesture target fuzzing to views (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: New approach using GetEventHandlerForRect Created 8 years, 5 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 unified diff | Download patch
« ui/views/view.cc ('K') | « ui/views/view_constants.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/views/widget/root_view.h" 5 #include "ui/views/widget/root_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 return status; 445 return status;
446 } 446 }
447 447
448 // Reset touch_pressed_handler_ to indicate that no processing is occurring. 448 // Reset touch_pressed_handler_ to indicate that no processing is occurring.
449 touch_pressed_handler_ = NULL; 449 touch_pressed_handler_ = NULL;
450 450
451 return status; 451 return status;
452 } 452 }
453 453
454 ui::GestureStatus RootView::OnGestureEvent(const GestureEvent& event) { 454 ui::GestureStatus RootView::OnGestureEvent(const GestureEvent& event) {
455 GestureEvent e(event, this);
sadrul 2012/07/18 23:42:31 This creates an event to take RootView's transform
tdanderson 2012/07/25 23:08:57 Okay, I will put |e| back in for this CL.
456 ui::GestureStatus status = ui::GESTURE_STATUS_UNKNOWN; 455 ui::GestureStatus status = ui::GESTURE_STATUS_UNKNOWN;
457 456
457 // TODO(tdanderson): Store radius values for a ui::ET_GESTURE_LONG_PRESS
458 // event so that fuzzing may also be used for a long press.
459 if (event.type() == ui::ET_GESTURE_TAP) {
460 float radius = event.details().radius_x();
461 gfx::Point adjusted_loc(event.x() - radius, event.y() - radius);
462 ConvertPointToScreen(this, &adjusted_loc);
463 gfx::Rect touch_rect(adjusted_loc.x(),
464 adjusted_loc.y(),
465 radius * 2,
466 radius * 2);
467
468 // If |new_gesture_handler| is not NULL, it should handle the tap event.
469 // Screen coordinates are used to eliminate the overhead of switching
470 // between parent/child coordinate systems in View::GetEventHandlerForRect.
471 View* new_gesture_handler = GetEventHandlerForRect(touch_rect);
472 if (new_gesture_handler) {
473 if (!gesture_handler_)
sadrul 2012/07/18 23:42:31 brace
tdanderson 2012/07/25 23:08:57 Done.
474 gesture_handler_ = new_gesture_handler;
475 else if (gesture_handler_ != new_gesture_handler) {
476 // Send an ET_GESTURE_END event to the original handler
477 GestureEvent end_event(ui::ET_GESTURE_END,
478 event.x(),
479 event.y(),
480 event.flags());
481 gesture_handler_->ProcessGestureEvent(end_event);
482
483 // Send ET_GESTURE_BEGIN and ET_GESTURE_TAP_DOWN events to the new
484 // handler before processing the ET_GESTURE_TAP event.
485 gfx::Rect new_handler_bounds(new_gesture_handler->GetScreenBounds());
486 gfx::Point new_center(new_handler_bounds.CenterPoint());
487 ConvertPointFromScreen(this, &new_center);
488 GestureEvent begin_event(ui::ET_GESTURE_BEGIN,
tdanderson 2012/07/18 22:35:42 sadrul@: you mentioned that I should make sure the
sadrul 2012/07/18 23:42:31 Yes. You need to update GestureEvent::details_ to
tdanderson 2012/07/25 23:08:57 This will no longer be relevant in the next CL.
489 new_center.x(),
490 new_center.y(),
491 event.flags());
492 new_gesture_handler->ProcessGestureEvent(begin_event);
493 GestureEvent tap_down_event(ui::ET_GESTURE_TAP_DOWN,
494 new_center.x(),
495 new_center.y(),
496 event.flags());
497 new_gesture_handler->ProcessGestureEvent(tap_down_event);
498
499 gesture_handler_ = new_gesture_handler;
500 }
501 }
502 }
503
458 if (gesture_handler_) { 504 if (gesture_handler_) {
459 // |gesture_handler_| (or |scroll_gesture_handler_|) can be deleted during 505 // |gesture_handler_| (or |scroll_gesture_handler_|) can be deleted during
460 // processing. 506 // processing.
461 View* handler = event.IsScrollGestureEvent() && scroll_gesture_handler_ ? 507 View* handler = event.IsScrollGestureEvent() && scroll_gesture_handler_ ?
462 scroll_gesture_handler_ : gesture_handler_; 508 scroll_gesture_handler_ : gesture_handler_;
463 GestureEvent handler_event(event, this, handler); 509 GestureEvent handler_event(event, this, handler);
464 510
465 ui::GestureStatus status = handler->ProcessGestureEvent(handler_event); 511 ui::GestureStatus status = handler->ProcessGestureEvent(handler_event);
466 512
467 if (event.type() == ui::ET_GESTURE_END && 513 if (event.type() == ui::ET_GESTURE_END &&
(...skipping 10 matching lines...) Expand all
478 524
479 if (event.type() == ui::ET_GESTURE_SCROLL_BEGIN && 525 if (event.type() == ui::ET_GESTURE_SCROLL_BEGIN &&
480 !scroll_gesture_handler_) { 526 !scroll_gesture_handler_) {
481 // Some view started processing gesture events, however it does not 527 // Some view started processing gesture events, however it does not
482 // process scroll-gesture events. In such case, we allow the event to 528 // process scroll-gesture events. In such case, we allow the event to
483 // bubble up, and install a different scroll-gesture handler different 529 // bubble up, and install a different scroll-gesture handler different
484 // from the default gesture handler. 530 // from the default gesture handler.
485 for (scroll_gesture_handler_ = gesture_handler_->parent(); 531 for (scroll_gesture_handler_ = gesture_handler_->parent();
486 scroll_gesture_handler_ && scroll_gesture_handler_ != this; 532 scroll_gesture_handler_ && scroll_gesture_handler_ != this;
487 scroll_gesture_handler_ = scroll_gesture_handler_->parent()) { 533 scroll_gesture_handler_ = scroll_gesture_handler_->parent()) {
488 GestureEvent gesture_event(e, this, scroll_gesture_handler_); 534 GestureEvent gesture_event(event, this, scroll_gesture_handler_);
489 status = scroll_gesture_handler_->ProcessGestureEvent(gesture_event); 535 status = scroll_gesture_handler_->ProcessGestureEvent(gesture_event);
490 if (status == ui::GESTURE_STATUS_CONSUMED) 536 if (status == ui::GESTURE_STATUS_CONSUMED)
491 return status; 537 return status;
492 } 538 }
493 scroll_gesture_handler_ = NULL; 539 scroll_gesture_handler_ = NULL;
494 } 540 }
495 541
496 return ui::GESTURE_STATUS_UNKNOWN; 542 return ui::GESTURE_STATUS_UNKNOWN;
543
sadrul 2012/07/18 23:42:31 -
tdanderson 2012/07/25 23:08:57 Done.
497 } 544 }
498 545
499 // Walk up the tree until we find a view that wants the gesture event. 546 // Walk up the tree until we find a view that wants the gesture event.
500 for (gesture_handler_ = GetEventHandlerForPoint(e.location()); 547 for (gesture_handler_ = GetEventHandlerForPoint(event.location());
501 gesture_handler_ && (gesture_handler_ != this); 548 gesture_handler_ && (gesture_handler_ != this);
502 gesture_handler_ = gesture_handler_->parent()) { 549 gesture_handler_ = gesture_handler_->parent()) {
503 if (!gesture_handler_->enabled()) { 550 if (!gesture_handler_->enabled()) {
504 // Disabled views eat events but are treated as not handled. 551 // Disabled views eat events but are treated as not handled.
505 return ui::GESTURE_STATUS_UNKNOWN; 552 return ui::GESTURE_STATUS_UNKNOWN;
506 } 553 }
507 554
508 // See if this view wants to handle the Gesture. 555 // See if this view wants to handle the Gesture.
509 GestureEvent gesture_event(e, this, gesture_handler_); 556 GestureEvent gesture_event(event, this, gesture_handler_);
510 status = gesture_handler_->ProcessGestureEvent(gesture_event); 557 status = gesture_handler_->ProcessGestureEvent(gesture_event);
511 558
512 // The view could have removed itself from the tree when handling 559 // The view could have removed itself from the tree when handling
513 // OnGestureEvent(). So handle as per OnMousePressed. NB: we 560 // OnGestureEvent(). So handle as per OnMousePressed. NB: we
514 // assume that the RootView itself cannot be so removed. 561 // assume that the RootView itself cannot be so removed.
515 if (!gesture_handler_) 562 if (!gesture_handler_)
516 return ui::GESTURE_STATUS_UNKNOWN; 563 return ui::GESTURE_STATUS_UNKNOWN;
517 564
518 if (status == ui::GESTURE_STATUS_CONSUMED) { 565 if (status == ui::GESTURE_STATUS_CONSUMED) {
519 if (gesture_event.type() == ui::ET_GESTURE_SCROLL_BEGIN) 566 if (gesture_event.type() == ui::ET_GESTURE_SCROLL_BEGIN)
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 } 646 }
600 647
601 void RootView::SetMouseLocationAndFlags(const MouseEvent& event) { 648 void RootView::SetMouseLocationAndFlags(const MouseEvent& event) {
602 last_mouse_event_flags_ = event.flags(); 649 last_mouse_event_flags_ = event.flags();
603 last_mouse_event_x_ = event.x(); 650 last_mouse_event_x_ = event.x();
604 last_mouse_event_y_ = event.y(); 651 last_mouse_event_y_ = event.y();
605 } 652 }
606 653
607 } // namespace internal 654 } // namespace internal
608 } // namespace views 655 } // namespace views
OLDNEW
« ui/views/view.cc ('K') | « ui/views/view_constants.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698