Index: ui/views/test/event_generator_delegate_mac.mm |
diff --git a/ui/views/test/event_generator_delegate_mac.mm b/ui/views/test/event_generator_delegate_mac.mm |
index 86c4c7526984c3c7fc5375ac8a29674a03d78ad5..32878cd3a947c0a28846c70fe1833e393148c4a8 100644 |
--- a/ui/views/test/event_generator_delegate_mac.mm |
+++ b/ui/views/test/event_generator_delegate_mac.mm |
@@ -20,30 +20,16 @@ namespace { |
// Singleton to provide state for swizzled Objective C methods. |
ui::test::EventGenerator* g_active_generator = NULL; |
+// Set (and always cleared) in EmulateSendEvent() to provide an answer for |
+// [NSApp currentEvent]. |
+NSEvent* g_current_event = nil; |
+ |
} // namespace |
@interface NSEventDonor : NSObject |
@end |
-@implementation NSEventDonor |
- |
-// Donate +[NSEvent pressedMouseButtons] by retrieving the flags from the |
-// active generator. |
-+ (NSUInteger)pressedMouseButtons { |
- if (!g_active_generator) |
- return [NSEventDonor pressedMouseButtons]; // Call original implementation. |
- |
- int flags = g_active_generator->flags(); |
- NSUInteger bitmask = 0; |
- if (flags & ui::EF_LEFT_MOUSE_BUTTON) |
- bitmask |= 1; |
- if (flags & ui::EF_RIGHT_MOUSE_BUTTON) |
- bitmask |= 1 << 1; |
- if (flags & ui::EF_MIDDLE_MOUSE_BUTTON) |
- bitmask |= 1 << 2; |
- return bitmask; |
-} |
- |
+@interface NSApplicationDonor : NSObject |
@end |
namespace { |
@@ -133,6 +119,7 @@ NSEventType EventTypeToNative(ui::EventType ui_event_type, |
// sendEvent is a black box which (among other things) will try to peek at the |
// event queue and can block indefinitely. |
void EmulateSendEvent(NSWindow* window, NSEvent* event) { |
+ base::AutoReset<NSEvent*> reset(&g_current_event, event); |
NSResponder* responder = [window firstResponder]; |
switch ([event type]) { |
case NSKeyDown: |
@@ -243,6 +230,10 @@ class EventGeneratorDelegateMac : public ui::EventTarget, |
return Singleton<EventGeneratorDelegateMac>::get(); |
} |
+ IMP CurrentEventMethod() { |
+ return swizzle_current_event_->GetOriginalImplementation(); |
+ } |
+ |
// Overridden from ui::EventTarget: |
bool CanAcceptEvent(const ui::Event& event) override { return true; } |
ui::EventTarget* GetParentTarget() override { return NULL; } |
@@ -291,6 +282,7 @@ class EventGeneratorDelegateMac : public ui::EventTarget, |
ui::test::EventGenerator* owner_; |
NSWindow* window_; |
scoped_ptr<base::mac::ScopedObjCClassSwizzler> swizzle_pressed_; |
+ scoped_ptr<base::mac::ScopedObjCClassSwizzler> swizzle_current_event_; |
base::scoped_nsobject<NSMenu> fake_menu_; |
DISALLOW_COPY_AND_ASSIGN(EventGeneratorDelegateMac); |
@@ -368,6 +360,7 @@ void EventGeneratorDelegateMac::SetContext(ui::test::EventGenerator* owner, |
gfx::NativeWindow root_window, |
gfx::NativeWindow window) { |
swizzle_pressed_.reset(); |
+ swizzle_current_event_.reset(); |
owner_ = owner; |
window_ = window; |
@@ -384,6 +377,10 @@ void EventGeneratorDelegateMac::SetContext(ui::test::EventGenerator* owner, |
[NSEvent class], |
[NSEventDonor class], |
@selector(pressedMouseButtons))); |
+ swizzle_current_event_.reset(new base::mac::ScopedObjCClassSwizzler( |
+ [NSApplication class], |
+ [NSApplicationDonor class], |
+ @selector(currentEvent))); |
} |
} |
@@ -410,3 +407,37 @@ void InitializeMacEventGeneratorDelegate() { |
} // namespace test |
} // namespace views |
+ |
+@implementation NSEventDonor |
+ |
+// Donate +[NSEvent pressedMouseButtons] by retrieving the flags from the |
+// active generator. |
++ (NSUInteger)pressedMouseButtons { |
+ if (!g_active_generator) |
+ return [NSEventDonor pressedMouseButtons]; // Call original implementation. |
+ |
+ int flags = g_active_generator->flags(); |
+ NSUInteger bitmask = 0; |
+ if (flags & ui::EF_LEFT_MOUSE_BUTTON) |
+ bitmask |= 1; |
+ if (flags & ui::EF_RIGHT_MOUSE_BUTTON) |
+ bitmask |= 1 << 1; |
+ if (flags & ui::EF_MIDDLE_MOUSE_BUTTON) |
+ bitmask |= 1 << 2; |
+ return bitmask; |
+} |
+ |
+@end |
+ |
+@implementation NSApplicationDonor |
+ |
+- (NSEvent*)currentEvent { |
+ if (g_current_event) |
+ return g_current_event; |
+ |
+ // Find the original implementation and invoke it. |
+ IMP original = EventGeneratorDelegateMac::GetInstance()->CurrentEventMethod(); |
+ return original(self, _cmd); |
+} |
+ |
+@end |