| Index: ui/views/controls/menu/menu_controller_unittest.cc
|
| diff --git a/ui/views/controls/menu/menu_controller_unittest.cc b/ui/views/controls/menu/menu_controller_unittest.cc
|
| index 42a2a252e08bc57b4f9a9fce1a150ac47d20241b..3d240ac60e9c7a887c150bd5b08175187177ecc5 100644
|
| --- a/ui/views/controls/menu/menu_controller_unittest.cc
|
| +++ b/ui/views/controls/menu/menu_controller_unittest.cc
|
| @@ -21,6 +21,7 @@
|
| #include "ui/gfx/geometry/rect.h"
|
| #include "ui/views/controls/menu/menu_controller_delegate.h"
|
| #include "ui/views/controls/menu/menu_delegate.h"
|
| +#include "ui/views/controls/menu/menu_host.h"
|
| #include "ui/views/controls/menu/menu_item_view.h"
|
| #include "ui/views/controls/menu/menu_message_loop.h"
|
| #include "ui/views/controls/menu/menu_scroll_view_container.h"
|
| @@ -378,6 +379,12 @@ class MenuControllerTest : public ViewsTestBase {
|
|
|
| bool IsShowing() { return menu_controller_->showing_; }
|
|
|
| + MenuHost* GetMenuHost(SubmenuView* submenu) { return submenu->host_; }
|
| +
|
| + void MenuHostOnDragWillStart(MenuHost* host) { host->OnDragWillStart(); }
|
| +
|
| + void MenuHostOnDragComplete(MenuHost* host) { host->OnDragComplete(); }
|
| +
|
| void SelectByChar(base::char16 character) {
|
| menu_controller_->SelectByChar(character);
|
| }
|
| @@ -451,6 +458,8 @@ class MenuControllerTest : public ViewsTestBase {
|
| menu_item()->GetSubmenu()->ShowAt(owner(), menu_item()->bounds(), false);
|
| }
|
|
|
| + void DestroyMenuItem() { menu_item_.reset(); }
|
| +
|
| CustomButton* GetHotButton() {
|
| return menu_controller_->hot_button_;
|
| }
|
| @@ -464,7 +473,6 @@ class MenuControllerTest : public ViewsTestBase {
|
| menu_controller_->ExitMenuRun();
|
| }
|
|
|
| - private:
|
| void DestroyMenuController() {
|
| if (!menu_controller_)
|
| return;
|
| @@ -478,6 +486,7 @@ class MenuControllerTest : public ViewsTestBase {
|
| menu_controller_ = nullptr;
|
| }
|
|
|
| + private:
|
| void Init() {
|
| owner_.reset(new Widget);
|
| Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
|
| @@ -943,6 +952,22 @@ TEST_F(MenuControllerTest, AsynchronousCancelAll) {
|
| EXPECT_EQ(MenuController::EXIT_ALL, controller->exit_type());
|
| }
|
|
|
| +// Tests that a when a MenuController has been destroyed, that a menu attempting
|
| +// to cancel does not crash.
|
| +TEST_F(MenuControllerTest, AsynchronousCancelAfterDeletion) {
|
| + MenuController* controller = menu_controller();
|
| + controller->SetAsyncRun(true);
|
| +
|
| + int mouse_event_flags = 0;
|
| + MenuItemView* run_result =
|
| + controller->Run(owner(), nullptr, menu_item(), gfx::Rect(),
|
| + MENU_ANCHOR_TOPLEFT, false, false, &mouse_event_flags);
|
| + EXPECT_EQ(run_result, nullptr);
|
| +
|
| + DestroyMenuController();
|
| + menu_item()->Cancel();
|
| +}
|
| +
|
| // Tests that an asynchrnous menu nested within a synchronous menu restores the
|
| // previous MenuControllerDelegate and synchronous settings.
|
| TEST_F(MenuControllerTest, AsynchronousNestedDelegate) {
|
| @@ -1019,6 +1044,21 @@ TEST_F(MenuControllerTest, AsynchronousDragComplete) {
|
| EXPECT_EQ(MenuController::EXIT_ALL, controller->exit_type());
|
| }
|
|
|
| +// Tests that if a menu is destroyed while drag operations are occuring, that
|
| +// the MenuHost does not crash as the drag completes.
|
| +TEST_F(MenuControllerTest, AsynchronousDragHostDeleted) {
|
| + MenuController* controller = menu_controller();
|
| + controller->SetAsyncRun(true);
|
| +
|
| + SubmenuView* submenu = menu_item()->GetSubmenu();
|
| + submenu->ShowAt(owner(), menu_item()->bounds(), false);
|
| + MenuHost* host = GetMenuHost(submenu);
|
| + MenuHostOnDragWillStart(host);
|
| + submenu->Close();
|
| + DestroyMenuItem();
|
| + MenuHostOnDragComplete(host);
|
| +}
|
| +
|
| // Tets that an asynchronous menu nested within an asynchronous menu closes both
|
| // menus, and notifies both delegates.
|
| TEST_F(MenuControllerTest, DoubleAsynchronousNested) {
|
|
|