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

Side by Side Diff: ui/views/controls/menu/menu_controller.cc

Issue 2682363002: Merge Prevent nested Menu Cancelling (Closed)
Patch Set: Created 3 years, 10 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 unified diff | Download patch
« no previous file with comments | « no previous file | ui/views/controls/menu/menu_runner_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/views/controls/menu/menu_controller.h" 5 #include "ui/views/controls/menu/menu_controller.h"
6 6
7 #include "base/i18n/case_conversion.h" 7 #include "base/i18n/case_conversion.h"
8 #include "base/i18n/rtl.h" 8 #include "base/i18n/rtl.h"
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 498
499 void MenuController::Cancel(ExitType type) { 499 void MenuController::Cancel(ExitType type) {
500 // If the menu has already been destroyed, no further cancellation is 500 // If the menu has already been destroyed, no further cancellation is
501 // needed. We especially don't want to set the |exit_type_| to a lesser 501 // needed. We especially don't want to set the |exit_type_| to a lesser
502 // value. 502 // value.
503 if (exit_type_ == EXIT_DESTROYED || exit_type_ == type) 503 if (exit_type_ == EXIT_DESTROYED || exit_type_ == type)
504 return; 504 return;
505 505
506 if (!showing_) { 506 if (!showing_) {
507 // This occurs if we're in the process of notifying the delegate for a drop 507 // This occurs if we're in the process of notifying the delegate for a drop
508 // and the delegate cancels us. 508 // and the delegate cancels us. Or if the releasing of ViewsDelegate causes
509 // an immediate shutdown.
509 return; 510 return;
510 } 511 }
511 512
512 MenuItemView* selected = state_.item; 513 MenuItemView* selected = state_.item;
513 SetExitType(type); 514 SetExitType(type);
514 515
515 SendMouseCaptureLostToActiveView(); 516 SendMouseCaptureLostToActiveView();
516 517
517 // Hide windows immediately. 518 // Hide windows immediately.
518 SetSelection(NULL, SELECTION_UPDATE_IMMEDIATELY | SELECTION_EXIT); 519 SetSelection(NULL, SELECTION_UPDATE_IMMEDIATELY | SELECTION_EXIT);
519 520
520 if (!blocking_run_) { 521 if (!blocking_run_) {
521 // If we didn't block the caller we need to notify the menu, which 522 // If we didn't block the caller we need to notify the menu, which
522 // triggers deleting us. 523 // triggers deleting us.
523 DCHECK(selected); 524 DCHECK(selected);
524 showing_ = false; 525 showing_ = false;
525 delegate_->OnMenuClosed(internal::MenuControllerDelegate::NOTIFY_DELEGATE, 526 delegate_->OnMenuClosed(internal::MenuControllerDelegate::NOTIFY_DELEGATE,
526 selected->GetRootMenuItem(), accept_event_flags_); 527 selected->GetRootMenuItem(), accept_event_flags_);
527 // WARNING: the call to MenuClosed deletes us. 528 // WARNING: the call to MenuClosed deletes us.
528 return; 529 return;
529 } 530 }
530 531
532 // If |type| is EXIT_ALL we update the state of the menu to not showing. For
533 // dragging this ensures that the correct visual state is reported until the
534 // drag operation completes. For non-dragging cases it is possible that the
535 // release of ViewsDelegate leads immediately to shutdown, which can trigger
536 // nested calls to Cancel. We want to reject these to prevent attempting a
537 // nested tear down of this and |delegate_|.
538 if (type == EXIT_ALL)
539 showing_ = false;
540
531 // On Windows and Linux the destruction of this menu's Widget leads to the 541 // On Windows and Linux the destruction of this menu's Widget leads to the
532 // teardown of the platform specific drag-and-drop Widget. Do not shutdown 542 // teardown of the platform specific drag-and-drop Widget. Do not shutdown
533 // while dragging, leave the Widget hidden until drag-and-drop has completed, 543 // while dragging, leave the Widget hidden until drag-and-drop has completed,
534 // at which point all menus will be destroyed. 544 // at which point all menus will be destroyed.
535 //
536 // If |type| is EXIT_ALL we update the state of the menu to not showing. So
537 // that during the completion of a drag we are not incorrectly reporting the
538 // visual state.
539 if (!drag_in_progress_) 545 if (!drag_in_progress_)
540 ExitAsyncRun(); 546 ExitAsyncRun();
541 else if (type == EXIT_ALL)
542 showing_ = false;
543 } 547 }
544 548
545 void MenuController::AddNestedDelegate( 549 void MenuController::AddNestedDelegate(
546 internal::MenuControllerDelegate* delegate) { 550 internal::MenuControllerDelegate* delegate) {
547 delegate_stack_.push_back(std::make_pair(delegate, async_run_)); 551 delegate_stack_.push_back(std::make_pair(delegate, async_run_));
548 delegate_ = delegate; 552 delegate_ = delegate;
549 } 553 }
550 554
551 void MenuController::SetAsyncRun(bool is_async) { 555 void MenuController::SetAsyncRun(bool is_async) {
552 delegate_stack_.back().second = is_async; 556 delegate_stack_.back().second = is_async;
(...skipping 2193 matching lines...) Expand 10 before | Expand all | Expand 10 after
2746 if (hot_button_) 2750 if (hot_button_)
2747 hot_button_->SetHotTracked(false); 2751 hot_button_->SetHotTracked(false);
2748 hot_button_ = hot_button; 2752 hot_button_ = hot_button;
2749 if (hot_button) { 2753 if (hot_button) {
2750 hot_button->SetHotTracked(true); 2754 hot_button->SetHotTracked(true);
2751 hot_button->NotifyAccessibilityEvent(ui::AX_EVENT_SELECTION, true); 2755 hot_button->NotifyAccessibilityEvent(ui::AX_EVENT_SELECTION, true);
2752 } 2756 }
2753 } 2757 }
2754 2758
2755 } // namespace views 2759 } // namespace views
OLDNEW
« no previous file with comments | « no previous file | ui/views/controls/menu/menu_runner_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698