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

Unified Diff: ui/views/controls/menu/menu_runner_cocoa_unittest.mm

Issue 1829603002: MacViews: Fix flaky MenuRunnerCocoaTests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Style improvements. Created 4 years, 9 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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..5880623a0abb8c569881b1b6d53521d49bb76cff 100644
--- a/ui/views/controls/menu/menu_runner_cocoa_unittest.mm
+++ b/ui/views/controls/menu/menu_runner_cocoa_unittest.mm
@@ -9,10 +9,52 @@
#include "base/macros.h"
#include "base/strings/utf_string_conversions.h"
#import "testing/gtest_mac.h"
+#import "ui/base/cocoa/menu_controller.h"
#include "ui/base/models/simple_menu_model.h"
#include "ui/events/event_utils.h"
#include "ui/views/test/views_test_base.h"
+// A helper class to handle menu open notifications.
+@interface MenuOpenWatcher : NSObject {
+ dispatch_block_t openCallback_;
tapted 2016/03/24 02:10:36 nit: @private
+}
+
+// Method to handle menu open notification.
+- (void)menuWillOpen:(NSNotification*)notification;
+
+// Block to be invoked on menu open notification. Weak. Clients must ensure that
+// it remains in a valid state.
+@property(nonatomic, assign) dispatch_block_t openCallback;
+
+@end
+
+@implementation MenuOpenWatcher
+
+@synthesize openCallback = openCallback_;
+
+- (id)init {
+ if (self = [super init]) {
tapted 2016/03/24 02:10:36 nit: extra parens around assignment used as condit
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(menuWillOpen:)
+ name:kMenuControllerMenuWillOpenNotification
+ object:nil];
+ }
+ return self;
+}
+
+- (void)dealloc {
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+ [super dealloc];
+}
+
+- (void)menuWillOpen:(NSNotification*)notification {
+ if (openCallback_)
+ openCallback_();
+}
+
+@end
+
namespace views {
namespace test {
namespace {
@@ -77,6 +119,7 @@ class MenuRunnerCocoaTest : public ViewsTestBase {
runner_ = new internal::MenuRunnerImplCocoa(menu_.get());
EXPECT_FALSE(runner_->IsRunning());
+ menu_watcher_.reset([[MenuOpenWatcher alloc] init]);
}
void TearDown() override {
@@ -91,12 +134,15 @@ class MenuRunnerCocoaTest : public ViewsTestBase {
// 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);
+ [menu_watcher_ setOpenCallback:^{
+ EXPECT_TRUE(runner_->IsRunning());
+ block();
+ }];
+ MenuRunner::RunResult result =
+ runner_->RunMenuAt(parent_, NULL, gfx::Rect(), MENU_ANCHOR_TOPLEFT,
tapted 2016/03/24 02:10:36 nit (while you're here) NULL -> nullptr
karandeepb 2016/04/06 05:52:48 Done.
+ MenuRunner::CONTEXT_MENU);
+ [menu_watcher_ setOpenCallback:nil];
+ return result;
}
// Runs then cancels a combobox menu and captures the frame of the anchoring
@@ -107,22 +153,26 @@ 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, ^{
+
+ [menu_watcher_ setOpenCallback:^{
NSArray* subviews = [parent_->GetNativeView() subviews];
EXPECT_EQ(2u, [subviews count]);
last_anchor_frame_ = [[subviews objectAtIndex:1] frame];
runner_->Cancel();
- });
+ }];
+
MenuRunner::RunResult result = runner_->RunMenuAt(
parent_, nullptr, anchor, MENU_ANCHOR_TOPLEFT, MenuRunner::COMBOBOX);
// Ensure the anchor view is removed.
EXPECT_EQ(1u, [[parent_->GetNativeView() subviews] count]);
+ [menu_watcher_ setOpenCallback:nil];
return result;
}
protected:
scoped_ptr<TestModel> menu_;
+ base::scoped_nsobject<MenuOpenWatcher> menu_watcher_;
internal::MenuRunnerImplCocoa* runner_ = nullptr;
views::Widget* parent_ = nullptr;
NSRect last_anchor_frame_ = NSZeroRect;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698