Index: ui/views/view_unittest_mac.mm |
diff --git a/ui/views/view_unittest_mac.mm b/ui/views/view_unittest_mac.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..da5c79babb8e1dadadfd84fabc6963ca25b7d711 |
--- /dev/null |
+++ b/ui/views/view_unittest_mac.mm |
@@ -0,0 +1,132 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import <Cocoa/Cocoa.h> |
+ |
+#include "base/mac/scoped_nsobject.h" |
tapted
2017/02/20 23:14:21
nit: import
themblsha
2017/02/21 13:00:51
Done.
|
+#include "base/optional.h" |
+#include "ui/events/gesture_event_details.h" |
+#include "ui/views/test/widget_test.h" |
+#include "ui/views/view.h" |
tapted
2017/02/20 23:14:21
nit: move this one all the way to the top (above C
themblsha
2017/02/21 13:00:51
Done.
|
+ |
+// We can't create NSEventTypeSwipe using normal means, and rely on duck typing |
+// instead. |
+@interface FakeSwipeEvent : NSEvent |
+@property CGFloat deltaX; |
+@property CGFloat deltaY; |
+@property(assign) NSWindow* window; |
+@property NSPoint locationInWindow; |
+@property NSEventModifierFlags modifierFlags; |
+@property NSTimeInterval timestamp; |
+@end |
+ |
+@implementation FakeSwipeEvent |
+@synthesize deltaX; |
+@synthesize deltaY; |
+@synthesize window; |
+@synthesize locationInWindow; |
+@synthesize modifierFlags; |
+@synthesize timestamp; |
+ |
+- (NSEventType)type { |
+ return NSEventTypeSwipe; |
+} |
+ |
+- (NSEventSubtype)subtype { |
+ return static_cast<NSEventSubtype>(0); |
tapted
2017/02/20 23:14:21
0 is `NSEventSubtypeWindowExposed` - maybe `return
themblsha
2017/02/21 13:00:51
In my testing the Swipe events all had 0 as their
tapted
2017/02/22 00:04:44
Acknowledged.
|
+} |
+@end |
+ |
+namespace views { |
+ |
tapted
2017/02/20 23:14:21
add anonymous
namespace {
themblsha
2017/02/21 13:00:51
Done.
|
+// Stores last received swipe gesture direction vector in |
+// |last_swipe_gesture()|. |
+class ThreeFingerSwipeView : public View { |
+ public: |
+ ThreeFingerSwipeView() {} |
+ |
+ // views::View: |
tapted
2017/02/20 23:14:21
nit: remove `views::`
themblsha
2017/02/21 13:00:51
Done.
|
+ void OnGestureEvent(ui::GestureEvent* event) override { |
+ DCHECK_EQ(event->details().type(), ui::ET_GESTURE_SWIPE); |
tapted
2017/02/20 23:14:21
nit: EXPECT_EQ(ui::ET_GESTURE_SWIPE, event->detail
themblsha
2017/02/21 13:00:52
Thanks! I fixed the EXPECTs at the bottom of the f
|
+ |
+ int dx = 0, dy = 0; |
+ if (event->details().swipe_left()) |
+ dx = -1; |
+ |
+ if (event->details().swipe_right()) { |
+ DCHECK_EQ(dx, 0); |
tapted
2017/02/20 23:14:21
EXPECT_EQ(0, dx)
themblsha
2017/02/21 13:00:51
Done.
|
+ dx = 1; |
+ } |
+ |
+ if (event->details().swipe_down()) |
+ dy = 1; |
+ |
+ if (event->details().swipe_up()) { |
+ DCHECK_EQ(dy, 0); |
tapted
2017/02/20 23:14:21
EXPECT_EQ(0, dy);
themblsha
2017/02/21 13:00:51
Done.
|
+ dy = -1; |
+ } |
+ |
+ last_swipe_gesture_ = gfx::Point(dx, dy); |
+ } |
+ |
+ base::Optional<gfx::Point> last_swipe_gesture() const { |
+ return last_swipe_gesture_; |
+ } |
+ |
+ private: |
+ base::Optional<gfx::Point> last_swipe_gesture_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ThreeFingerSwipeView); |
+}; |
+ |
tapted
2017/02/20 23:14:21
conventionally, the
} // namespace
would go her
themblsha
2017/02/21 13:00:51
Also works when placed at the end of the ViewMacTe
|
+class ViewMacTest : public test::WidgetTest { |
+ public: |
+ base::Optional<gfx::Point> SwipeGestureVector(int dx, int dy) { |
+ base::scoped_nsobject<FakeSwipeEvent> swipe_event( |
+ [[FakeSwipeEvent alloc] init]); |
+ swipe_event.get().deltaX = dx; |
tapted
2017/02/20 23:14:21
[swipe_event setDeltaX:dx]
same for all the stuff
themblsha
2017/02/21 13:00:51
Done.
|
+ swipe_event.get().deltaY = dy; |
+ swipe_event.get().window = widget_->GetNativeWindow(); |
+ swipe_event.get().locationInWindow = NSMakePoint(50, 50); |
+ swipe_event.get().timestamp = [[NSProcessInfo processInfo] systemUptime]; |
+ |
+ // BridgedContentView should create an appropriate ui::GestureEvent and pass |
+ // it to the views::Widget. |
+ [[widget_->GetNativeWindow() contentView] swipeWithEvent:swipe_event]; |
+ return view_->last_swipe_gesture(); |
+ } |
+ |
+ // testing::Test: |
+ void SetUp() override { |
+ WidgetTest::SetUp(); |
+ |
+ widget_ = CreateTopLevelPlatformWidget(); |
+ const gfx::Rect bounds(0, 0, 100, 100); |
+ widget_->SetBounds(bounds); |
+ widget_->Show(); |
+ |
+ view_ = new ThreeFingerSwipeView; |
+ view_->SetBoundsRect(bounds); |
tapted
2017/02/20 23:14:21
This will make the view bigger than the window's c
themblsha
2017/02/21 13:00:51
There seems to be a lot of tests which set up the
|
+ widget_->GetContentsView()->AddChildView(view_); |
+ } |
+ |
+ void TearDown() override { |
+ widget_->CloseNow(); |
+ WidgetTest::TearDown(); |
+ } |
+ |
+ private: |
+ Widget* widget_ = nullptr; |
+ ThreeFingerSwipeView* view_ = nullptr; |
+}; |
tapted
2017/02/20 23:14:21
nit: DISALLOW_COPY_AND_ASSIGN(..) (you'll need to
themblsha
2017/02/21 13:00:51
Done.
|
+ |
+// Three-finger swipes send immediate events and they cannot be tracked. |
+TEST_F(ViewMacTest, HandlesThreeFingerSwipeGestures) { |
+ EXPECT_EQ(gfx::Point(1, 0), *SwipeGestureVector(-1, 0)); |
tapted
2017/02/20 23:14:21
nit: a comment like "Note that positive delta is l
themblsha
2017/02/21 13:00:51
Done.
|
+ EXPECT_EQ(gfx::Point(-1, 0), *SwipeGestureVector(1, 0)); |
+ EXPECT_EQ(gfx::Point(0, 1), *SwipeGestureVector(0, -1)); |
+ EXPECT_EQ(gfx::Point(0, -1), *SwipeGestureVector(0, 1)); |
+} |
+ |
+} // namespace views |