menu_test_observer.mm 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #import "ui/base/test/menu_test_observer.h"
  5. #include "base/check_op.h"
  6. #import "base/mac/objc_release_properties.h"
  7. @implementation MenuTestObserver
  8. @synthesize menu = _menu;
  9. @synthesize isOpen = _isOpen;
  10. @synthesize didOpen = _didOpen;
  11. @synthesize closeAfterOpening = _closeAfterOpening;
  12. @synthesize openCallback = _openCallback;
  13. - (instancetype)initWithMenu:(NSMenu*)menu {
  14. if ((self = [super init])) {
  15. _menu = menu;
  16. NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
  17. [center addObserver:self
  18. selector:@selector(menuDidBeginTracking:)
  19. name:NSMenuDidBeginTrackingNotification
  20. object:_menu];
  21. [center addObserver:self
  22. selector:@selector(menuDidEndTracking:)
  23. name:NSMenuDidEndTrackingNotification
  24. object:_menu];
  25. }
  26. return self;
  27. }
  28. - (void)dealloc {
  29. [[NSNotificationCenter defaultCenter] removeObserver:self];
  30. base::mac::ReleaseProperties(self);
  31. [super dealloc];
  32. }
  33. - (void)menuDidBeginTracking:(NSNotification*)notif {
  34. DCHECK_EQ(_menu, [notif object]);
  35. _isOpen = YES;
  36. _didOpen = YES;
  37. // Post the callback to the runloop, since in this notification callback,
  38. // the menu may not be fully in its tracking mode yet.
  39. NSArray* modes = @[ NSEventTrackingRunLoopMode, NSDefaultRunLoopMode ];
  40. [self performSelector:@selector(performOpenTasks)
  41. withObject:nil
  42. afterDelay:0
  43. inModes:modes];
  44. }
  45. - (void)menuDidEndTracking:(NSNotification*)notif {
  46. DCHECK_EQ(_menu, [notif object]);
  47. _isOpen = NO;
  48. }
  49. - (void)performOpenTasks {
  50. DCHECK(_isOpen);
  51. if (_openCallback)
  52. _openCallback(self);
  53. if (_closeAfterOpening)
  54. [_menu cancelTracking];
  55. }
  56. @end