Commit 8e4f51d5 authored by Thomas Lukaszewicz's avatar Thomas Lukaszewicz Committed by Commit Bot

Fixed inconsistent behavior of MenuButtonController.

Fixed the trigger check for MenuButtonController so that it always
checks to see if a given menu triggering event is valid during an
OnMousePressed event.

Previously the timing check was made during either OnMousePressed or
OnMouseReleased. If the check was made during OnMouseReleased the
event may or may not have registered as a triggering event based on
the timing of the action (ie long press of the button), resulting in
inconsistent behaviour.

Bug: 1036441
Change-Id: I566fae882b7ef0e7c69a1359237b11f7c4a3d53d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2013747
Commit-Queue: Peter Kasting <pkasting@chromium.org>
Reviewed-by: default avatarPeter Kasting <pkasting@chromium.org>
Cr-Commit-Position: refs/heads/master@{#734158}
parent bfc04647
......@@ -89,12 +89,22 @@ MenuButtonController::MenuButtonController(
MenuButtonController::~MenuButtonController() = default;
bool MenuButtonController::OnMousePressed(const ui::MouseEvent& event) {
// Sets true if the amount of time since the last |menu_closed_time_| is
// large enough for the current event to be considered an intentionally
// different event.
is_intentional_menu_trigger_ =
(TimeTicks::Now() - menu_closed_time_) >= kMinimumTimeBetweenButtonClicks;
if (button()->request_focus_on_press())
button()->RequestFocus();
if (button()->state() != Button::STATE_DISABLED &&
button()->HitTestPoint(event.location()) && IsTriggerableEvent(event)) {
return Activate(&event);
}
// If this is an unintentional trigger do not display the inkdrop.
if (!is_intentional_menu_trigger_)
button()->AnimateInkDrop(InkDropState::HIDDEN, &event);
return true;
}
......@@ -184,7 +194,7 @@ void MenuButtonController::OnStateChanged(LabelButton::ButtonState old_state) {
bool MenuButtonController::IsTriggerableEvent(const ui::Event& event) {
return ButtonController::IsTriggerableEvent(event) &&
IsTriggerableEventType(event) && IsIntentionalMenuTrigger();
IsTriggerableEventType(event) && is_intentional_menu_trigger_;
}
void MenuButtonController::OnGestureEvent(ui::GestureEvent* event) {
......@@ -290,11 +300,6 @@ bool MenuButtonController::IsTriggerableEventType(const ui::Event& event) {
return event.type() == ui::ET_GESTURE_TAP;
}
bool MenuButtonController::IsIntentionalMenuTrigger() const {
return (TimeTicks::Now() - menu_closed_time_) >=
kMinimumTimeBetweenButtonClicks;
}
void MenuButtonController::IncrementPressedLocked(
bool snap_ink_drop_to_activated,
const ui::LocatedEvent* event) {
......
......@@ -77,10 +77,6 @@ class VIEWS_EXPORT MenuButtonController : public ButtonController {
// menu, this is distinct from IsTriggerableEvent().
bool IsTriggerableEventType(const ui::Event& event);
// Returns true if the amount of time since the last menu_closed_time_ is
// large enough to be considered an intentionally different event.
bool IsIntentionalMenuTrigger() const;
private:
// Increment/decrement the number of "pressed" locks this button has, and
// set the state accordingly. The ink drop is snapped to the final ACTIVATED
......@@ -103,6 +99,9 @@ class VIEWS_EXPORT MenuButtonController : public ButtonController {
// Windows, the button is not part of the displayed menu.
base::TimeTicks menu_closed_time_;
// Tracks if the current triggering event should open a menu.
bool is_intentional_menu_trigger_ = true;
// The current number of "pressed" locks this button has.
int pressed_lock_count_ = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment