| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import <Cocoa/Cocoa.h> | 5 #import <Cocoa/Cocoa.h> |
| 6 | 6 |
| 7 #import "base/mac/scoped_nsobject.h" | 7 #import "base/mac/scoped_nsobject.h" |
| 8 #import "base/mac/scoped_objc_class_swizzler.h" | 8 #import "base/mac/scoped_objc_class_swizzler.h" |
| 9 #include "base/memory/singleton.h" | 9 #include "base/memory/singleton.h" |
| 10 #include "ui/events/event_processor.h" | 10 #include "ui/events/event_processor.h" |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 void ConvertPointFromHost(const ui::EventTarget* hosted_target, | 273 void ConvertPointFromHost(const ui::EventTarget* hosted_target, |
| 274 gfx::Point* point) const override {} | 274 gfx::Point* point) const override {} |
| 275 | 275 |
| 276 private: | 276 private: |
| 277 friend struct DefaultSingletonTraits<EventGeneratorDelegateMac>; | 277 friend struct DefaultSingletonTraits<EventGeneratorDelegateMac>; |
| 278 | 278 |
| 279 EventGeneratorDelegateMac(); | 279 EventGeneratorDelegateMac(); |
| 280 ~EventGeneratorDelegateMac() override; | 280 ~EventGeneratorDelegateMac() override; |
| 281 | 281 |
| 282 ui::test::EventGenerator* owner_; | 282 ui::test::EventGenerator* owner_; |
| 283 NSWindow* window_; | 283 base::scoped_nsobject<NSWindow> window_; |
| 284 scoped_ptr<base::mac::ScopedObjCClassSwizzler> swizzle_pressed_; | 284 scoped_ptr<base::mac::ScopedObjCClassSwizzler> swizzle_pressed_; |
| 285 scoped_ptr<base::mac::ScopedObjCClassSwizzler> swizzle_current_event_; | 285 scoped_ptr<base::mac::ScopedObjCClassSwizzler> swizzle_current_event_; |
| 286 base::scoped_nsobject<NSMenu> fake_menu_; | 286 base::scoped_nsobject<NSMenu> fake_menu_; |
| 287 | 287 |
| 288 DISALLOW_COPY_AND_ASSIGN(EventGeneratorDelegateMac); | 288 DISALLOW_COPY_AND_ASSIGN(EventGeneratorDelegateMac); |
| 289 }; | 289 }; |
| 290 | 290 |
| 291 EventGeneratorDelegateMac::EventGeneratorDelegateMac() | 291 EventGeneratorDelegateMac::EventGeneratorDelegateMac() : owner_(NULL) { |
| 292 : owner_(NULL), | |
| 293 window_(NULL) { | |
| 294 DCHECK(!ui::test::EventGenerator::default_delegate); | 292 DCHECK(!ui::test::EventGenerator::default_delegate); |
| 295 ui::test::EventGenerator::default_delegate = this; | 293 ui::test::EventGenerator::default_delegate = this; |
| 296 // Install a fake "edit" menu. This is normally provided by Chrome's | 294 // Install a fake "edit" menu. This is normally provided by Chrome's |
| 297 // MainMenu.xib, but src/ui shouldn't depend on that. | 295 // MainMenu.xib, but src/ui shouldn't depend on that. |
| 298 fake_menu_.reset([[NSMenu alloc] initWithTitle:@"Edit"]); | 296 fake_menu_.reset([[NSMenu alloc] initWithTitle:@"Edit"]); |
| 299 struct { | 297 struct { |
| 300 NSString* title; | 298 NSString* title; |
| 301 SEL action; | 299 SEL action; |
| 302 NSString* key_equivalent; | 300 NSString* key_equivalent; |
| 303 } fake_menu_item[] = { | 301 } fake_menu_item[] = { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 | 353 |
| 356 EmulateSendEvent(window_, ns_event); | 354 EmulateSendEvent(window_, ns_event); |
| 357 } | 355 } |
| 358 | 356 |
| 359 void EventGeneratorDelegateMac::SetContext(ui::test::EventGenerator* owner, | 357 void EventGeneratorDelegateMac::SetContext(ui::test::EventGenerator* owner, |
| 360 gfx::NativeWindow root_window, | 358 gfx::NativeWindow root_window, |
| 361 gfx::NativeWindow window) { | 359 gfx::NativeWindow window) { |
| 362 swizzle_pressed_.reset(); | 360 swizzle_pressed_.reset(); |
| 363 swizzle_current_event_.reset(); | 361 swizzle_current_event_.reset(); |
| 364 owner_ = owner; | 362 owner_ = owner; |
| 365 window_ = window; | 363 |
| 364 // Retain the NSWindow (note it can be nil). This matches Cocoa's tendency to |
| 365 // have autoreleased objects, or objects still in the event queue, that |
| 366 // reference the NSWindow. |
| 367 window_.reset([window retain]); |
| 366 | 368 |
| 367 // Normally, edit menu items have a `nil` target. This results in -[NSMenu | 369 // Normally, edit menu items have a `nil` target. This results in -[NSMenu |
| 368 // performKeyEquivalent:] relying on -[NSApplication targetForAction:to:from:] | 370 // performKeyEquivalent:] relying on -[NSApplication targetForAction:to:from:] |
| 369 // to find a target starting at the first responder of the key window. Since | 371 // to find a target starting at the first responder of the key window. Since |
| 370 // non-interactive tests have no key window, that won't work. So set (or | 372 // non-interactive tests have no key window, that won't work. So set (or |
| 371 // clear) the target explicitly on all menu items. | 373 // clear) the target explicitly on all menu items. |
| 372 [[fake_menu_ itemArray] makeObjectsPerformSelector:@selector(setTarget:) | 374 [[fake_menu_ itemArray] makeObjectsPerformSelector:@selector(setTarget:) |
| 373 withObject:[window firstResponder]]; | 375 withObject:[window firstResponder]]; |
| 374 | 376 |
| 375 if (owner_) { | 377 if (owner_) { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 - (NSEvent*)currentEvent { | 436 - (NSEvent*)currentEvent { |
| 435 if (g_current_event) | 437 if (g_current_event) |
| 436 return g_current_event; | 438 return g_current_event; |
| 437 | 439 |
| 438 // Find the original implementation and invoke it. | 440 // Find the original implementation and invoke it. |
| 439 IMP original = EventGeneratorDelegateMac::GetInstance()->CurrentEventMethod(); | 441 IMP original = EventGeneratorDelegateMac::GetInstance()->CurrentEventMethod(); |
| 440 return original(self, _cmd); | 442 return original(self, _cmd); |
| 441 } | 443 } |
| 442 | 444 |
| 443 @end | 445 @end |
| OLD | NEW |