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 <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "base/mac/scoped_cftyperef.h" | 10 #include "base/mac/scoped_cftyperef.h" |
11 #include "base/mac/sdk_forward_declarations.h" | 11 #include "base/mac/sdk_forward_declarations.h" |
12 #include "base/macros.h" | 12 #include "base/macros.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 #import "ui/events/cocoa/cocoa_event_utils.h" |
14 #include "ui/events/event_constants.h" | 15 #include "ui/events/event_constants.h" |
15 #include "ui/events/event_utils.h" | 16 #include "ui/events/event_utils.h" |
16 #import "ui/events/test/cocoa_test_event_utils.h" | 17 #import "ui/events/test/cocoa_test_event_utils.h" |
17 #include "ui/gfx/geometry/point.h" | 18 #include "ui/gfx/geometry/point.h" |
18 #import "ui/gfx/test/ui_cocoa_test_helper.h" | 19 #import "ui/gfx/test/ui_cocoa_test_helper.h" |
19 | 20 |
20 namespace ui { | 21 namespace ui { |
21 | 22 |
22 namespace { | 23 namespace { |
23 | 24 |
(...skipping 30 matching lines...) Expand all Loading... |
54 base::ScopedCFTypeRef<CGEventRef> mouse( | 55 base::ScopedCFTypeRef<CGEventRef> mouse( |
55 CGEventCreateMouseEvent(nullptr, type, screen_point, other_button)); | 56 CGEventCreateMouseEvent(nullptr, type, screen_point, other_button)); |
56 CGEventSetFlags(mouse, event_flags); | 57 CGEventSetFlags(mouse, event_flags); |
57 return cocoa_test_event_utils::AttachWindowToCGEvent(mouse, test_window()); | 58 return cocoa_test_event_utils::AttachWindowToCGEvent(mouse, test_window()); |
58 } | 59 } |
59 | 60 |
60 // Creates a scroll event from a "real" mouse wheel (i.e. not a trackpad). | 61 // Creates a scroll event from a "real" mouse wheel (i.e. not a trackpad). |
61 NSEvent* TestScrollEvent(const gfx::Point& window_location, | 62 NSEvent* TestScrollEvent(const gfx::Point& window_location, |
62 int32_t delta_x, | 63 int32_t delta_x, |
63 int32_t delta_y) { | 64 int32_t delta_y) { |
| 65 bool precise = false; |
64 return cocoa_test_event_utils::TestScrollEvent( | 66 return cocoa_test_event_utils::TestScrollEvent( |
65 Flip(window_location).ToCGPoint(), test_window(), delta_x, delta_y); | 67 Flip(window_location).ToCGPoint(), test_window(), delta_x, delta_y, |
| 68 precise, NSEventPhaseNone, NSEventPhaseNone); |
66 } | 69 } |
67 | 70 |
| 71 // Creates the sequence of events generated by a trackpad scroll. |
| 72 // |initial_rest| indicates whether there is a pause before scrolling starts. |
| 73 // |delta_y| is the portion to scroll without momentum (fingers on the |
| 74 // trackpad). |momentum_delta_y| is the momentum portion. A zero delta skips |
| 75 // that phase (if both are zero, the |initial_rest| is cancelled). |
| 76 NSArray* TrackpadScrollSequence(bool initial_rest, |
| 77 int32_t delta_y, |
| 78 int32_t momentum_delta_y); |
| 79 |
| 80 protected: |
| 81 const gfx::Point default_location_ = gfx::Point(10, 20); |
| 82 |
68 private: | 83 private: |
69 DISALLOW_COPY_AND_ASSIGN(EventsMacTest); | 84 DISALLOW_COPY_AND_ASSIGN(EventsMacTest); |
70 }; | 85 }; |
71 | 86 |
| 87 // Trackpad scroll sequences below determined empirically on OSX 10.11 (linking |
| 88 // to 10.10 SDK), and dumping out with NSLog in -[NSView scrollWheel:]. First |
| 89 // created using a Magic Trackpad 2 on a MacPro. See the Trackpad* test cases |
| 90 // below for example event streams. |
| 91 NSArray* EventsMacTest::TrackpadScrollSequence(bool initial_rest, |
| 92 int32_t delta_y, |
| 93 int32_t momentum_delta_y) { |
| 94 int32_t delta_x = 0; // Just test vertical scrolling for now. |
| 95 base::scoped_nsobject<NSMutableArray> events([[NSMutableArray alloc] init]); |
| 96 |
| 97 // Resting part. |
| 98 if (initial_rest) { |
| 99 // MayBegin always has a zero delta. |
| 100 [events addObject:cocoa_test_event_utils::TestScrollEvent( |
| 101 Flip(default_location_).ToCGPoint(), test_window(), delta_x, 0, true, |
| 102 NSEventPhaseMayBegin, NSEventPhaseNone)]; |
| 103 if (delta_y == 0) { |
| 104 // Rest and release: event gets cancelled. |
| 105 DCHECK_EQ(0, momentum_delta_y); // Pretty sure this is impossible. |
| 106 [events addObject:cocoa_test_event_utils::TestScrollEvent( |
| 107 Flip(default_location_).ToCGPoint(), test_window(), delta_x, 0, true, |
| 108 NSEventPhaseCancelled, NSEventPhaseNone)]; |
| 109 return events.autorelease(); |
| 110 } |
| 111 } |
| 112 |
| 113 // With or without a rest, a begin is sent. It can have a non-zero |
| 114 // deviceDeltaY but regular deltaY is always 0. |
| 115 [events addObject:cocoa_test_event_utils::TestScrollEvent( |
| 116 Flip(default_location_).ToCGPoint(), test_window(), delta_x, 0, true, |
| 117 NSEventPhaseBegan, NSEventPhaseNone)]; |
| 118 |
| 119 [events addObject:cocoa_test_event_utils::TestScrollEvent( |
| 120 Flip(default_location_).ToCGPoint(), test_window(), delta_x, delta_y, |
| 121 true, NSEventPhaseChanged, NSEventPhaseNone)]; |
| 122 |
| 123 // With or without momentum, an end is sent for the non-momentum part. |
| 124 [events addObject:cocoa_test_event_utils::TestScrollEvent( |
| 125 Flip(default_location_).ToCGPoint(), test_window(), delta_x, 0, true, |
| 126 NSEventPhaseEnded, NSEventPhaseNone)]; |
| 127 |
| 128 if (momentum_delta_y == 0) |
| 129 return events.autorelease(); |
| 130 |
| 131 // Flick part. Basically the same, but with phase and momentumPhase swapped. |
| 132 [events addObject:cocoa_test_event_utils::TestScrollEvent( |
| 133 Flip(default_location_).ToCGPoint(), test_window(), delta_x, 0, true, |
| 134 NSEventPhaseNone, NSEventPhaseBegan)]; |
| 135 |
| 136 [events addObject:cocoa_test_event_utils::TestScrollEvent( |
| 137 Flip(default_location_).ToCGPoint(), test_window(), delta_x, |
| 138 momentum_delta_y, true, NSEventPhaseNone, NSEventPhaseChanged)]; |
| 139 |
| 140 [events addObject:cocoa_test_event_utils::TestScrollEvent( |
| 141 Flip(default_location_).ToCGPoint(), test_window(), delta_x, 0, true, |
| 142 NSEventPhaseNone, NSEventPhaseEnded)]; |
| 143 return events.autorelease(); |
| 144 } |
| 145 |
72 } // namespace | 146 } // namespace |
73 | 147 |
74 TEST_F(EventsMacTest, EventFlagsFromNative) { | 148 TEST_F(EventsMacTest, EventFlagsFromNative) { |
75 // Left click. | 149 // Left click. |
76 NSEvent* left = cocoa_test_event_utils::MouseEventWithType(NSLeftMouseUp, 0); | 150 NSEvent* left = cocoa_test_event_utils::MouseEventWithType(NSLeftMouseUp, 0); |
77 EXPECT_EQ(EF_LEFT_MOUSE_BUTTON, EventFlagsFromNative(left)); | 151 EXPECT_EQ(EF_LEFT_MOUSE_BUTTON, EventFlagsFromNative(left)); |
78 | 152 |
79 // Right click. | 153 // Right click. |
80 NSEvent* right = cocoa_test_event_utils::MouseEventWithType(NSRightMouseUp, | 154 NSEvent* right = cocoa_test_event_utils::MouseEventWithType(NSRightMouseUp, |
81 0); | 155 0); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 ui::EventFlagsFromNative(event)); | 222 ui::EventFlagsFromNative(event)); |
149 EXPECT_EQ(location, ui::EventLocationFromNative(event)); | 223 EXPECT_EQ(location, ui::EventLocationFromNative(event)); |
150 | 224 |
151 event = TestMouseEvent(kCGEventRightMouseUp, location, kNoEventFlags); | 225 event = TestMouseEvent(kCGEventRightMouseUp, location, kNoEventFlags); |
152 EXPECT_EQ(ui::ET_MOUSE_RELEASED, ui::EventTypeFromNative(event)); | 226 EXPECT_EQ(ui::ET_MOUSE_RELEASED, ui::EventTypeFromNative(event)); |
153 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, ui::EventFlagsFromNative(event)); | 227 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, ui::EventFlagsFromNative(event)); |
154 EXPECT_EQ(location, ui::EventLocationFromNative(event)); | 228 EXPECT_EQ(location, ui::EventLocationFromNative(event)); |
155 | 229 |
156 // Scroll up. | 230 // Scroll up. |
157 event = TestScrollEvent(location, 0, 1); | 231 event = TestScrollEvent(location, 0, 1); |
158 EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(event)); | 232 EXPECT_EQ(ui::ET_SCROLL, ui::EventTypeFromNative(event)); |
159 EXPECT_EQ(0, ui::EventFlagsFromNative(event)); | 233 EXPECT_EQ(0, ui::EventFlagsFromNative(event)); |
160 EXPECT_EQ(location.ToString(), ui::EventLocationFromNative(event).ToString()); | 234 EXPECT_EQ(location.ToString(), ui::EventLocationFromNative(event).ToString()); |
161 offset = ui::GetMouseWheelOffset(event); | 235 offset = ui::GetMouseWheelOffset(event); |
162 EXPECT_GT(offset.y(), 0); | 236 EXPECT_GT(offset.y(), 0); |
163 EXPECT_EQ(0, offset.x()); | 237 EXPECT_EQ(0, offset.x()); |
164 | 238 |
165 // Scroll down. | 239 // Scroll down. |
166 event = TestScrollEvent(location, 0, -1); | 240 event = TestScrollEvent(location, 0, -1); |
167 EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(event)); | 241 EXPECT_EQ(ui::ET_SCROLL, ui::EventTypeFromNative(event)); |
168 EXPECT_EQ(0, ui::EventFlagsFromNative(event)); | 242 EXPECT_EQ(0, ui::EventFlagsFromNative(event)); |
169 EXPECT_EQ(location, ui::EventLocationFromNative(event)); | 243 EXPECT_EQ(location, ui::EventLocationFromNative(event)); |
170 offset = ui::GetMouseWheelOffset(event); | 244 offset = ui::GetMouseWheelOffset(event); |
171 EXPECT_LT(offset.y(), 0); | 245 EXPECT_LT(offset.y(), 0); |
172 EXPECT_EQ(0, offset.x()); | 246 EXPECT_EQ(0, offset.x()); |
173 | 247 |
174 // Scroll left. | 248 // Scroll left. |
175 event = TestScrollEvent(location, 1, 0); | 249 event = TestScrollEvent(location, 1, 0); |
176 EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(event)); | 250 EXPECT_EQ(ui::ET_SCROLL, ui::EventTypeFromNative(event)); |
177 EXPECT_EQ(0, ui::EventFlagsFromNative(event)); | 251 EXPECT_EQ(0, ui::EventFlagsFromNative(event)); |
178 EXPECT_EQ(location, ui::EventLocationFromNative(event)); | 252 EXPECT_EQ(location, ui::EventLocationFromNative(event)); |
179 offset = ui::GetMouseWheelOffset(event); | 253 offset = ui::GetMouseWheelOffset(event); |
180 EXPECT_EQ(0, offset.y()); | 254 EXPECT_EQ(0, offset.y()); |
181 EXPECT_GT(offset.x(), 0); | 255 EXPECT_GT(offset.x(), 0); |
182 | 256 |
183 // Scroll right. | 257 // Scroll right. |
184 event = TestScrollEvent(location, -1, 0); | 258 event = TestScrollEvent(location, -1, 0); |
185 EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(event)); | 259 EXPECT_EQ(ui::ET_SCROLL, ui::EventTypeFromNative(event)); |
186 EXPECT_EQ(0, ui::EventFlagsFromNative(event)); | 260 EXPECT_EQ(0, ui::EventFlagsFromNative(event)); |
187 EXPECT_EQ(location, ui::EventLocationFromNative(event)); | 261 EXPECT_EQ(location, ui::EventLocationFromNative(event)); |
188 offset = ui::GetMouseWheelOffset(event); | 262 offset = ui::GetMouseWheelOffset(event); |
189 EXPECT_EQ(0, offset.y()); | 263 EXPECT_EQ(0, offset.y()); |
190 EXPECT_LT(offset.x(), 0); | 264 EXPECT_LT(offset.x(), 0); |
191 } | 265 } |
192 | 266 |
193 // Test correct location when the window has a native titlebar. | 267 // Test correct location when the window has a native titlebar. |
194 TEST_F(EventsMacTest, NativeTitlebarEventLocation) { | 268 TEST_F(EventsMacTest, NativeTitlebarEventLocation) { |
195 gfx::Point location(5, 10); | 269 gfx::Point location(5, 10); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 | 328 |
255 event = cocoa_test_event_utils::MouseEventWithType(NSMouseMoved, 0); | 329 event = cocoa_test_event_utils::MouseEventWithType(NSMouseMoved, 0); |
256 EXPECT_EQ(ui::ET_MOUSE_MOVED, ui::EventTypeFromNative(event)); | 330 EXPECT_EQ(ui::ET_MOUSE_MOVED, ui::EventTypeFromNative(event)); |
257 | 331 |
258 event = cocoa_test_event_utils::EnterEvent(); | 332 event = cocoa_test_event_utils::EnterEvent(); |
259 EXPECT_EQ(ui::ET_MOUSE_ENTERED, ui::EventTypeFromNative(event)); | 333 EXPECT_EQ(ui::ET_MOUSE_ENTERED, ui::EventTypeFromNative(event)); |
260 event = cocoa_test_event_utils::ExitEvent(); | 334 event = cocoa_test_event_utils::ExitEvent(); |
261 EXPECT_EQ(ui::ET_MOUSE_EXITED, ui::EventTypeFromNative(event)); | 335 EXPECT_EQ(ui::ET_MOUSE_EXITED, ui::EventTypeFromNative(event)); |
262 } | 336 } |
263 | 337 |
| 338 // Verify that a mouse wheel scroll event is correctly lacking phase data. |
| 339 TEST_F(EventsMacTest, MouseWheelScroll) { |
| 340 int32_t wheel_delta_y = 2; |
| 341 |
| 342 NSEvent* ns_wheel = TestScrollEvent(default_location_, 0, wheel_delta_y); |
| 343 EXPECT_FALSE([ns_wheel hasPreciseScrollingDeltas]); |
| 344 ui::ScrollEvent wheel(ns_wheel); |
| 345 EXPECT_EQ(ui::ET_SCROLL, wheel.type()); |
| 346 |
| 347 // Currently wheel events still say two for finger count, but this may change. |
| 348 EXPECT_EQ(2, wheel.finger_count()); |
| 349 |
| 350 // Note the phase is "end" for wheel events, not "none". There is always an |
| 351 // "end" when no more events are expected. |
| 352 EXPECT_EQ(ui::EventMomentumPhase::END, wheel.momentum_phase()); |
| 353 EXPECT_EQ(default_location_, wheel.location()); |
| 354 |
| 355 float pixel_delta_y = wheel_delta_y * ui::kScrollbarPixelsPerCocoaTick; |
| 356 EXPECT_EQ(pixel_delta_y, wheel.y_offset_ordinal()); |
| 357 EXPECT_EQ(0, wheel.x_offset_ordinal()); |
| 358 } |
| 359 |
| 360 // Test the event flow for a trackpad "rest" that doesn't result in scrolling |
| 361 // nor momentum. Also check the boring stuff like type, finger count and |
| 362 // location, which isn't phase-specific. |
| 363 // Sequence: |
| 364 // (1) NSEvent: type=ScrollWheel loc=(780,41) time=14909.3 flags=0x100 win=<set> |
| 365 // {deviceD,d}elta{X,Y,Z}=0 count:0 phase=MayBegin momentumPhase=None |
| 366 // (2) NSEvent: type=ScrollWheel loc=(780,41) time=14912.9 flags=0x100 win=<set> |
| 367 // {deviceD,d}elta{X,Y,Z}=0 count:0 phase=Cancelled momentumPhase=None. |
| 368 TEST_F(EventsMacTest, TrackpadRestRelease) { |
| 369 NSArray* ns_events = TrackpadScrollSequence(true, 0, 0); |
| 370 ASSERT_EQ(2u, [ns_events count]); |
| 371 EXPECT_TRUE([ns_events[0] hasPreciseScrollingDeltas]); |
| 372 |
| 373 ui::ScrollEvent rest(ns_events[0]); |
| 374 EXPECT_EQ(ui::ET_SCROLL, rest.type()); |
| 375 EXPECT_EQ(2, rest.finger_count()); |
| 376 EXPECT_EQ(ui::EventMomentumPhase::MAY_BEGIN, rest.momentum_phase()); |
| 377 EXPECT_EQ(0, rest.y_offset_ordinal()); |
| 378 EXPECT_EQ(default_location_, rest.location()); |
| 379 |
| 380 ui::ScrollEvent cancel(ns_events[1]); |
| 381 EXPECT_EQ(ui::ET_SCROLL, cancel.type()); |
| 382 EXPECT_EQ(2, cancel.finger_count()); |
| 383 EXPECT_EQ(ui::EventMomentumPhase::END, cancel.momentum_phase()); |
| 384 EXPECT_EQ(0, cancel.y_offset_ordinal()); |
| 385 EXPECT_EQ(default_location_, cancel.location()); |
| 386 } |
| 387 |
| 388 // Test the event flow for touching the trackpad while "in motion" already, then |
| 389 // pausing so that a flick is not generated. deltaX and deltaZ are always zero. |
| 390 // Note, deviceDeltaX may take on an integer value even though deltaX is zero. |
| 391 // Sequence: |
| 392 // (1) NSEvent: type=ScrollWheel loc=(780,41) time=15263.2 flags=0x100 win=<set> |
| 393 // deltaY=0.000000 deviceDeltaY=1.000000 phase=Began momentumPhase=None |
| 394 // (n) NSEvent: type=ScrollWheel loc=(780,41) time=15263.2 flags=0x100 win=<set> |
| 395 // deltaY=0.400024 deviceDeltaY=3.000000 phase=Changed momentumPhase=None |
| 396 // (3) NSEvent: type=ScrollWheel loc=(780,41) time=15264.2 flags=0x100 win=<set> |
| 397 // deltaY=0.000000 deviceDeltaY=0.000000 phase=Ended momentumPhase=None. |
| 398 TEST_F(EventsMacTest, TrackpadScrollThenRest) { |
| 399 int32_t delta_y = 21; |
| 400 |
| 401 NSArray* ns_events = TrackpadScrollSequence(false, delta_y, 0); |
| 402 ASSERT_EQ(3u, [ns_events count]); |
| 403 |
| 404 ui::ScrollEvent begin(ns_events[0]); |
| 405 EXPECT_EQ(ui::EventMomentumPhase::MAY_BEGIN, begin.momentum_phase()); |
| 406 EXPECT_EQ(0, begin.y_offset_ordinal()); |
| 407 |
| 408 ui::ScrollEvent update(ns_events[1]); |
| 409 // There's no momentum yet, so phase is none. |
| 410 EXPECT_EQ(ui::EventMomentumPhase::NONE, update.momentum_phase()); |
| 411 // Note: No pixel conversion for "precise" deltas. |
| 412 EXPECT_EQ(delta_y, update.y_offset_ordinal()); |
| 413 |
| 414 ui::ScrollEvent end(ns_events[2]); |
| 415 EXPECT_EQ(ui::EventMomentumPhase::END, end.momentum_phase()); |
| 416 EXPECT_EQ(0, end.y_offset_ordinal()); |
| 417 } |
| 418 |
| 419 // Same as the above, but with an initial rest, which is not cancelled. This |
| 420 // results in multiple MAY_BEGIN phases. |
| 421 TEST_F(EventsMacTest, TrackpadRestThenScrollThenRest) { |
| 422 int32_t delta_y = 21; |
| 423 |
| 424 NSArray* ns_events = TrackpadScrollSequence(true, delta_y, 0); |
| 425 ASSERT_EQ(4u, [ns_events count]); |
| 426 |
| 427 ui::ScrollEvent rest(ns_events[0]); |
| 428 EXPECT_EQ(ui::EventMomentumPhase::MAY_BEGIN, rest.momentum_phase()); |
| 429 EXPECT_EQ(0, rest.y_offset_ordinal()); |
| 430 |
| 431 ui::ScrollEvent begin(ns_events[1]); |
| 432 EXPECT_EQ(ui::EventMomentumPhase::MAY_BEGIN, begin.momentum_phase()); |
| 433 EXPECT_EQ(0, begin.y_offset_ordinal()); |
| 434 |
| 435 ui::ScrollEvent update(ns_events[2]); |
| 436 EXPECT_EQ(ui::EventMomentumPhase::NONE, update.momentum_phase()); |
| 437 EXPECT_EQ(delta_y, update.y_offset_ordinal()); |
| 438 |
| 439 ui::ScrollEvent end(ns_events[3]); |
| 440 EXPECT_EQ(ui::EventMomentumPhase::END, end.momentum_phase()); |
| 441 EXPECT_EQ(0, end.y_offset_ordinal()); |
| 442 } |
| 443 |
| 444 // Test the event flows that lead to momentum, with and without an initial rest. |
| 445 // Example sequence (no initial rest): |
| 446 // (1) NSEvent: type=ScrollWheel loc=(780,41) time=15187.5 flags=0x100 win=<set> |
| 447 // deltaY=0.000000 deviceDeltaY=1.000000 phase=Began momentumPhase=None |
| 448 // (n) NSEvent: type=ScrollWheel loc=(780,41) time=15187.5 flags=0x100 win=<set> |
| 449 // deltaY=0.500031 deviceDeltaY=4.000000 phase=Changed momentumPhase=None |
| 450 // (3) NSEvent: type=ScrollWheel loc=(780,41) time=15187.6 flags=0x100 win=<set> |
| 451 // deltaY=0.000000 deviceDeltaY=0.000000 phase=Ended momentumPhase=None |
| 452 // (4) NSEvent: type=ScrollWheel loc=(780,41) time=15187.6 flags=0x100 win=<set> |
| 453 // deltaY=0.900055 deviceDeltaY=3.000000 phase=None momentumPhase=Began |
| 454 // (n) NSEvent: type=ScrollWheel loc=(780,41) time=15187.6 flags=0x100 win=<set> |
| 455 // deltaY=0.300018 deviceDeltaY=3.000000 phase=None momentumPhase=Changed |
| 456 // (6) NSEvent: type=ScrollWheel loc=(780,41) time=15188.0 flags=0x100 win=<set> |
| 457 // deltaY=0.000000 deviceDeltaY=0.000000 phase=None momentumPhase=Ended. |
| 458 TEST_F(EventsMacTest, TrackpadScrollThenFlick) { |
| 459 int32_t delta_y = 21; |
| 460 int32_t momentum_delta_y = 33; |
| 461 |
| 462 NSArray* ns_events = TrackpadScrollSequence(false, delta_y, momentum_delta_y); |
| 463 ASSERT_EQ(6u, [ns_events count]); |
| 464 |
| 465 // Non-momentum part. |
| 466 { |
| 467 ui::ScrollEvent begin(ns_events[0]); |
| 468 EXPECT_EQ(ui::EventMomentumPhase::MAY_BEGIN, begin.momentum_phase()); |
| 469 EXPECT_EQ(0, begin.y_offset_ordinal()); |
| 470 |
| 471 ui::ScrollEvent update(ns_events[1]); |
| 472 EXPECT_EQ(ui::EventMomentumPhase::NONE, update.momentum_phase()); |
| 473 EXPECT_EQ(delta_y, update.y_offset_ordinal()); |
| 474 |
| 475 ui::ScrollEvent end(ns_events[2]); |
| 476 // Even though the event stream continues, AppKit doesn't provide a way to |
| 477 // know this without peeking at future events. So this "end" mid-stream is |
| 478 // unavoidable. |
| 479 EXPECT_EQ(ui::EventMomentumPhase::END, end.momentum_phase()); |
| 480 EXPECT_EQ(0, end.y_offset_ordinal()); |
| 481 } |
| 482 // Momentum part. |
| 483 { |
| 484 ui::ScrollEvent begin(ns_events[3]); |
| 485 // Since a momentum "begin" is really a continuation of the stream, it's |
| 486 // currently treated as an update, but the offsets should always be zero. |
| 487 EXPECT_EQ(ui::EventMomentumPhase::INERTIAL_UPDATE, begin.momentum_phase()); |
| 488 EXPECT_EQ(0, begin.y_offset_ordinal()); |
| 489 |
| 490 ui::ScrollEvent update(ns_events[4]); |
| 491 EXPECT_EQ(ui::EventMomentumPhase::INERTIAL_UPDATE, update.momentum_phase()); |
| 492 EXPECT_EQ(momentum_delta_y, update.y_offset_ordinal()); |
| 493 |
| 494 ui::ScrollEvent end(ns_events[5]); |
| 495 EXPECT_EQ(ui::EventMomentumPhase::END, end.momentum_phase()); |
| 496 EXPECT_EQ(0, end.y_offset_ordinal()); |
| 497 } |
| 498 } |
| 499 |
264 } // namespace ui | 500 } // namespace ui |
OLD | NEW |