Chromium Code Reviews| Index: ui/views/controls/menu/menu_runner_cocoa_unittest.mm |
| diff --git a/ui/views/controls/menu/menu_runner_cocoa_unittest.mm b/ui/views/controls/menu/menu_runner_cocoa_unittest.mm |
| index d25a6628b47db5294dba95b81c3816386746ed48..da18109b99ffec5b32e2e9ca946ea7b6939b263e 100644 |
| --- a/ui/views/controls/menu/menu_runner_cocoa_unittest.mm |
| +++ b/ui/views/controls/menu/menu_runner_cocoa_unittest.mm |
| @@ -17,12 +17,41 @@ namespace views { |
| namespace test { |
| namespace { |
| +void MenuCancelCallback(internal::MenuRunnerImplCocoa* runner) { |
|
tapted
2016/04/06 06:38:37
I think these all would be better as member functi
karandeepb
2016/04/06 10:25:16
Done.
|
| + runner->Cancel(); |
| + EXPECT_FALSE(runner->IsRunning()); |
| +} |
| + |
| +void MenuDeleteCallback(internal::MenuRunnerImplCocoa** runner) { |
| + (*runner)->Release(); |
| + *runner = nullptr; |
| +} |
| + |
| +void RunMenuWrapperCallback(const base::Closure& callback, |
| + internal::MenuRunnerImplCocoa* runner) { |
| + EXPECT_TRUE(runner->IsRunning()); |
| + callback.Run(); |
| +} |
| + |
| +void RunMenuAtCallback(views::Widget* parent, |
| + internal::MenuRunnerImplCocoa* runner, |
| + NSRect* last_anchor_frame) { |
| + NSArray* subviews = [parent->GetNativeView() subviews]; |
| + EXPECT_EQ(2u, [subviews count]); |
| + *last_anchor_frame = [[subviews objectAtIndex:1] frame]; |
| + runner->Cancel(); |
| +} |
| + |
| class TestModel : public ui::SimpleMenuModel { |
| public: |
| TestModel() : ui::SimpleMenuModel(&delegate_), delegate_(this) {} |
| void set_checked_command(int command) { checked_command_ = command; } |
| + void set_menu_open_callback(const base::Closure& callback) { |
| + menu_open_callback_ = callback; |
| + } |
| + |
| private: |
| class Delegate : public ui::SimpleMenuModel::Delegate { |
| public: |
| @@ -37,6 +66,12 @@ class TestModel : public ui::SimpleMenuModel { |
| } |
| void ExecuteCommand(int command_id, int event_flags) override {} |
| + void MenuWillShow(SimpleMenuModel* source) override { |
| + if (model_->menu_open_callback_.is_null()) |
|
tapted
2016/04/06 06:38:37
nit:
if (!model_->menu_open_callback_.is_null(
karandeepb
2016/04/06 10:25:15
Done.
|
| + return; |
| + model_->menu_open_callback_.Run(); |
| + } |
| + |
| private: |
| TestModel* model_; |
| @@ -46,6 +81,7 @@ class TestModel : public ui::SimpleMenuModel { |
| private: |
| int checked_command_ = -1; |
| Delegate delegate_; |
| + base::Closure menu_open_callback_; |
| DISALLOW_COPY_AND_ASSIGN(TestModel); |
| }; |
| @@ -89,14 +125,12 @@ class MenuRunnerCocoaTest : public ViewsTestBase { |
| ViewsTestBase::TearDown(); |
| } |
| - // Runs the menu after scheduling |block| on the run loop. |
| - MenuRunner::RunResult RunMenu(dispatch_block_t block) { |
| - CFRunLoopPerformBlock(CFRunLoopGetCurrent(), kCFRunLoopCommonModes, ^{ |
| - EXPECT_TRUE(runner_->IsRunning()); |
| - block(); |
| - }); |
| - return runner_->RunMenuAt(parent_, NULL, gfx::Rect(), MENU_ANCHOR_TOPLEFT, |
| - MenuRunner::CONTEXT_MENU); |
| + // Runs the menu after registering |callback| as the menu open callback. |
| + MenuRunner::RunResult RunMenu(const base::Closure& callback) { |
| + menu_->set_menu_open_callback( |
| + base::Bind(&RunMenuWrapperCallback, callback, runner_)); |
| + return runner_->RunMenuAt(parent_, nullptr, gfx::Rect(), |
| + MENU_ANCHOR_TOPLEFT, MenuRunner::CONTEXT_MENU); |
| } |
| // Runs then cancels a combobox menu and captures the frame of the anchoring |
| @@ -107,12 +141,10 @@ class MenuRunnerCocoaTest : public ViewsTestBase { |
| // Should be one child (the compositor layer) before showing, and it should |
| // go up by one (the anchor view) while the menu is shown. |
| EXPECT_EQ(1u, [[parent_->GetNativeView() subviews] count]); |
| - CFRunLoopPerformBlock(CFRunLoopGetCurrent(), kCFRunLoopCommonModes, ^{ |
| - NSArray* subviews = [parent_->GetNativeView() subviews]; |
| - EXPECT_EQ(2u, [subviews count]); |
| - last_anchor_frame_ = [[subviews objectAtIndex:1] frame]; |
| - runner_->Cancel(); |
| - }); |
| + |
| + menu_->set_menu_open_callback( |
| + base::Bind(&RunMenuAtCallback, parent_, runner_, &last_anchor_frame_)); |
| + |
| MenuRunner::RunResult result = runner_->RunMenuAt( |
| parent_, nullptr, anchor, MENU_ANCHOR_TOPLEFT, MenuRunner::COMBOBOX); |
| @@ -134,10 +166,8 @@ class MenuRunnerCocoaTest : public ViewsTestBase { |
| TEST_F(MenuRunnerCocoaTest, RunMenuAndCancel) { |
| base::TimeDelta min_time = ui::EventTimeForNow(); |
| - MenuRunner::RunResult result = RunMenu(^{ |
| - runner_->Cancel(); |
| - EXPECT_FALSE(runner_->IsRunning()); |
| - }); |
| + MenuRunner::RunResult result = |
| + RunMenu(base::Bind(&MenuCancelCallback, runner_)); |
| EXPECT_EQ(MenuRunner::NORMAL_EXIT, result); |
| EXPECT_FALSE(runner_->IsRunning()); |
| @@ -151,19 +181,15 @@ TEST_F(MenuRunnerCocoaTest, RunMenuAndCancel) { |
| } |
| TEST_F(MenuRunnerCocoaTest, RunMenuAndDelete) { |
| - MenuRunner::RunResult result = RunMenu(^{ |
| - runner_->Release(); |
| - runner_ = NULL; |
| - }); |
| - |
| + MenuRunner::RunResult result = |
| + RunMenu(base::Bind(&MenuDeleteCallback, &runner_)); |
| EXPECT_EQ(MenuRunner::MENU_DELETED, result); |
| } |
| TEST_F(MenuRunnerCocoaTest, RunMenuTwice) { |
| for (int i = 0; i < 2; ++i) { |
| - MenuRunner::RunResult result = RunMenu(^{ |
| - runner_->Cancel(); |
| - }); |
| + MenuRunner::RunResult result = |
| + RunMenu(base::Bind(&MenuCancelCallback, runner_)); |
| EXPECT_EQ(MenuRunner::NORMAL_EXIT, result); |
| EXPECT_FALSE(runner_->IsRunning()); |
| } |