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

Unified Diff: ui/views/controls/menu/menu_controller.cc

Issue 1515203002: Update closing of nested asynchronous menus (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/controls/menu/menu_controller.h ('k') | ui/views/controls/menu/menu_controller_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..701e0970b89619285749399f7cde90819d6ea7c9 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,10 @@ 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;
+ // MenuController may have been deleted if |async_run_| so check for an active
+ // instance before accessing member variables.
+ if (GetActiveInstance())
+ did_initiate_drag_ = false;
}
void MenuController::OnKeyDown(ui::KeyboardCode key_code) {
@@ -1275,12 +1275,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 +2412,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.
« no previous file with comments | « ui/views/controls/menu/menu_controller.h ('k') | ui/views/controls/menu/menu_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698