| Index: views/controls/menu/menu_controller.cc
|
| diff --git a/views/controls/menu/menu_controller.cc b/views/controls/menu/menu_controller.cc
|
| index 84433b5e8bb358bb75b7f162f11371c93c3b512e..3269c62b2d4c2bf5308ee50107b9c63be64628be 100644
|
| --- a/views/controls/menu/menu_controller.cc
|
| +++ b/views/controls/menu/menu_controller.cc
|
| @@ -24,11 +24,11 @@
|
| #include "views/widget/root_view.h"
|
| #include "views/widget/widget.h"
|
|
|
| -#if defined(USE_AURA) && !defined(OS_WIN)
|
| +#if defined(USE_AURA)
|
| #include "ui/aura/desktop.h"
|
| #endif
|
|
|
| -#if defined(OS_LINUX)
|
| +#if defined(TOOLKIT_USES_GTK)
|
| #include "ui/base/keycodes/keyboard_code_conversion_gtk.h"
|
| #endif
|
|
|
| @@ -348,7 +348,7 @@ MenuItemView* MenuController::Run(Widget* parent,
|
| *result_mouse_event_flags = result_mouse_event_flags_;
|
|
|
| if (exit_type_ == EXIT_OUTERMOST) {
|
| - exit_type_ = EXIT_NONE;
|
| + SetExitType(EXIT_NONE);
|
| } else {
|
| if (nested_menu && result) {
|
| // We're nested and about to return a value. The caller might enter
|
| @@ -359,7 +359,7 @@ MenuItemView* MenuController::Run(Widget* parent,
|
|
|
| // Set exit_all_, which makes sure all nested loops exit immediately.
|
| if (exit_type_ != EXIT_DESTROYED)
|
| - exit_type_ = EXIT_ALL;
|
| + SetExitType(EXIT_ALL);
|
| }
|
| }
|
|
|
| @@ -387,7 +387,7 @@ void MenuController::Cancel(ExitType type) {
|
| }
|
|
|
| MenuItemView* selected = state_.item;
|
| - exit_type_ = type;
|
| + SetExitType(type);
|
|
|
| SendMouseCaptureLostToActiveView();
|
|
|
| @@ -426,7 +426,7 @@ void MenuController::OnMousePressed(SubmenuView* source,
|
| // We're going to close and we own the mouse capture. We need to repost the
|
| // mouse down, otherwise the window the user clicked on won't get the
|
| // event.
|
| -#if defined(OS_WIN)
|
| +#if defined(OS_WIN) && !defined(USE_AURA)
|
| RepostEvent(source, event);
|
| // NOTE: not reposting on linux seems fine.
|
| #endif
|
| @@ -720,7 +720,7 @@ int MenuController::OnPerformDrop(SubmenuView* source,
|
|
|
| // Set state such that we exit.
|
| showing_ = false;
|
| - exit_type_ = EXIT_ALL;
|
| + SetExitType(EXIT_ALL);
|
|
|
| // If over an empty menu item, drop occurs on the parent.
|
| if (drop_target->id() == MenuItemView::kEmptyMenuItemViewID)
|
| @@ -1101,9 +1101,9 @@ void MenuController::Accept(MenuItemView* item, int mouse_event_flags) {
|
| result_ = item;
|
| if (item && !menu_stack_.empty() &&
|
| !item->GetDelegate()->ShouldCloseAllMenusOnExecute(item->GetCommand())) {
|
| - exit_type_ = EXIT_OUTERMOST;
|
| + SetExitType(EXIT_OUTERMOST);
|
| } else {
|
| - exit_type_ = EXIT_ALL;
|
| + SetExitType(EXIT_ALL);
|
| }
|
| result_mouse_event_flags_ = mouse_event_flags;
|
| }
|
| @@ -1782,12 +1782,7 @@ bool MenuController::SelectByChar(char16 character) {
|
| return false;
|
| }
|
|
|
| -#if defined(OS_WIN)
|
| -#if defined(USE_AURA)
|
| -void MenuController::RepostEvent(SubmenuView* source,
|
| - const MouseEvent& event) {
|
| -}
|
| -#else
|
| +#if defined(OS_WIN) && !defined(USE_AURA)
|
| void MenuController::RepostEvent(SubmenuView* source,
|
| const MouseEvent& event) {
|
| if (!state_.item) {
|
| @@ -1854,7 +1849,6 @@ void MenuController::RepostEvent(SubmenuView* source,
|
| }
|
| }
|
| }
|
| -#endif // !defined(USE_AURA)
|
| #endif // defined(OS_WIN)
|
|
|
| void MenuController::SetDropMenuItem(
|
| @@ -1961,4 +1955,17 @@ void MenuController::SendMouseCaptureLostToActiveView() {
|
| active_view->OnMouseCaptureLost();
|
| }
|
|
|
| +void MenuController::SetExitType(ExitType type) {
|
| + exit_type_ = type;
|
| +#if defined(USE_AURA)
|
| + // On aura, closing menu may not trigger next native event, which
|
| + // is necessary to exit from nested loop (See Dispatch methods).
|
| + // Send non-op event so that Dispatch method will always be called.
|
| + // crbug.com/104684.
|
| + if (exit_type_ == EXIT_ALL || exit_type_ == EXIT_DESTROYED)
|
| + aura::Desktop::GetInstance()->PostNativeEvent(ui::CreateNoopEvent());
|
| +#endif
|
| +}
|
| +
|
| +
|
| } // namespace views
|
|
|