| 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 18f81c0eaf2f2dbd7ceafff99cdf61a6738724d6..5bd4537be5bbb4bdfbe4f8257bfd9f4d158f01fb 100644
|
| --- a/ui/views/test/event_generator_delegate_mac.mm
|
| +++ b/ui/views/test/event_generator_delegate_mac.mm
|
| @@ -17,9 +17,6 @@
|
|
|
| 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;
|
| @@ -234,6 +231,9 @@ class EventGeneratorDelegateMac : public ui::EventTarget,
|
| return swizzle_current_event_->GetOriginalImplementation();
|
| }
|
|
|
| + NSWindow* window() { return window_.get(); }
|
| + ui::test::EventGenerator* owner() { return owner_; }
|
| +
|
| // Overridden from ui::EventTarget:
|
| bool CanAcceptEvent(const ui::Event& event) override { return true; }
|
| ui::EventTarget* GetParentTarget() override { return NULL; }
|
| @@ -283,6 +283,7 @@ class EventGeneratorDelegateMac : public ui::EventTarget,
|
| ui::test::EventGenerator* owner_;
|
| base::scoped_nsobject<NSWindow> window_;
|
| scoped_ptr<base::mac::ScopedObjCClassSwizzler> swizzle_pressed_;
|
| + scoped_ptr<base::mac::ScopedObjCClassSwizzler> swizzle_location_;
|
| scoped_ptr<base::mac::ScopedObjCClassSwizzler> swizzle_current_event_;
|
| base::scoped_nsobject<NSMenu> fake_menu_;
|
|
|
| @@ -327,8 +328,6 @@ EventGeneratorDelegateMac::GetChildIterator() const {
|
| }
|
|
|
| void EventGeneratorDelegateMac::OnMouseEvent(ui::MouseEvent* event) {
|
| - // For mouse drag events, ensure the swizzled methods return the right flags.
|
| - base::AutoReset<ui::test::EventGenerator*> reset(&g_active_generator, owner_);
|
| NSEvent* ns_event = CreateMouseEventInWindow(window_,
|
| event->type(),
|
| event->location(),
|
| @@ -363,6 +362,7 @@ void EventGeneratorDelegateMac::SetContext(ui::test::EventGenerator* owner,
|
| gfx::NativeWindow root_window,
|
| gfx::NativeWindow window) {
|
| swizzle_pressed_.reset();
|
| + swizzle_location_.reset();
|
| swizzle_current_event_.reset();
|
| owner_ = owner;
|
|
|
| @@ -384,6 +384,8 @@ void EventGeneratorDelegateMac::SetContext(ui::test::EventGenerator* owner,
|
| [NSEvent class],
|
| [NSEventDonor class],
|
| @selector(pressedMouseButtons)));
|
| + swizzle_location_.reset(new base::mac::ScopedObjCClassSwizzler(
|
| + [NSEvent class], [NSEventDonor class], @selector(mouseLocation)));
|
| swizzle_current_event_.reset(new base::mac::ScopedObjCClassSwizzler(
|
| [NSApplication class],
|
| [NSApplicationDonor class],
|
| @@ -403,6 +405,11 @@ gfx::Point EventGeneratorDelegateMac::CenterOfWindow(
|
| return gfx::ScreenRectFromNSRect([window frame]).CenterPoint();
|
| }
|
|
|
| +// Return the current owner of the EventGeneratorDelegate. May be null.
|
| +ui::test::EventGenerator* GetActiveGenerator() {
|
| + return EventGeneratorDelegateMac::GetInstance()->owner();
|
| +}
|
| +
|
| } // namespace
|
|
|
| namespace views {
|
| @@ -420,10 +427,11 @@ void InitializeMacEventGeneratorDelegate() {
|
| // Donate +[NSEvent pressedMouseButtons] by retrieving the flags from the
|
| // active generator.
|
| + (NSUInteger)pressedMouseButtons {
|
| - if (!g_active_generator)
|
| + ui::test::EventGenerator* generator = GetActiveGenerator();
|
| + if (!generator)
|
| return [NSEventDonor pressedMouseButtons]; // Call original implementation.
|
|
|
| - int flags = g_active_generator->flags();
|
| + int flags = generator->flags();
|
| NSUInteger bitmask = 0;
|
| if (flags & ui::EF_LEFT_MOUSE_BUTTON)
|
| bitmask |= 1;
|
| @@ -434,6 +442,20 @@ void InitializeMacEventGeneratorDelegate() {
|
| return bitmask;
|
| }
|
|
|
| +// Donate +[NSEvent mouseLocation] by retrieving the current position on screen.
|
| ++ (NSPoint)mouseLocation {
|
| + ui::test::EventGenerator* generator = GetActiveGenerator();
|
| + if (!generator)
|
| + return [NSEventDonor mouseLocation]; // Call original implementation.
|
| +
|
| + // The location is the point in the root window which, for desktop widgets, is
|
| + // the widget itself.
|
| + gfx::Point point_in_root = generator->current_location();
|
| + NSWindow* window = EventGeneratorDelegateMac::GetInstance()->window();
|
| + NSPoint point_in_window = ConvertRootPointToTarget(window, point_in_root);
|
| + return [window convertBaseToScreen:point_in_window];
|
| +}
|
| +
|
| @end
|
|
|
| @implementation NSApplicationDonor
|
|
|