@@ -259,5 +259,113 @@ TEST(DirectManipulationTest, TestRounding) {
259259 DIRECTMANIPULATION_INERTIA);
260260}
261261
262+ TEST (DirectManipulationTest, TestInertiaCancelSentForUserCancel) {
263+ MockIDirectManipulationContent content;
264+ MockWindowBindingHandlerDelegate delegate;
265+ MockIDirectManipulationViewport viewport;
266+ const int DISPLAY_WIDTH = 800 ;
267+ const int DISPLAY_HEIGHT = 600 ;
268+ auto owner = std::make_unique<DirectManipulationOwner>(nullptr );
269+ owner->SetBindingHandlerDelegate (&delegate);
270+ auto handler =
271+ fml::MakeRefCounted<DirectManipulationEventHandler>(owner.get ());
272+ int32_t device_id = (int32_t ) reinterpret_cast <int64_t >(handler.get ());
273+ // No need to mock the actual gesture, just start at the end.
274+ EXPECT_CALL (viewport, GetViewportRect (_))
275+ .WillOnce (::testing::Invoke ([DISPLAY_WIDTH, DISPLAY_HEIGHT](RECT* rect) {
276+ rect->left = 0 ;
277+ rect->top = 0 ;
278+ rect->right = DISPLAY_WIDTH;
279+ rect->bottom = DISPLAY_HEIGHT;
280+ return S_OK;
281+ }));
282+ EXPECT_CALL (viewport, ZoomToRect (0 , 0 , DISPLAY_WIDTH, DISPLAY_HEIGHT, false ))
283+ .WillOnce (::testing::Return (S_OK));
284+ EXPECT_CALL (delegate, OnPointerPanZoomEnd (device_id));
285+ handler->OnViewportStatusChanged ((IDirectManipulationViewport*)&viewport,
286+ DIRECTMANIPULATION_INERTIA,
287+ DIRECTMANIPULATION_RUNNING);
288+ // Have pan_y change by 10 between inertia updates.
289+ EXPECT_CALL (content, GetContentTransform (_, 6 ))
290+ .WillOnce (::testing::Invoke (
291+ [](float * transform, DWORD size) {
292+ transform[0 ] = 1 ;
293+ transform[4 ] = 0 ;
294+ transform[5 ] = 100 ;
295+ return S_OK;
296+ }));
297+ handler->OnContentUpdated ((IDirectManipulationViewport*)&viewport,
298+ (IDirectManipulationContent*)&content);
299+ EXPECT_CALL (content, GetContentTransform (_, 6 ))
300+ .WillOnce (::testing::Invoke (
301+ [](float * transform, DWORD size) {
302+ transform[0 ] = 1 ;
303+ transform[4 ] = 0 ;
304+ transform[5 ] = 110 ;
305+ return S_OK;
306+ }));
307+ handler->OnContentUpdated ((IDirectManipulationViewport*)&viewport,
308+ (IDirectManipulationContent*)&content);
309+ // This looks like an interruption in the middle of synthetic inertia because of user input.
310+ EXPECT_CALL (delegate, OnScrollInertiaCancel (device_id));
311+ handler->OnViewportStatusChanged ((IDirectManipulationViewport*)&viewport,
312+ DIRECTMANIPULATION_READY,
313+ DIRECTMANIPULATION_INERTIA);
314+ }
315+
316+ TEST (DirectManipulationTest, TestInertiaCamcelNotSentAtInertiaEnd) {
317+ MockIDirectManipulationContent content;
318+ MockWindowBindingHandlerDelegate delegate;
319+ MockIDirectManipulationViewport viewport;
320+ const int DISPLAY_WIDTH = 800 ;
321+ const int DISPLAY_HEIGHT = 600 ;
322+ auto owner = std::make_unique<DirectManipulationOwner>(nullptr );
323+ owner->SetBindingHandlerDelegate (&delegate);
324+ auto handler =
325+ fml::MakeRefCounted<DirectManipulationEventHandler>(owner.get ());
326+ int32_t device_id = (int32_t ) reinterpret_cast <int64_t >(handler.get ());
327+ // No need to mock the actual gesture, just start at the end.
328+ EXPECT_CALL (viewport, GetViewportRect (_))
329+ .WillOnce (::testing::Invoke ([DISPLAY_WIDTH, DISPLAY_HEIGHT](RECT* rect) {
330+ rect->left = 0 ;
331+ rect->top = 0 ;
332+ rect->right = DISPLAY_WIDTH;
333+ rect->bottom = DISPLAY_HEIGHT;
334+ return S_OK;
335+ }));
336+ EXPECT_CALL (viewport, ZoomToRect (0 , 0 , DISPLAY_WIDTH, DISPLAY_HEIGHT, false ))
337+ .WillOnce (::testing::Return (S_OK));
338+ EXPECT_CALL (delegate, OnPointerPanZoomEnd (device_id));
339+ handler->OnViewportStatusChanged ((IDirectManipulationViewport*)&viewport,
340+ DIRECTMANIPULATION_INERTIA,
341+ DIRECTMANIPULATION_RUNNING);
342+ // Have no change in pan between events.
343+ EXPECT_CALL (content, GetContentTransform (_, 6 ))
344+ .WillOnce (::testing::Invoke (
345+ [](float * transform, DWORD size) {
346+ transform[0 ] = 1 ;
347+ transform[4 ] = 0 ;
348+ transform[5 ] = 140 ;
349+ return S_OK;
350+ }));
351+ handler->OnContentUpdated ((IDirectManipulationViewport*)&viewport,
352+ (IDirectManipulationContent*)&content);
353+ EXPECT_CALL (content, GetContentTransform (_, 6 ))
354+ .WillOnce (::testing::Invoke (
355+ [](float * transform, DWORD size) {
356+ transform[0 ] = 1 ;
357+ transform[4 ] = 0 ;
358+ transform[5 ] = 140 ;
359+ return S_OK;
360+ }));
361+ handler->OnContentUpdated ((IDirectManipulationViewport*)&viewport,
362+ (IDirectManipulationContent*)&content);
363+ // OnScrollInertiaCancel should not be called.
364+ EXPECT_CALL (delegate, OnScrollInertiaCancel (device_id)).Times (0 );
365+ handler->OnViewportStatusChanged ((IDirectManipulationViewport*)&viewport,
366+ DIRECTMANIPULATION_READY,
367+ DIRECTMANIPULATION_INERTIA);
368+ }
369+
262370} // namespace testing
263371} // namespace flutter
0 commit comments