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 3 // found in the LICENSE file. 4 5 #import <Cocoa/Cocoa.h> 6 7 #include "ui/events/test/cocoa_test_event_utils.h" 8 9 namespace cocoa_test_event_utils { 10 11 NSEvent* MouseEventAtPoint(NSPoint point, NSEventType type, 12 NSUInteger modifiers) { 13 if (type == NSOtherMouseUp) { 14 // To synthesize middle clicks we need to create a CGEvent with the 15 // "center" button flags so that our resulting NSEvent will have the 16 // appropriate buttonNumber field. NSEvent provides no way to create a 17 // mouse event with a buttonNumber directly. 18 CGPoint location = { point.x, point.y }; 19 CGEventRef cg_event = CGEventCreateMouseEvent(NULL, kCGEventOtherMouseUp, 20 location, 21 kCGMouseButtonCenter); 22 // Also specify the modifiers for the middle click case. This makes this 23 // test resilient to external modifiers being pressed. 24 CGEventSetFlags(cg_event, modifiers); 25 NSEvent* event = [NSEvent eventWithCGEvent:cg_event]; 26 CFRelease(cg_event); 27 return event; 28 } 29 return [NSEvent mouseEventWithType:type 30 location:point 31 modifierFlags:modifiers 32 timestamp:0 33 windowNumber:0 34 context:nil 35 eventNumber:0 36 clickCount:1 37 pressure:1.0]; 38 } 39 40 NSEvent* MouseEventWithType(NSEventType type, NSUInteger modifiers) { 41 return MouseEventAtPoint(NSZeroPoint, type, modifiers); 42 } 43 44 static NSEvent* MouseEventAtPointInWindow(NSPoint point, 45 NSEventType type, 46 NSWindow* window, 47 NSUInteger clickCount) { 48 return [NSEvent mouseEventWithType:type 49 location:point 50 modifierFlags:0 51 timestamp:0 52 windowNumber:[window windowNumber] 53 context:nil 54 eventNumber:0 55 clickCount:clickCount 56 pressure:1.0]; 57 } 58 59 NSEvent* RightMouseDownAtPointInWindow(NSPoint point, NSWindow* window) { 60 return MouseEventAtPointInWindow(point, NSRightMouseDown, window, 1); 61 } 62 63 NSEvent* RightMouseDownAtPoint(NSPoint point) { 64 return RightMouseDownAtPointInWindow(point, nil); 65 } 66 67 NSEvent* LeftMouseDownAtPointInWindow(NSPoint point, NSWindow* window) { 68 return MouseEventAtPointInWindow(point, NSLeftMouseDown, window, 1); 69 } 70 71 NSEvent* LeftMouseDownAtPoint(NSPoint point) { 72 return LeftMouseDownAtPointInWindow(point, nil); 73 } 74 75 std::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 86 NSEvent* KeyEventWithCharacter(unichar c) { 87 return KeyEventWithKeyCode(0, c, NSKeyDown, 0); 88 } 89 90 NSEvent* KeyEventWithType(NSEventType event_type, NSUInteger modifiers) { 91 return KeyEventWithKeyCode(0x78, 'x', event_type, modifiers); 92 } 93 94 NSEvent* 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 111 NSEvent* 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 123 NSEvent* 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