15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <Cocoa/Cocoa.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/events/test/cocoa_test_event_utils.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cocoa_test_event_utils { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSEvent* MouseEventAtPoint(NSPoint point, NSEventType type, 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSUInteger modifiers) { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == NSOtherMouseUp) { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To synthesize middle clicks we need to create a CGEvent with the 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "center" button flags so that our resulting NSEvent will have the 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // appropriate buttonNumber field. NSEvent provides no way to create a 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mouse event with a buttonNumber directly. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CGPoint location = { point.x, point.y }; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CGEventRef cg_event = CGEventCreateMouseEvent(NULL, kCGEventOtherMouseUp, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCGMouseButtonCenter); 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Also specify the modifiers for the middle click case. This makes this 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // test resilient to external modifiers being pressed. 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CGEventSetFlags(cg_event, modifiers); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSEvent* event = [NSEvent eventWithCGEvent:cg_event]; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CFRelease(cg_event); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return event; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return [NSEvent mouseEventWithType:type 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location:point 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modifierFlags:modifiers 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timestamp:0 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windowNumber:0 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context:nil 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eventNumber:0 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clickCount:1 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pressure:1.0]; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSEvent* MouseEventWithType(NSEventType type, NSUInteger modifiers) { 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return MouseEventAtPoint(NSZeroPoint, type, modifiers); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static NSEvent* MouseEventAtPointInWindow(NSPoint point, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSEventType type, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSWindow* window, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSUInteger clickCount) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return [NSEvent mouseEventWithType:type 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location:point 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modifierFlags:0 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timestamp:0 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windowNumber:[window windowNumber] 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context:nil 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eventNumber:0 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clickCount:clickCount 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pressure:1.0]; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)NSEvent* RightMouseDownAtPointInWindow(NSPoint point, NSWindow* window) { 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return MouseEventAtPointInWindow(point, NSRightMouseDown, window, 1); 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)NSEvent* RightMouseDownAtPoint(NSPoint point) { 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return RightMouseDownAtPointInWindow(point, nil); 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSEvent* LeftMouseDownAtPointInWindow(NSPoint point, NSWindow* window) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MouseEventAtPointInWindow(point, NSLeftMouseDown, window, 1); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSEvent* LeftMouseDownAtPoint(NSPoint point) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return LeftMouseDownAtPointInWindow(point, nil); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::pair<NSEvent*,NSEvent*> MouseClickInView(NSView* view, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSUInteger clickCount) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NSRect bounds = [view convertRect:[view bounds] toView:nil]; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NSPoint mid_point = NSMakePoint(NSMidX(bounds), NSMidY(bounds)); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSEvent* down = MouseEventAtPointInWindow(mid_point, NSLeftMouseDown, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [view window], clickCount); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSEvent* up = MouseEventAtPointInWindow(mid_point, NSLeftMouseUp, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [view window], clickCount); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::make_pair(down, up); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSEvent* KeyEventWithCharacter(unichar c) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return KeyEventWithKeyCode(0, c, NSKeyDown, 0); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSEvent* KeyEventWithType(NSEventType event_type, NSUInteger modifiers) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return KeyEventWithKeyCode(0x78, 'x', event_type, modifiers); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSEvent* KeyEventWithKeyCode(unsigned short key_code, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unichar c, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSEventType event_type, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSUInteger modifiers) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSString* chars = [NSString stringWithCharacters:&c length:1]; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return [NSEvent keyEventWithType:event_type 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location:NSZeroPoint 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modifierFlags:modifiers 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timestamp:0 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windowNumber:0 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context:nil 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) characters:chars 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) charactersIgnoringModifiers:chars 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isARepeat:NO 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyCode:key_code]; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSEvent* EnterExitEventWithType(NSEventType event_type) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return [NSEvent enterExitEventWithType:event_type 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location:NSZeroPoint 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modifierFlags:0 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timestamp:0 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windowNumber:0 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context:nil 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eventNumber:0 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trackingNumber:0 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) userData:NULL]; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSEvent* OtherEventWithType(NSEventType event_type) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return [NSEvent otherEventWithType:event_type 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location:NSZeroPoint 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modifierFlags:0 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timestamp:0 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windowNumber:0 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context:nil 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subtype:0 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data1:0 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data2:0]; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace cocoa_test_event_utils 136