Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 #include "ash/aura/wm_window_aura.h" | 5 #include "ash/aura/wm_window_aura.h" |
| 6 #include "ash/common/wm/window_positioner.h" | 6 #include "ash/common/wm/window_positioner.h" |
| 7 #include "ash/common/wm/window_positioning_utils.h" | 7 #include "ash/common/wm/window_positioning_utils.h" |
| 8 #include "ash/common/wm_shell.h" | 8 #include "ash/common/wm_shell.h" |
| 9 #include "ash/public/cpp/shell_window_ids.h" | 9 #include "ash/public/cpp/shell_window_ids.h" |
| 10 #include "ash/shell.h" | 10 #include "ash/shell.h" |
| 11 #include "components/exo/buffer.h" | 11 #include "components/exo/buffer.h" |
| 12 #include "components/exo/shell_surface.h" | 12 #include "components/exo/shell_surface.h" |
| 13 #include "components/exo/surface.h" | 13 #include "components/exo/surface.h" |
| 14 #include "components/exo/test/exo_test_base.h" | 14 #include "components/exo/test/exo_test_base.h" |
| 15 #include "components/exo/test/exo_test_helper.h" | 15 #include "components/exo/test/exo_test_helper.h" |
| 16 #include "components/exo/touch.h" | 16 #include "components/exo/touch.h" |
| 17 #include "components/exo/touch_delegate.h" | 17 #include "components/exo/touch_delegate.h" |
| 18 #include "components/exo/touch_stylus_delegate.h" | |
| 18 #include "testing/gmock/include/gmock/gmock.h" | 19 #include "testing/gmock/include/gmock/gmock.h" |
| 19 #include "ui/events/base_event_utils.h" | 20 #include "ui/events/base_event_utils.h" |
| 20 #include "ui/events/test/event_generator.h" | 21 #include "ui/events/test/event_generator.h" |
| 21 #include "ui/views/widget/widget.h" | 22 #include "ui/views/widget/widget.h" |
| 22 | 23 |
| 23 namespace exo { | 24 namespace exo { |
| 24 namespace { | 25 namespace { |
| 25 | 26 |
| 26 using TouchTest = test::ExoTestBase; | 27 class TouchTest : public test::ExoTestBase {}; |
|
reveman
2016/12/08 23:17:14
why is this changing?
denniskempin
2016/12/15 21:16:49
Done.
| |
| 27 | 28 |
| 28 class MockTouchDelegate : public TouchDelegate { | 29 class MockTouchDelegate : public TouchDelegate { |
| 29 public: | 30 public: |
| 30 MockTouchDelegate() {} | 31 MockTouchDelegate() {} |
| 31 | 32 |
| 32 // Overridden from TouchDelegate: | 33 // Overridden from TouchDelegate: |
| 33 MOCK_METHOD1(OnTouchDestroying, void(Touch*)); | 34 MOCK_METHOD1(OnTouchDestroying, void(Touch*)); |
| 34 MOCK_CONST_METHOD1(CanAcceptTouchEventsForSurface, bool(Surface*)); | 35 MOCK_CONST_METHOD1(CanAcceptTouchEventsForSurface, bool(Surface*)); |
| 35 MOCK_METHOD4(OnTouchDown, | 36 MOCK_METHOD4(OnTouchDown, |
| 36 void(Surface*, base::TimeTicks, int, const gfx::Point&)); | 37 void(Surface*, base::TimeTicks, int, const gfx::Point&)); |
| 37 MOCK_METHOD2(OnTouchUp, void(base::TimeTicks, int)); | 38 MOCK_METHOD2(OnTouchUp, void(base::TimeTicks, int)); |
| 38 MOCK_METHOD3(OnTouchMotion, void(base::TimeTicks, int, const gfx::Point&)); | 39 MOCK_METHOD3(OnTouchMotion, void(base::TimeTicks, int, const gfx::Point&)); |
| 39 MOCK_METHOD3(OnTouchShape, void(int, float, float)); | 40 MOCK_METHOD3(OnTouchShape, void(int, float, float)); |
| 40 MOCK_METHOD0(OnTouchFrame, void()); | 41 MOCK_METHOD0(OnTouchFrame, void()); |
| 41 MOCK_METHOD0(OnTouchCancel, void()); | 42 MOCK_METHOD0(OnTouchCancel, void()); |
| 42 }; | 43 }; |
| 43 | 44 |
| 45 class MockTouchStylusDelegate : public TouchStylusDelegate { | |
| 46 public: | |
| 47 MockTouchStylusDelegate() {} | |
| 48 | |
| 49 // Overridden from TouchStylusDelegate: | |
| 50 MOCK_METHOD1(OnTouchDestroying, void(Touch*)); | |
| 51 MOCK_METHOD2(OnTouchTool, void(int, ui::EventPointerType)); | |
| 52 MOCK_METHOD3(OnTouchForce, void(base::TimeTicks, int, float)); | |
| 53 MOCK_METHOD3(OnTouchTilt, void(base::TimeTicks, int, gfx::Vector2dF)); | |
| 54 }; | |
| 55 | |
| 44 TEST_F(TouchTest, OnTouchDown) { | 56 TEST_F(TouchTest, OnTouchDown) { |
| 45 ash::WindowPositioner::DisableAutoPositioning(true); | |
| 46 | |
| 47 std::unique_ptr<Surface> bottom_surface(new Surface); | |
| 48 std::unique_ptr<ShellSurface> bottom_shell_surface( | |
| 49 new ShellSurface(bottom_surface.get())); | |
| 50 gfx::Size bottom_buffer_size(10, 10); | |
| 51 std::unique_ptr<Buffer> bottom_buffer( | |
| 52 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(bottom_buffer_size))); | |
| 53 bottom_surface->Attach(bottom_buffer.get()); | |
| 54 bottom_surface->Commit(); | |
| 55 ash::wm::CenterWindow(ash::WmWindowAura::Get( | |
| 56 bottom_shell_surface->GetWidget()->GetNativeWindow())); | |
| 57 | |
| 58 std::unique_ptr<Surface> top_surface(new Surface); | |
| 59 std::unique_ptr<ShellSurface> top_shell_surface( | |
| 60 new ShellSurface(top_surface.get())); | |
| 61 gfx::Size top_buffer_size(8, 8); | |
| 62 std::unique_ptr<Buffer> top_buffer( | |
| 63 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(top_buffer_size))); | |
| 64 top_surface->Attach(top_buffer.get()); | |
| 65 top_surface->Commit(); | |
| 66 ash::wm::CenterWindow(ash::WmWindowAura::Get( | |
| 67 top_shell_surface->GetWidget()->GetNativeWindow())); | |
| 68 | |
| 69 MockTouchDelegate delegate; | 57 MockTouchDelegate delegate; |
| 70 std::unique_ptr<Touch> touch(new Touch(&delegate)); | 58 std::unique_ptr<Touch> touch(new Touch(&delegate)); |
| 71 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); | 59 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); |
| 72 | 60 |
| 61 auto bottom_window = exo_test_helper()->CreateWindow(10, 10, false); | |
| 62 auto top_window = exo_test_helper()->CreateWindow(8, 8, false); | |
| 63 | |
| 73 EXPECT_CALL(delegate, OnTouchShape(testing::_, testing::_, testing::_)) | 64 EXPECT_CALL(delegate, OnTouchShape(testing::_, testing::_, testing::_)) |
| 74 .Times(testing::AnyNumber()); | 65 .Times(testing::AnyNumber()); |
| 75 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(top_surface.get())) | 66 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(top_window.surface())) |
| 76 .WillRepeatedly(testing::Return(true)); | 67 .WillRepeatedly(testing::Return(true)); |
| 77 EXPECT_CALL(delegate, | 68 EXPECT_CALL(delegate, |
| 78 OnTouchDown(top_surface.get(), testing::_, 1, gfx::Point())); | 69 OnTouchDown(top_window.surface(), testing::_, 1, gfx::Point())); |
| 79 EXPECT_CALL(delegate, OnTouchFrame()); | 70 EXPECT_CALL(delegate, OnTouchFrame()); |
| 80 generator.set_current_location( | 71 generator.set_current_location(top_window.origin()); |
| 81 top_surface->window()->GetBoundsInScreen().origin()); | |
| 82 generator.PressTouchId(1); | 72 generator.PressTouchId(1); |
| 83 | 73 |
| 84 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(bottom_surface.get())) | 74 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(bottom_window.surface())) |
| 85 .WillRepeatedly(testing::Return(true)); | 75 .WillRepeatedly(testing::Return(true)); |
| 86 | 76 |
| 87 // Second touch point should be relative to the focus surface. | 77 // Second touch point should be relative to the focus surface. |
| 88 EXPECT_CALL(delegate, OnTouchDown(top_surface.get(), testing::_, 2, | 78 EXPECT_CALL(delegate, OnTouchDown(top_window.surface(), testing::_, 2, |
| 89 gfx::Point(-1, -1))); | 79 gfx::Point(-1, -1))); |
| 90 EXPECT_CALL(delegate, OnTouchFrame()); | 80 EXPECT_CALL(delegate, OnTouchFrame()); |
| 91 | 81 |
| 92 generator.set_current_location( | 82 generator.set_current_location(bottom_window.origin()); |
| 93 bottom_surface->window()->GetBoundsInScreen().origin()); | |
| 94 generator.PressTouchId(2); | 83 generator.PressTouchId(2); |
| 95 | 84 |
| 96 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); | 85 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); |
| 97 touch.reset(); | 86 touch.reset(); |
| 98 } | 87 } |
| 99 | 88 |
| 100 TEST_F(TouchTest, OnTouchUp) { | 89 TEST_F(TouchTest, OnTouchUp) { |
| 101 std::unique_ptr<Surface> surface(new Surface); | 90 auto window = exo_test_helper()->CreateWindow(10, 10, false); |
| 102 std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | |
| 103 gfx::Size buffer_size(10, 10); | |
| 104 std::unique_ptr<Buffer> buffer( | |
| 105 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); | |
| 106 surface->Attach(buffer.get()); | |
| 107 surface->Commit(); | |
| 108 | 91 |
| 109 MockTouchDelegate delegate; | 92 MockTouchDelegate delegate; |
| 110 std::unique_ptr<Touch> touch(new Touch(&delegate)); | 93 std::unique_ptr<Touch> touch(new Touch(&delegate)); |
| 111 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); | 94 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); |
| 112 | 95 |
| 113 EXPECT_CALL(delegate, OnTouchShape(testing::_, testing::_, testing::_)) | 96 EXPECT_CALL(delegate, OnTouchShape(testing::_, testing::_, testing::_)) |
| 114 .Times(testing::AnyNumber()); | 97 .Times(testing::AnyNumber()); |
| 115 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(surface.get())) | 98 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(window.surface())) |
| 116 .WillRepeatedly(testing::Return(true)); | 99 .WillRepeatedly(testing::Return(true)); |
| 117 EXPECT_CALL(delegate, | 100 EXPECT_CALL(delegate, OnTouchDown(window.surface(), testing::_, testing::_, |
| 118 OnTouchDown(surface.get(), testing::_, testing::_, gfx::Point())) | 101 gfx::Point())) |
| 119 .Times(2); | 102 .Times(2); |
| 120 EXPECT_CALL(delegate, OnTouchFrame()).Times(2); | 103 EXPECT_CALL(delegate, OnTouchFrame()).Times(2); |
| 121 generator.set_current_location( | 104 generator.set_current_location(window.origin()); |
| 122 surface->window()->GetBoundsInScreen().origin()); | |
| 123 generator.PressTouchId(1); | 105 generator.PressTouchId(1); |
| 124 generator.PressTouchId(2); | 106 generator.PressTouchId(2); |
| 125 | 107 |
| 126 EXPECT_CALL(delegate, OnTouchUp(testing::_, 1)); | 108 EXPECT_CALL(delegate, OnTouchUp(testing::_, 1)); |
| 127 EXPECT_CALL(delegate, OnTouchFrame()); | 109 EXPECT_CALL(delegate, OnTouchFrame()); |
| 128 generator.ReleaseTouchId(1); | 110 generator.ReleaseTouchId(1); |
| 129 EXPECT_CALL(delegate, OnTouchUp(testing::_, 2)); | 111 EXPECT_CALL(delegate, OnTouchUp(testing::_, 2)); |
| 130 EXPECT_CALL(delegate, OnTouchFrame()); | 112 EXPECT_CALL(delegate, OnTouchFrame()); |
| 131 generator.ReleaseTouchId(2); | 113 generator.ReleaseTouchId(2); |
| 132 | 114 |
| 133 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); | 115 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); |
| 134 touch.reset(); | 116 touch.reset(); |
| 135 } | 117 } |
| 136 | 118 |
| 137 TEST_F(TouchTest, OnTouchMotion) { | 119 TEST_F(TouchTest, OnTouchMotion) { |
| 138 std::unique_ptr<Surface> surface(new Surface); | 120 auto window = exo_test_helper()->CreateWindow(10, 10, false); |
| 139 std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | |
| 140 gfx::Size buffer_size(10, 10); | |
| 141 std::unique_ptr<Buffer> buffer( | |
| 142 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); | |
| 143 surface->Attach(buffer.get()); | |
| 144 surface->Commit(); | |
| 145 | 121 |
| 146 MockTouchDelegate delegate; | 122 MockTouchDelegate delegate; |
| 147 std::unique_ptr<Touch> touch(new Touch(&delegate)); | 123 std::unique_ptr<Touch> touch(new Touch(&delegate)); |
| 148 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); | 124 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); |
| 149 | 125 |
| 150 EXPECT_CALL(delegate, OnTouchShape(testing::_, testing::_, testing::_)) | 126 EXPECT_CALL(delegate, OnTouchShape(testing::_, testing::_, testing::_)) |
| 151 .Times(testing::AnyNumber()); | 127 .Times(testing::AnyNumber()); |
| 152 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(surface.get())) | 128 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(window.surface())) |
| 153 .WillRepeatedly(testing::Return(true)); | 129 .WillRepeatedly(testing::Return(true)); |
| 154 EXPECT_CALL(delegate, | 130 EXPECT_CALL(delegate, OnTouchDown(window.surface(), testing::_, testing::_, |
| 155 OnTouchDown(surface.get(), testing::_, testing::_, gfx::Point())); | 131 gfx::Point())); |
| 156 EXPECT_CALL(delegate, | 132 EXPECT_CALL(delegate, |
| 157 OnTouchMotion(testing::_, testing::_, gfx::Point(5, 5))); | 133 OnTouchMotion(testing::_, testing::_, gfx::Point(5, 5))); |
| 158 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)); | 134 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)); |
| 159 EXPECT_CALL(delegate, OnTouchFrame()).Times(3); | 135 EXPECT_CALL(delegate, OnTouchFrame()).Times(3); |
| 160 generator.set_current_location( | 136 generator.set_current_location(window.origin()); |
| 161 surface->window()->GetBoundsInScreen().origin()); | |
| 162 generator.PressMoveAndReleaseTouchBy(5, 5); | 137 generator.PressMoveAndReleaseTouchBy(5, 5); |
| 163 | 138 |
| 164 // Check if touch point motion outside focus surface is reported properly to | 139 // Check if touch point motion outside focus surface is reported properly to |
| 165 // the focus surface. | 140 // the focus surface. |
| 166 EXPECT_CALL(delegate, | 141 EXPECT_CALL(delegate, OnTouchDown(window.surface(), testing::_, testing::_, |
| 167 OnTouchDown(surface.get(), testing::_, testing::_, gfx::Point())); | 142 gfx::Point())); |
| 168 EXPECT_CALL(delegate, | 143 EXPECT_CALL(delegate, |
| 169 OnTouchMotion(testing::_, testing::_, gfx::Point(100, 100))); | 144 OnTouchMotion(testing::_, testing::_, gfx::Point(100, 100))); |
| 170 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)); | 145 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)); |
| 171 EXPECT_CALL(delegate, OnTouchFrame()).Times(3); | 146 EXPECT_CALL(delegate, OnTouchFrame()).Times(3); |
| 172 generator.set_current_location( | 147 generator.set_current_location(window.origin()); |
| 173 surface->window()->GetBoundsInScreen().origin()); | |
| 174 generator.PressMoveAndReleaseTouchBy(100, 100); | 148 generator.PressMoveAndReleaseTouchBy(100, 100); |
| 175 | 149 |
| 176 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); | 150 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); |
| 177 touch.reset(); | 151 touch.reset(); |
| 178 } | 152 } |
| 179 | 153 |
| 180 TEST_F(TouchTest, OnTouchShape) { | 154 TEST_F(TouchTest, OnTouchShape) { |
| 181 std::unique_ptr<Surface> surface(new Surface); | 155 auto window = exo_test_helper()->CreateWindow(10, 10, false); |
| 182 std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | |
| 183 gfx::Size buffer_size(10, 10); | |
| 184 std::unique_ptr<Buffer> buffer( | |
| 185 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); | |
| 186 surface->Attach(buffer.get()); | |
| 187 surface->Commit(); | |
| 188 | 156 |
| 189 MockTouchDelegate delegate; | 157 MockTouchDelegate delegate; |
| 190 std::unique_ptr<Touch> touch(new Touch(&delegate)); | 158 std::unique_ptr<Touch> touch(new Touch(&delegate)); |
| 191 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); | 159 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); |
| 192 | 160 |
| 193 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(surface.get())) | 161 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(window.surface())) |
| 194 .WillRepeatedly(testing::Return(true)); | 162 .WillRepeatedly(testing::Return(true)); |
| 195 { | 163 { |
| 196 testing::InSequence sequence; | 164 testing::InSequence sequence; |
| 197 EXPECT_CALL(delegate, OnTouchDown(surface.get(), testing::_, testing::_, | 165 EXPECT_CALL(delegate, OnTouchDown(window.surface(), testing::_, testing::_, |
| 198 gfx::Point())); | 166 gfx::Point())); |
| 199 EXPECT_CALL(delegate, OnTouchShape(testing::_, 1, 1)); | 167 EXPECT_CALL(delegate, OnTouchShape(testing::_, 1, 1)); |
| 200 EXPECT_CALL(delegate, OnTouchFrame()); | 168 EXPECT_CALL(delegate, OnTouchFrame()); |
| 201 EXPECT_CALL(delegate, | 169 EXPECT_CALL(delegate, |
| 202 OnTouchMotion(testing::_, testing::_, gfx::Point(5, 5))); | 170 OnTouchMotion(testing::_, testing::_, gfx::Point(5, 5))); |
| 203 EXPECT_CALL(delegate, OnTouchShape(testing::_, 1, 1)); | 171 EXPECT_CALL(delegate, OnTouchShape(testing::_, 1, 1)); |
| 204 EXPECT_CALL(delegate, OnTouchFrame()); | 172 EXPECT_CALL(delegate, OnTouchFrame()); |
| 205 EXPECT_CALL(delegate, | 173 EXPECT_CALL(delegate, |
| 206 OnTouchMotion(testing::_, testing::_, gfx::Point(10, 10))); | 174 OnTouchMotion(testing::_, testing::_, gfx::Point(10, 10))); |
| 207 EXPECT_CALL(delegate, OnTouchShape(testing::_, 20, 10)); | 175 EXPECT_CALL(delegate, OnTouchShape(testing::_, 20, 10)); |
| 208 EXPECT_CALL(delegate, OnTouchFrame()); | 176 EXPECT_CALL(delegate, OnTouchFrame()); |
| 209 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)); | 177 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)); |
| 210 EXPECT_CALL(delegate, OnTouchFrame()); | 178 EXPECT_CALL(delegate, OnTouchFrame()); |
| 211 } | 179 } |
| 212 generator.set_current_location( | 180 generator.set_current_location(window.origin()); |
| 213 surface->window()->GetBoundsInScreen().origin()); | |
| 214 generator.PressTouch(); | 181 generator.PressTouch(); |
| 215 generator.MoveTouchBy(5, 5); | 182 generator.MoveTouchBy(5, 5); |
| 216 generator.SetTouchRadius(20, 10); | 183 generator.SetTouchRadius(20, 10); |
| 217 generator.MoveTouchBy(5, 5); | 184 generator.MoveTouchBy(5, 5); |
| 218 generator.ReleaseTouch(); | 185 generator.ReleaseTouch(); |
| 219 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); | 186 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); |
| 220 touch.reset(); | 187 touch.reset(); |
| 221 } | 188 } |
| 222 | 189 |
| 223 TEST_F(TouchTest, OnTouchCancel) { | 190 TEST_F(TouchTest, OnTouchCancel) { |
| 224 std::unique_ptr<Surface> surface(new Surface); | 191 auto window = exo_test_helper()->CreateWindow(10, 10, false); |
| 225 std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | |
| 226 gfx::Size buffer_size(10, 10); | |
| 227 std::unique_ptr<Buffer> buffer( | |
| 228 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); | |
| 229 surface->Attach(buffer.get()); | |
| 230 surface->Commit(); | |
| 231 | 192 |
| 232 MockTouchDelegate delegate; | 193 MockTouchDelegate delegate; |
| 233 std::unique_ptr<Touch> touch(new Touch(&delegate)); | 194 std::unique_ptr<Touch> touch(new Touch(&delegate)); |
| 234 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); | 195 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); |
| 235 | 196 |
| 236 EXPECT_CALL(delegate, OnTouchShape(testing::_, testing::_, testing::_)) | 197 EXPECT_CALL(delegate, OnTouchShape(testing::_, testing::_, testing::_)) |
| 237 .Times(testing::AnyNumber()); | 198 .Times(testing::AnyNumber()); |
| 238 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(surface.get())) | 199 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(window.surface())) |
| 239 .WillRepeatedly(testing::Return(true)); | 200 .WillRepeatedly(testing::Return(true)); |
| 240 EXPECT_CALL(delegate, | 201 EXPECT_CALL(delegate, OnTouchDown(window.surface(), testing::_, testing::_, |
| 241 OnTouchDown(surface.get(), testing::_, testing::_, gfx::Point())) | 202 gfx::Point())) |
| 242 .Times(2); | 203 .Times(2); |
| 243 EXPECT_CALL(delegate, OnTouchFrame()).Times(2); | 204 EXPECT_CALL(delegate, OnTouchFrame()).Times(2); |
| 244 generator.set_current_location( | 205 generator.set_current_location(window.origin()); |
| 245 surface->window()->GetBoundsInScreen().origin()); | |
| 246 generator.PressTouchId(1); | 206 generator.PressTouchId(1); |
| 247 generator.PressTouchId(2); | 207 generator.PressTouchId(2); |
| 248 | 208 |
| 249 // One touch point being canceled is enough for OnTouchCancel to be called. | 209 // One touch point being canceled is enough for OnTouchCancel to be called. |
| 250 EXPECT_CALL(delegate, OnTouchCancel()); | 210 EXPECT_CALL(delegate, OnTouchCancel()); |
| 251 EXPECT_CALL(delegate, OnTouchFrame()); | 211 EXPECT_CALL(delegate, OnTouchFrame()); |
| 252 ui::TouchEvent cancel_event(ui::ET_TOUCH_CANCELLED, gfx::Point(), 1, | 212 ui::TouchEvent cancel_event(ui::ET_TOUCH_CANCELLED, gfx::Point(), 1, |
| 253 ui::EventTimeForNow()); | 213 ui::EventTimeForNow()); |
| 254 generator.Dispatch(&cancel_event); | 214 generator.Dispatch(&cancel_event); |
| 255 | 215 |
| 256 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); | 216 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); |
| 257 touch.reset(); | 217 touch.reset(); |
| 258 } | 218 } |
| 259 | 219 |
| 260 TEST_F(TouchTest, IgnoreTouchEventDuringModal) { | 220 TEST_F(TouchTest, IgnoreTouchEventDuringModal) { |
| 261 std::unique_ptr<Surface> surface(new Surface); | 221 auto window = exo_test_helper()->CreateWindow(10, 10, false); |
| 262 std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | 222 auto modal = exo_test_helper()->CreateWindow(5, 5, true); |
| 263 std::unique_ptr<Buffer> buffer( | |
| 264 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(gfx::Size(10, 10)))); | |
| 265 surface->Attach(buffer.get()); | |
| 266 surface->Commit(); | |
| 267 gfx::Point location = surface->window()->GetBoundsInScreen().origin(); | |
| 268 | 223 |
| 269 MockTouchDelegate delegate; | 224 MockTouchDelegate delegate; |
| 270 std::unique_ptr<Touch> touch(new Touch(&delegate)); | 225 std::unique_ptr<Touch> touch(new Touch(&delegate)); |
| 271 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); | 226 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); |
| 272 | 227 |
| 273 // Create surface for modal window. | 228 // Make the window modal. |
| 274 std::unique_ptr<Surface> surface2(new Surface); | 229 modal.shell_surface()->SetSystemModal(true); |
| 275 std::unique_ptr<ShellSurface> shell_surface2( | |
| 276 new ShellSurface(surface2.get(), nullptr, gfx::Rect(0, 0, 5, 5), true, | |
| 277 ash::kShellWindowId_SystemModalContainer)); | |
| 278 std::unique_ptr<Buffer> buffer2( | |
| 279 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(gfx::Size(5, 5)))); | |
| 280 surface2->Attach(buffer2.get()); | |
| 281 surface2->Commit(); | |
| 282 ash::wm::CenterWindow(ash::WmWindowAura::Get(surface2->window())); | |
| 283 gfx::Point location2 = surface2->window()->GetBoundsInScreen().origin(); | |
| 284 | 230 |
| 285 // Make the window modal. | |
| 286 shell_surface2->SetSystemModal(true); | |
| 287 EXPECT_TRUE(ash::WmShell::Get()->IsSystemModalWindowOpen()); | 231 EXPECT_TRUE(ash::WmShell::Get()->IsSystemModalWindowOpen()); |
| 288 | |
| 289 EXPECT_CALL(delegate, OnTouchShape(testing::_, testing::_, testing::_)) | 232 EXPECT_CALL(delegate, OnTouchShape(testing::_, testing::_, testing::_)) |
| 290 .Times(testing::AnyNumber()); | 233 .Times(testing::AnyNumber()); |
| 291 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(surface.get())) | 234 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(window.surface())) |
| 292 .WillRepeatedly(testing::Return(true)); | 235 .WillRepeatedly(testing::Return(true)); |
| 293 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(surface2.get())) | 236 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(modal.surface())) |
| 294 .WillRepeatedly(testing::Return(true)); | 237 .WillRepeatedly(testing::Return(true)); |
| 295 | 238 |
| 296 // Check if touch events on modal window are registered. | 239 // Check if touch events on modal window are registered. |
| 297 { | 240 { |
| 298 testing::InSequence sequence; | 241 testing::InSequence sequence; |
| 299 EXPECT_CALL(delegate, OnTouchDown(surface2.get(), testing::_, testing::_, | 242 EXPECT_CALL(delegate, OnTouchDown(modal.surface(), testing::_, testing::_, |
| 300 gfx::Point())); | 243 gfx::Point())); |
| 301 EXPECT_CALL(delegate, OnTouchFrame()); | 244 EXPECT_CALL(delegate, OnTouchFrame()); |
| 302 EXPECT_CALL(delegate, | 245 EXPECT_CALL(delegate, |
| 303 OnTouchMotion(testing::_, testing::_, gfx::Point(1, 1))); | 246 OnTouchMotion(testing::_, testing::_, gfx::Point(1, 1))); |
| 304 EXPECT_CALL(delegate, OnTouchFrame()); | 247 EXPECT_CALL(delegate, OnTouchFrame()); |
| 305 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)); | 248 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)); |
| 306 EXPECT_CALL(delegate, OnTouchFrame()); | 249 EXPECT_CALL(delegate, OnTouchFrame()); |
| 307 } | 250 } |
| 308 generator.set_current_location(location2); | 251 generator.set_current_location(modal.origin()); |
| 309 generator.PressMoveAndReleaseTouchBy(1, 1); | 252 generator.PressMoveAndReleaseTouchBy(1, 1); |
| 310 | 253 |
| 311 // Check if touch events on non-modal window are ignored. | 254 // Check if touch events on non-modal window are ignored. |
| 312 { | 255 { |
| 313 testing::InSequence sequence; | 256 testing::InSequence sequence; |
| 314 EXPECT_CALL(delegate, OnTouchDown(surface.get(), testing::_, testing::_, | 257 EXPECT_CALL(delegate, OnTouchDown(window.surface(), testing::_, testing::_, |
| 315 gfx::Point())) | 258 gfx::Point())) |
| 316 .Times(0); | 259 .Times(0); |
| 317 EXPECT_CALL(delegate, | 260 EXPECT_CALL(delegate, |
| 318 OnTouchMotion(testing::_, testing::_, gfx::Point(1, 1))) | 261 OnTouchMotion(testing::_, testing::_, gfx::Point(1, 1))) |
| 319 .Times(0); | 262 .Times(0); |
| 320 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)).Times(0); | 263 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)).Times(0); |
| 321 EXPECT_CALL(delegate, OnTouchFrame()).Times(0); | 264 EXPECT_CALL(delegate, OnTouchFrame()).Times(0); |
| 322 } | 265 } |
| 323 generator.set_current_location(location); | 266 generator.set_current_location(window.origin()); |
| 324 generator.PressMoveAndReleaseTouchBy(1, 1); | 267 generator.PressMoveAndReleaseTouchBy(1, 1); |
| 325 | 268 |
| 326 // Make the window non-modal. | 269 // Make the window non-modal. |
| 327 shell_surface2->SetSystemModal(false); | 270 modal.shell_surface()->SetSystemModal(false); |
| 328 EXPECT_FALSE(ash::WmShell::Get()->IsSystemModalWindowOpen()); | 271 EXPECT_FALSE(ash::WmShell::Get()->IsSystemModalWindowOpen()); |
| 329 | 272 |
| 330 // Check if touch events on non-modal window are registered. | 273 // Check if touch events on non-modal window are registered. |
| 331 { | 274 { |
| 332 testing::InSequence sequence; | 275 testing::InSequence sequence; |
| 333 EXPECT_CALL(delegate, OnTouchDown(surface.get(), testing::_, testing::_, | 276 EXPECT_CALL(delegate, OnTouchDown(window.surface(), testing::_, testing::_, |
| 334 gfx::Point())); | 277 gfx::Point())); |
| 335 EXPECT_CALL(delegate, OnTouchFrame()); | 278 EXPECT_CALL(delegate, OnTouchFrame()); |
| 336 EXPECT_CALL(delegate, | 279 EXPECT_CALL(delegate, |
| 337 OnTouchMotion(testing::_, testing::_, gfx::Point(1, 1))); | 280 OnTouchMotion(testing::_, testing::_, gfx::Point(1, 1))); |
| 338 EXPECT_CALL(delegate, OnTouchFrame()); | 281 EXPECT_CALL(delegate, OnTouchFrame()); |
| 339 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)); | 282 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)); |
| 340 EXPECT_CALL(delegate, OnTouchFrame()); | 283 EXPECT_CALL(delegate, OnTouchFrame()); |
| 341 } | 284 } |
| 342 generator.set_current_location(location); | 285 generator.set_current_location(window.origin()); |
| 343 generator.PressMoveAndReleaseTouchBy(1, 1); | 286 generator.PressMoveAndReleaseTouchBy(1, 1); |
| 344 | 287 |
| 345 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); | 288 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); |
| 346 touch.reset(); | 289 touch.reset(); |
| 347 } | 290 } |
| 348 | 291 |
| 292 TEST_F(TouchTest, OnTouchTool) { | |
| 293 auto window = exo_test_helper()->CreateWindow(10, 10, false); | |
| 294 | |
| 295 MockTouchDelegate delegate; | |
| 296 MockTouchStylusDelegate stylus_delegate; | |
| 297 std::unique_ptr<Touch> touch(new Touch(&delegate)); | |
| 298 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); | |
| 299 touch->SetStylusDelegate(&stylus_delegate); | |
| 300 | |
| 301 EXPECT_CALL(delegate, OnTouchShape(testing::_, testing::_, testing::_)) | |
| 302 .Times(testing::AnyNumber()); | |
| 303 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(window.surface())) | |
| 304 .WillRepeatedly(testing::Return(true)); | |
| 305 | |
| 306 // Expect tool change to happen before frame of down event. | |
| 307 { | |
| 308 testing::InSequence sequence; | |
| 309 EXPECT_CALL(delegate, OnTouchDown(window.surface(), testing::_, testing::_, | |
| 310 gfx::Point())); | |
| 311 EXPECT_CALL(stylus_delegate, | |
| 312 OnTouchTool(0, ui::EventPointerType::POINTER_TYPE_PEN)); | |
| 313 EXPECT_CALL(delegate, OnTouchFrame()); | |
| 314 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)); | |
| 315 EXPECT_CALL(delegate, OnTouchFrame()); | |
| 316 } | |
| 317 generator.set_current_location(window.origin()); | |
| 318 generator.SetTouchPointerType(ui::EventPointerType::POINTER_TYPE_PEN); | |
| 319 generator.PressTouch(); | |
| 320 generator.ReleaseTouch(); | |
| 321 | |
| 322 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); | |
| 323 touch.reset(); | |
| 324 } | |
| 325 | |
| 326 TEST_F(TouchTest, OnTouchForce) { | |
| 327 auto window = exo_test_helper()->CreateWindow(10, 10, false); | |
| 328 | |
| 329 MockTouchDelegate delegate; | |
| 330 MockTouchStylusDelegate stylus_delegate; | |
| 331 std::unique_ptr<Touch> touch(new Touch(&delegate)); | |
| 332 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); | |
| 333 touch->SetStylusDelegate(&stylus_delegate); | |
| 334 | |
| 335 EXPECT_CALL(delegate, OnTouchShape(testing::_, testing::_, testing::_)) | |
| 336 .Times(testing::AnyNumber()); | |
| 337 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(window.surface())) | |
| 338 .WillRepeatedly(testing::Return(true)); | |
| 339 | |
| 340 // Expect tool change to happen before frame of down event. | |
| 341 { | |
| 342 testing::InSequence sequence; | |
| 343 EXPECT_CALL(delegate, OnTouchDown(window.surface(), testing::_, testing::_, | |
| 344 gfx::Point())); | |
| 345 EXPECT_CALL(stylus_delegate, | |
| 346 OnTouchTool(0, ui::EventPointerType::POINTER_TYPE_PEN)); | |
| 347 EXPECT_CALL(stylus_delegate, OnTouchForce(testing::_, 0, 1.0)); | |
| 348 EXPECT_CALL(delegate, OnTouchFrame()); | |
| 349 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)); | |
| 350 EXPECT_CALL(delegate, OnTouchFrame()); | |
| 351 } | |
| 352 generator.set_current_location(window.origin()); | |
| 353 generator.SetTouchPointerType(ui::EventPointerType::POINTER_TYPE_PEN); | |
| 354 generator.SetTouchForce(1.0); | |
| 355 generator.PressTouch(); | |
| 356 generator.ReleaseTouch(); | |
| 357 | |
| 358 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); | |
| 359 touch.reset(); | |
| 360 } | |
| 361 | |
| 362 TEST_F(TouchTest, OnTouchTilt) { | |
| 363 auto window = exo_test_helper()->CreateWindow(10, 10, false); | |
| 364 | |
| 365 MockTouchDelegate delegate; | |
| 366 MockTouchStylusDelegate stylus_delegate; | |
| 367 std::unique_ptr<Touch> touch(new Touch(&delegate)); | |
| 368 ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); | |
| 369 touch->SetStylusDelegate(&stylus_delegate); | |
| 370 | |
| 371 EXPECT_CALL(delegate, OnTouchShape(testing::_, testing::_, testing::_)) | |
| 372 .Times(testing::AnyNumber()); | |
| 373 EXPECT_CALL(delegate, CanAcceptTouchEventsForSurface(window.surface())) | |
| 374 .WillRepeatedly(testing::Return(true)); | |
| 375 | |
| 376 // Expect tool change to happen before frame of down event. | |
| 377 { | |
| 378 testing::InSequence sequence; | |
| 379 EXPECT_CALL(delegate, OnTouchDown(window.surface(), testing::_, testing::_, | |
| 380 gfx::Point())); | |
| 381 EXPECT_CALL(stylus_delegate, | |
| 382 OnTouchTool(0, ui::EventPointerType::POINTER_TYPE_PEN)); | |
| 383 EXPECT_CALL(stylus_delegate, | |
| 384 OnTouchTilt(testing::_, 0, gfx::Vector2dF(1.0, 2.0))); | |
| 385 EXPECT_CALL(delegate, OnTouchFrame()); | |
| 386 EXPECT_CALL(delegate, OnTouchUp(testing::_, testing::_)); | |
| 387 EXPECT_CALL(delegate, OnTouchFrame()); | |
| 388 } | |
| 389 generator.set_current_location(window.origin()); | |
| 390 generator.SetTouchPointerType(ui::EventPointerType::POINTER_TYPE_PEN); | |
| 391 generator.SetTouchTilt(1.0, 2.0); | |
| 392 generator.PressTouch(); | |
| 393 generator.ReleaseTouch(); | |
| 394 | |
| 395 EXPECT_CALL(delegate, OnTouchDestroying(touch.get())); | |
| 396 touch.reset(); | |
| 397 } | |
| 398 | |
| 349 } // namespace | 399 } // namespace |
| 350 } // namespace exo | 400 } // namespace exo |
| OLD | NEW |