Index: ui/views/controls/menu/menu_controller.cc |
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc |
index cae826f46607a06da30b946d49b0ec98578cb9e4..e057ab26c28f96acc64b364a242c642583451674 100644 |
--- a/ui/views/controls/menu/menu_controller.cc |
+++ b/ui/views/controls/menu/menu_controller.cc |
@@ -679,6 +679,15 @@ void MenuController::OnGestureEvent(SubmenuView* source, |
part.submenu->OnGestureEvent(event); |
} |
+void MenuController::OnTouchEvent(SubmenuView* source, ui::TouchEvent* event) { |
+ if (event->type() == ui::ET_TOUCH_PRESSED) { |
+ MenuPart part = GetMenuPart(source, event->location()); |
+ if (part.type == MenuPart::NONE) { |
+ RepostEvent(source, *event); |
sky
2016/01/12 21:16:42
If you repostevent don't you need to stop propagat
ananta
2016/01/13 01:21:24
Done.
|
+ } |
+ } |
+} |
+ |
View* MenuController::GetTooltipHandlerForPoint(SubmenuView* source, |
const gfx::Point& point) { |
MenuHostRootView* root_view = GetRootView(source, point); |
@@ -970,8 +979,9 @@ void MenuController::SetSelection(MenuItemView* menu_item, |
} |
} |
+template<class EventType> |
void MenuController::SetSelectionOnPointerDown(SubmenuView* source, |
- const ui::LocatedEvent& event) { |
+ const EventType& event) { |
if (!blocking_run_) |
return; |
@@ -2182,9 +2192,10 @@ void MenuController::SelectByChar(base::char16 character) { |
} |
} |
+template<class EventType> |
void MenuController::RepostEvent(SubmenuView* source, |
- const ui::LocatedEvent& event) { |
- if (!event.IsMouseEvent()) { |
+ const EventType& event) { |
+ if (!event.IsMouseEvent() && !event.IsTouchEvent()) { |
// TODO(rbyers): Gesture event repost is tricky to get right |
// crbug.com/170987. |
DCHECK(event.IsGestureEvent()); |
@@ -2218,8 +2229,8 @@ void MenuController::RepostEvent(SubmenuView* source, |
// coordinates to be in pixels. |
// PostMessage() to metro windows isn't allowed (access will be denied). Don't |
// try to repost with Win32 if the window under the mouse press is in metro. |
- if (!ViewsDelegate::GetInstance() || |
- !ViewsDelegate::GetInstance()->IsWindowInMetro(window)) { |
+ if (event.IsMouseEvent() && (!ViewsDelegate::GetInstance() || |
+ !ViewsDelegate::GetInstance()->IsWindowInMetro(window))) { |
gfx::Point screen_loc_pixels = gfx::win::DIPToScreenPoint(screen_loc); |
HWND target_window = window ? HWNDForNativeWindow(window) : |
WindowFromPoint(screen_loc_pixels.ToPOINT()); |
@@ -2275,7 +2286,16 @@ void MenuController::RepostEvent(SubmenuView* source, |
if (!window) |
return; |
- MenuMessageLoop::RepostEventToWindow(event, window, screen_loc); |
+ if (event.IsTouchEvent()) { |
+ // Handle touch events in a posted task, as we don't want them to get |
+ // dispatched in the context of the menu message pump. |
+ base::MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&MenuMessageLoop::RepostEventToWindow<EventType>, |
sky
2016/01/12 21:16:42
RepostEventtoWindow() should post after a delay. Y
ananta
2016/01/13 01:21:24
Done.
|
+ event, window, screen_loc)); |
+ } else { |
+ MenuMessageLoop::RepostEventToWindow(event, window, screen_loc); |
+ } |
} |
void MenuController::SetDropMenuItem( |