1// Copyright (c) 2011 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 5#import <Cocoa/Cocoa.h> 6 7#include "ui/base/test/cocoa_test_event_utils.h" 8 9ScopedClassSwizzler::ScopedClassSwizzler(Class target, Class source, 10 SEL selector) { 11 old_selector_impl_ = class_getInstanceMethod(target, selector); 12 new_selector_impl_ = class_getInstanceMethod(source, selector); 13 method_exchangeImplementations(old_selector_impl_, new_selector_impl_); 14} 15 16ScopedClassSwizzler::~ScopedClassSwizzler() { 17 method_exchangeImplementations(old_selector_impl_, new_selector_impl_); 18} 19 20namespace cocoa_test_event_utils { 21 22NSEvent* MouseEventAtPoint(NSPoint point, NSEventType type, 23 NSUInteger modifiers) { 24 if (type == NSOtherMouseUp) { 25 // To synthesize middle clicks we need to create a CGEvent with the 26 // "center" button flags so that our resulting NSEvent will have the 27 // appropriate buttonNumber field. NSEvent provides no way to create a 28 // mouse event with a buttonNumber directly. 29 CGPoint location = { point.x, point.y }; 30 CGEventRef cg_event = CGEventCreateMouseEvent(NULL, kCGEventOtherMouseUp, 31 location, 32 kCGMouseButtonCenter); 33 NSEvent* event = [NSEvent eventWithCGEvent:cg_event]; 34 CFRelease(cg_event); 35 return event; 36 } 37 return [NSEvent mouseEventWithType:type 38 location:point 39 modifierFlags:modifiers 40 timestamp:0 41 windowNumber:0 42 context:nil 43 eventNumber:0 44 clickCount:1 45 pressure:1.0]; 46} 47 48NSEvent* MouseEventWithType(NSEventType type, NSUInteger modifiers) { 49 return MouseEventAtPoint(NSZeroPoint, type, modifiers); 50} 51 52static NSEvent* MouseEventAtPointInWindow(NSPoint point, 53 NSEventType type, 54 NSWindow* window, 55 NSUInteger clickCount) { 56 return [NSEvent mouseEventWithType:type 57 location:point 58 modifierFlags:0 59 timestamp:0 60 windowNumber:[window windowNumber] 61 context:nil 62 eventNumber:0 63 clickCount:clickCount 64 pressure:1.0]; 65} 66 67NSEvent* LeftMouseDownAtPointInWindow(NSPoint point, NSWindow* window) { 68 return MouseEventAtPointInWindow(point, NSLeftMouseDown, window, 1); 69} 70 71NSEvent* LeftMouseDownAtPoint(NSPoint point) { 72 return LeftMouseDownAtPointInWindow(point, nil); 73} 74 75std::pair<NSEvent*,NSEvent*> MouseClickInView(NSView* view, 76 NSUInteger clickCount) { 77 const NSRect bounds = [view convertRect:[view bounds] toView:nil]; 78 const NSPoint mid_point = NSMakePoint(NSMidX(bounds), NSMidY(bounds)); 79 NSEvent* down = MouseEventAtPointInWindow(mid_point, NSLeftMouseDown, 80 [view window], clickCount); 81 NSEvent* up = MouseEventAtPointInWindow(mid_point, NSLeftMouseUp, 82 [view window], clickCount); 83 return std::make_pair(down, up); 84} 85 86NSEvent* KeyEventWithCharacter(unichar c) { 87 return KeyEventWithKeyCode(0, c, NSKeyDown, 0); 88} 89 90NSEvent* KeyEventWithType(NSEventType event_type, NSUInteger modifiers) { 91 return KeyEventWithKeyCode(0x78, 'x', event_type, modifiers); 92} 93 94NSEvent* KeyEventWithKeyCode(unsigned short key_code, 95 unichar c, 96 NSEventType event_type, 97 NSUInteger modifiers) { 98 NSString* chars = [NSString stringWithCharacters:&c length:1]; 99 return [NSEvent keyEventWithType:event_type 100 location:NSZeroPoint 101 modifierFlags:modifiers 102 timestamp:0 103 windowNumber:0 104 context:nil 105 characters:chars 106 charactersIgnoringModifiers:chars 107 isARepeat:NO 108 keyCode:key_code]; 109} 110 111NSEvent* EnterExitEventWithType(NSEventType event_type) { 112 return [NSEvent enterExitEventWithType:event_type 113 location:NSZeroPoint 114 modifierFlags:0 115 timestamp:0 116 windowNumber:0 117 context:nil 118 eventNumber:0 119 trackingNumber:0 120 userData:NULL]; 121} 122 123NSEvent* OtherEventWithType(NSEventType event_type) { 124 return [NSEvent otherEventWithType:event_type 125 location:NSZeroPoint 126 modifierFlags:0 127 timestamp:0 128 windowNumber:0 129 context:nil 130 subtype:0 131 data1:0 132 data2:0]; 133} 134 135} // namespace cocoa_test_event_utils 136