Chromium Code Reviews| 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 #include <stddef.h> | 6 #include <stddef.h> |
| 7 | 7 |
| 8 #import "base/mac/scoped_nsobject.h" | 8 #import "base/mac/scoped_nsobject.h" |
| 9 #import "base/mac/scoped_objc_class_swizzler.h" | 9 #import "base/mac/scoped_objc_class_swizzler.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 break; | 165 break; |
| 166 case NSMouseMoved: | 166 case NSMouseMoved: |
| 167 // Assumes [NSWindow acceptsMouseMovedEvents] would return YES, and that | 167 // Assumes [NSWindow acceptsMouseMovedEvents] would return YES, and that |
| 168 // NSTrackingAreas have been appropriately installed on |responder|. | 168 // NSTrackingAreas have been appropriately installed on |responder|. |
| 169 [responder mouseMoved:event]; | 169 [responder mouseMoved:event]; |
| 170 break; | 170 break; |
| 171 case NSScrollWheel: | 171 case NSScrollWheel: |
| 172 [responder scrollWheel:event]; | 172 [responder scrollWheel:event]; |
| 173 break; | 173 break; |
| 174 case NSMouseEntered: | 174 case NSMouseEntered: |
| 175 [responder mouseEntered:event]; | |
|
tapted
2016/10/26 00:57:00
EventGenerator is for cross-platform testing of vi
snake
2016/10/26 12:44:56
Yes, this needs for testing MouseEnter/Exit evenet
| |
| 176 break; | |
| 175 case NSMouseExited: | 177 case NSMouseExited: |
| 176 // With the assumptions in NSMouseMoved, it doesn't make sense for the | 178 [responder mouseExited:event]; |
| 177 // generator to handle entered/exited separately. It's the responsibility | |
| 178 // of views::internal::RootView to convert the moved events into entered | |
| 179 // and exited events for the individual views. | |
| 180 NOTREACHED(); | |
| 181 break; | 179 break; |
| 182 case NSEventTypeSwipe: | 180 case NSEventTypeSwipe: |
| 183 // NSEventTypeSwipe events can't be generated using public interfaces on | 181 // NSEventTypeSwipe events can't be generated using public interfaces on |
| 184 // NSEvent, so this will need to be handled at a higher level. | 182 // NSEvent, so this will need to be handled at a higher level. |
| 185 NOTREACHED(); | 183 NOTREACHED(); |
| 186 break; | 184 break; |
| 187 default: | 185 default: |
| 188 NOTREACHED(); | 186 NOTREACHED(); |
| 189 } | 187 } |
| 190 } | 188 } |
| 191 | 189 |
| 192 NSEvent* CreateMouseEventInWindow(NSWindow* window, | 190 NSEvent* CreateMouseEventInWindow(NSWindow* window, |
| 193 ui::EventType event_type, | 191 ui::EventType event_type, |
| 194 const gfx::Point& point_in_root, | 192 const gfx::Point& point_in_root, |
| 195 int flags) { | 193 int flags) { |
| 196 NSUInteger click_count = 0; | 194 NSUInteger click_count = 0; |
| 197 if (event_type == ui::ET_MOUSE_PRESSED || | 195 if (event_type == ui::ET_MOUSE_PRESSED || |
| 198 event_type == ui::ET_MOUSE_RELEASED) { | 196 event_type == ui::ET_MOUSE_RELEASED) { |
| 199 if (flags & ui::EF_IS_TRIPLE_CLICK) | 197 if (flags & ui::EF_IS_TRIPLE_CLICK) |
| 200 click_count = 3; | 198 click_count = 3; |
| 201 else if (flags & ui::EF_IS_DOUBLE_CLICK) | 199 else if (flags & ui::EF_IS_DOUBLE_CLICK) |
| 202 click_count = 2; | 200 click_count = 2; |
| 203 else | 201 else |
| 204 click_count = 1; | 202 click_count = 1; |
| 205 } | 203 } |
| 206 NSPoint point = ConvertRootPointToTarget(window, point_in_root); | 204 NSPoint point = ConvertRootPointToTarget(window, point_in_root); |
| 207 NSUInteger modifiers = 0; | 205 NSUInteger modifiers = 0; |
| 208 NSEventType type = EventTypeToNative(event_type, flags, &modifiers); | 206 NSEventType type = EventTypeToNative(event_type, flags, &modifiers); |
| 209 return [NSEvent mouseEventWithType:type | 207 if (type == NSMouseEntered || type == NSMouseExited) { |
| 210 location:point | 208 return [NSEvent enterExitEventWithType:type |
| 211 modifierFlags:modifiers | 209 location:point |
| 212 timestamp:0 | 210 modifierFlags:modifiers |
| 213 windowNumber:[window windowNumber] | 211 timestamp:0 |
| 214 context:nil | 212 windowNumber:[window windowNumber] |
| 215 eventNumber:0 | 213 context:nil |
| 216 clickCount:click_count | 214 eventNumber:0 |
| 217 pressure:1.0]; | 215 trackingNumber:0 |
| 216 userData:nil]; | |
| 217 } else { | |
| 218 return [NSEvent mouseEventWithType:type | |
| 219 location:point | |
| 220 modifierFlags:modifiers | |
| 221 timestamp:0 | |
| 222 windowNumber:[window windowNumber] | |
| 223 context:nil | |
| 224 eventNumber:0 | |
| 225 clickCount:click_count | |
| 226 pressure:1.0]; | |
| 227 } | |
| 228 } | |
| 229 | |
| 230 NSEvent* CreateMouseWheelEventInWindow(NSWindow* window, | |
| 231 ui::MouseEvent* mouse_event) { | |
| 232 DCHECK(mouse_event->type() == ui::ET_MOUSEWHEEL); | |
| 233 ui::MouseWheelEvent* mouse_wheel_event = | |
| 234 static_cast<ui::MouseWheelEvent*>(mouse_event); | |
| 235 return cocoa_test_event_utils::TestScrollEvent( | |
| 236 ConvertRootPointToTarget(window, mouse_wheel_event->location()), window, | |
| 237 mouse_wheel_event->x_offset(), mouse_wheel_event->y_offset(), false, | |
| 238 NSEventPhaseNone, NSEventPhaseNone); | |
| 218 } | 239 } |
| 219 | 240 |
| 220 // Implementation of ui::test::EventGeneratorDelegate for Mac. Everything | 241 // Implementation of ui::test::EventGeneratorDelegate for Mac. Everything |
| 221 // defined inline is just a stub. Interesting overrides are defined below the | 242 // defined inline is just a stub. Interesting overrides are defined below the |
| 222 // class. | 243 // class. |
| 223 class EventGeneratorDelegateMac : public ui::EventTarget, | 244 class EventGeneratorDelegateMac : public ui::EventTarget, |
| 224 public ui::EventSource, | 245 public ui::EventSource, |
| 225 public ui::EventHandler, | 246 public ui::EventHandler, |
| 226 public ui::EventProcessor, | 247 public ui::EventProcessor, |
| 227 public ui::EventTargeter, | 248 public ui::EventTargeter, |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 342 ui::test::EventGenerator::default_delegate = nullptr; | 363 ui::test::EventGenerator::default_delegate = nullptr; |
| 343 } | 364 } |
| 344 | 365 |
| 345 std::unique_ptr<ui::EventTargetIterator> | 366 std::unique_ptr<ui::EventTargetIterator> |
| 346 EventGeneratorDelegateMac::GetChildIterator() const { | 367 EventGeneratorDelegateMac::GetChildIterator() const { |
| 347 // Return nullptr to dispatch all events to the result of GetRootTarget(). | 368 // Return nullptr to dispatch all events to the result of GetRootTarget(). |
| 348 return nullptr; | 369 return nullptr; |
| 349 } | 370 } |
| 350 | 371 |
| 351 void EventGeneratorDelegateMac::OnMouseEvent(ui::MouseEvent* event) { | 372 void EventGeneratorDelegateMac::OnMouseEvent(ui::MouseEvent* event) { |
| 352 NSEvent* ns_event = CreateMouseEventInWindow(window_, | 373 NSEvent* ns_event = |
| 353 event->type(), | 374 event->type() == ui::ET_MOUSEWHEEL |
| 354 event->location(), | 375 ? CreateMouseWheelEventInWindow(window_, event) |
| 355 event->changed_button_flags()); | 376 : CreateMouseEventInWindow(window_, event->type(), event->location(), |
| 377 event->changed_button_flags()); | |
| 378 | |
| 356 if (owner_->targeting_application()) | 379 if (owner_->targeting_application()) |
| 357 [NSApp sendEvent:ns_event]; | 380 [NSApp sendEvent:ns_event]; |
| 358 else | 381 else |
| 359 EmulateSendEvent(window_, ns_event); | 382 EmulateSendEvent(window_, ns_event); |
| 360 } | 383 } |
| 361 | 384 |
| 362 void EventGeneratorDelegateMac::OnKeyEvent(ui::KeyEvent* event) { | 385 void EventGeneratorDelegateMac::OnKeyEvent(ui::KeyEvent* event) { |
| 363 NSUInteger modifiers = EventFlagsToModifiers(event->flags()); | 386 NSUInteger modifiers = EventFlagsToModifiers(event->flags()); |
| 364 NSEvent* ns_event = cocoa_test_event_utils::SynthesizeKeyEvent( | 387 NSEvent* ns_event = cocoa_test_event_utils::SynthesizeKeyEvent( |
| 365 window_, event->type() == ui::ET_KEY_PRESSED, event->key_code(), | 388 window_, event->type() == ui::ET_KEY_PRESSED, event->key_code(), |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 491 - (NSEvent*)currentEvent { | 514 - (NSEvent*)currentEvent { |
| 492 if (g_current_event) | 515 if (g_current_event) |
| 493 return g_current_event; | 516 return g_current_event; |
| 494 | 517 |
| 495 // Find the original implementation and invoke it. | 518 // Find the original implementation and invoke it. |
| 496 IMP original = EventGeneratorDelegateMac::GetInstance()->CurrentEventMethod(); | 519 IMP original = EventGeneratorDelegateMac::GetInstance()->CurrentEventMethod(); |
| 497 return original(self, _cmd); | 520 return original(self, _cmd); |
| 498 } | 521 } |
| 499 | 522 |
| 500 @end | 523 @end |
| OLD | NEW |