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