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