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

Unified Diff: ui/views/test/event_generator_delegate_mac.mm

Issue 951433002: MacViews: Handle Tab properly (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@20150129-MacViews-Bringup5
Patch Set: Still need insertTexT: Created 5 years, 10 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
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
« ui/views/cocoa/bridged_content_view.mm ('K') | « ui/views/controls/textfield/textfield_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698