Chromium Code Reviews| 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 3e279d9ba70224ddff88d00610c30616e2586e4b..3b0d3b705c0edea76ef4fea023a2db9bb42c4e93 100644 |
| --- a/ui/views/controls/menu/menu_controller.cc |
| +++ b/ui/views/controls/menu/menu_controller.cc |
| @@ -418,12 +418,7 @@ void MenuController::Cancel(ExitType type) { |
| // WARNING: the call to MenuClosed deletes us. |
| return; |
| } |
| - if (async_run_) { |
| - internal::MenuControllerDelegate* delegate = delegate_; |
| - MenuItemView* result = ExitMenuRun(); |
| - delegate->OnMenuClosed(internal::MenuControllerDelegate::NOTIFY_DELEGATE, |
| - result, accept_event_flags_); |
| - } |
| + ExitAsyncRun(); |
| } |
| void MenuController::AddNestedDelegate( |
| @@ -857,6 +852,8 @@ void MenuController::OnDragComplete(bool should_close) { |
| if (showing_ && should_close && GetActiveInstance() == this) { |
| CloseAllNestedMenus(); |
| Cancel(EXIT_ALL); |
| + } else if (async_run_) { |
| + ExitAsyncRun(); |
| } |
| } |
| @@ -1072,7 +1069,8 @@ void MenuController::StartDrag(SubmenuView* source, |
| // TODO(varunjain): Properly determine and send DRAG_EVENT_SOURCE below. |
| item->GetWidget()->RunShellDrag(NULL, data, widget_loc, drag_ops, |
| ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE); |
| - did_initiate_drag_ = false; |
| + if (GetActiveInstance()) |
|
sky
2016/01/11 20:56:04
Please add a comment as to why this check is neces
jonross
2016/01/11 21:27:15
Done.
|
| + did_initiate_drag_ = false; |
| } |
| void MenuController::OnKeyDown(ui::KeyboardCode key_code) { |
| @@ -1275,12 +1273,7 @@ void MenuController::Accept(MenuItemView* item, int event_flags) { |
| SetExitType(EXIT_ALL); |
| } |
| accept_event_flags_ = event_flags; |
| - if (async_run_) { |
| - internal::MenuControllerDelegate* delegate = delegate_; |
| - MenuItemView* result = ExitMenuRun(); |
| - delegate->OnMenuClosed(internal::MenuControllerDelegate::NOTIFY_DELEGATE, |
| - result, accept_event_flags_); |
| - } |
| + ExitAsyncRun(); |
| } |
| bool MenuController::ShowSiblingMenu(SubmenuView* source, |
| @@ -2417,6 +2410,19 @@ bool MenuController::TerminateNestedMessageLoopIfNecessary() { |
| return quit_now; |
| } |
| +void MenuController::ExitAsyncRun() { |
| + if (!async_run_) |
| + return; |
| + bool nested = delegate_stack_.size() > 1; |
| + // ExitMenuRun unwinds nested delegates |
| + internal::MenuControllerDelegate* delegate = delegate_; |
| + MenuItemView* result = ExitMenuRun(); |
| + delegate->OnMenuClosed(internal::MenuControllerDelegate::NOTIFY_DELEGATE, |
| + result, accept_event_flags_); |
| + if (nested && exit_type_ == EXIT_ALL) |
| + ExitAsyncRun(); |
| +} |
| + |
| MenuItemView* MenuController::ExitMenuRun() { |
| // Release the lock which prevents Chrome from shutting down while the menu is |
| // showing. |