Flutter Windows Embedder
direct_manipulation_unittests.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
6 
7 #include "flutter/fml/macros.h"
8 #include "flutter/shell/platform/windows/testing/mock_window_binding_handler_delegate.h"
9 #include "gtest/gtest.h"
10 
11 using testing::_;
12 
13 namespace flutter {
14 namespace testing {
15 
16 class MockIDirectManipulationViewport : public IDirectManipulationViewport {
17  public:
19 
20  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, AddRef, ULONG());
21  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Release, ULONG());
22  MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
23  QueryInterface,
24  HRESULT(REFIID, void**));
25  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Abandon, HRESULT());
26  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
27  ActivateConfiguration,
28  HRESULT(DIRECTMANIPULATION_CONFIGURATION));
29  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
30  AddConfiguration,
31  HRESULT(DIRECTMANIPULATION_CONFIGURATION));
32  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
33  AddContent,
34  HRESULT(IDirectManipulationContent*));
35  MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
36  AddEventHandler,
37  HRESULT(HWND,
38  IDirectManipulationViewportEventHandler*,
39  DWORD*));
40  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Disable, HRESULT());
41  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Enable, HRESULT());
42  MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
43  GetPrimaryContent,
44  HRESULT(REFIID, void**));
45  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
46  GetStatus,
47  HRESULT(DIRECTMANIPULATION_STATUS*));
48  MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
49  GetTag,
50  HRESULT(REFIID, void**, UINT32*));
51  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
52  GetViewportRect,
53  HRESULT(RECT*));
54  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, ReleaseAllContacts, HRESULT());
55  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
56  ReleaseContact,
57  HRESULT(UINT32));
58  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
59  RemoveConfiguration,
60  HRESULT(DIRECTMANIPULATION_CONFIGURATION));
61  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
62  RemoveContent,
63  HRESULT(IDirectManipulationContent*));
64  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
65  RemoveEventHandler,
66  HRESULT(DWORD));
67  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
68  SetChaining,
69  HRESULT(DIRECTMANIPULATION_MOTION_TYPES));
70  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetContact, HRESULT(UINT32));
71  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
72  SetInputMode,
73  HRESULT(DIRECTMANIPULATION_INPUT_MODE));
74  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
75  SetManualGesture,
76  HRESULT(DIRECTMANIPULATION_GESTURE_CONFIGURATION));
77  MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
78  SetTag,
79  HRESULT(IUnknown*, UINT32));
80  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
81  SetUpdateMode,
82  HRESULT(DIRECTMANIPULATION_INPUT_MODE));
83  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
84  SetViewportOptions,
85  HRESULT(DIRECTMANIPULATION_VIEWPORT_OPTIONS));
86  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
87  SetViewportRect,
88  HRESULT(const RECT*));
89  MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
90  SetViewportTransform,
91  HRESULT(const float*, DWORD));
92  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Stop, HRESULT());
93  MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
94  SyncDisplayTransform,
95  HRESULT(const float*, DWORD));
97  STDMETHODCALLTYPE,
98  ZoomToRect,
99  HRESULT(const float, const float, const float, const float, BOOL));
100 
101  private:
102  FML_DISALLOW_COPY_AND_ASSIGN(MockIDirectManipulationViewport);
103 };
104 
105 class MockIDirectManipulationContent : public IDirectManipulationContent {
106  public:
108 
109  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, AddRef, ULONG());
110  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Release, ULONG());
111  MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
112  QueryInterface,
113  HRESULT(REFIID, void**));
114  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetContentRect, HRESULT(RECT*));
115  MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
116  GetContentTransform,
117  HRESULT(float*, DWORD));
118  MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
119  GetOutputTransform,
120  HRESULT(float*, DWORD));
121  MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
122  GetTag,
123  HRESULT(REFIID, void**, UINT32*));
124  MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
125  GetViewport,
126  HRESULT(REFIID, void**));
127  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
128  SetContentRect,
129  HRESULT(const RECT*));
130  MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
131  SetTag,
132  HRESULT(IUnknown*, UINT32));
133  MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
134  SyncContentTransform,
135  HRESULT(const float*, DWORD));
136 
137  private:
138  FML_DISALLOW_COPY_AND_ASSIGN(MockIDirectManipulationContent);
139 };
140 
141 TEST(DirectManipulationTest, TestGesture) {
143  MockWindowBindingHandlerDelegate delegate;
145  const float scale = 1.5;
146  const float pan_x = 32.0;
147  const float pan_y = 16.0;
148  const int DISPLAY_WIDTH = 800;
149  const int DISPLAY_HEIGHT = 600;
150  auto owner = std::make_unique<DirectManipulationOwner>(nullptr);
151  owner->SetBindingHandlerDelegate(&delegate);
152  auto handler =
153  fml::MakeRefCounted<DirectManipulationEventHandler>(owner.get());
154  int32_t device_id = (int32_t)reinterpret_cast<int64_t>(handler.get());
155  EXPECT_CALL(viewport, GetPrimaryContent(_, _))
156  .WillOnce([&content](REFIID in, void** out) {
157  *out = &content;
158  return S_OK;
159  })
160  .RetiresOnSaturation();
161  EXPECT_CALL(content, GetContentTransform(_, 6))
162  .WillOnce([scale](float* transform, DWORD size) {
163  transform[0] = 1.0f;
164  transform[4] = 0.0;
165  transform[5] = 0.0;
166  return S_OK;
167  })
168  .RetiresOnSaturation();
169  EXPECT_CALL(delegate, OnPointerPanZoomStart(device_id));
170  handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
171  DIRECTMANIPULATION_RUNNING,
172  DIRECTMANIPULATION_READY);
173  EXPECT_CALL(content, GetContentTransform(_, 6))
174  .WillOnce([scale, pan_x, pan_y](float* transform, DWORD size) {
175  transform[0] = scale;
176  transform[4] = pan_x;
177  transform[5] = pan_y;
178  return S_OK;
179  });
180  EXPECT_CALL(delegate,
181  OnPointerPanZoomUpdate(device_id, pan_x, pan_y, scale, 0));
182  handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
183  (IDirectManipulationContent*)&content);
184  EXPECT_CALL(delegate, OnPointerPanZoomEnd(device_id));
185  EXPECT_CALL(viewport, GetViewportRect(_))
186  .WillOnce([DISPLAY_WIDTH, DISPLAY_HEIGHT](RECT* rect) {
187  rect->left = 0;
188  rect->top = 0;
189  rect->right = DISPLAY_WIDTH;
190  rect->bottom = DISPLAY_HEIGHT;
191  return S_OK;
192  });
193  EXPECT_CALL(viewport, ZoomToRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, false))
194  .WillOnce(::testing::Return(S_OK));
195  handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
196  DIRECTMANIPULATION_INERTIA,
197  DIRECTMANIPULATION_RUNNING);
198  handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
199  DIRECTMANIPULATION_READY,
200  DIRECTMANIPULATION_INERTIA);
201 }
202 
203 // Verify that scale mantissa rounding works as expected
204 TEST(DirectManipulationTest, TestRounding) {
206  MockWindowBindingHandlerDelegate delegate;
208  const float scale = 1.5;
209  const int DISPLAY_WIDTH = 800;
210  const int DISPLAY_HEIGHT = 600;
211  auto owner = std::make_unique<DirectManipulationOwner>(nullptr);
212  owner->SetBindingHandlerDelegate(&delegate);
213  auto handler =
214  fml::MakeRefCounted<DirectManipulationEventHandler>(owner.get());
215  int32_t device_id = (int32_t)reinterpret_cast<int64_t>(handler.get());
216  EXPECT_CALL(viewport, GetPrimaryContent(_, _))
217  .WillOnce([&content](REFIID in, void** out) {
218  *out = &content;
219  return S_OK;
220  })
221  .RetiresOnSaturation();
222  EXPECT_CALL(content, GetContentTransform(_, 6))
223  .WillOnce([scale](float* transform, DWORD size) {
224  transform[0] = 1.0f;
225  transform[4] = 0.0;
226  transform[5] = 0.0;
227  return S_OK;
228  })
229  .RetiresOnSaturation();
230  EXPECT_CALL(delegate, OnPointerPanZoomStart(device_id));
231  handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
232  DIRECTMANIPULATION_RUNNING,
233  DIRECTMANIPULATION_READY);
234  EXPECT_CALL(content, GetContentTransform(_, 6))
235  .WillOnce([scale](float* transform, DWORD size) {
236  transform[0] = 1.5000001f;
237  transform[4] = 4.0;
238  transform[5] = 0.0;
239  return S_OK;
240  })
241  .RetiresOnSaturation();
242  EXPECT_CALL(delegate,
243  OnPointerPanZoomUpdate(device_id, 4.0, 0, 1.5000001f, 0))
244  .Times(0);
245  EXPECT_CALL(delegate, OnPointerPanZoomUpdate(device_id, 4.0, 0, 1.5f, 0))
246  .Times(1)
247  .RetiresOnSaturation();
248  EXPECT_CALL(content, GetContentTransform(_, 6))
249  .WillOnce([scale](float* transform, DWORD size) {
250  transform[0] = 1.50000065f;
251  transform[4] = 2.0;
252  transform[5] = 0.0;
253  return S_OK;
254  })
255  .RetiresOnSaturation();
256  EXPECT_CALL(delegate,
257  OnPointerPanZoomUpdate(device_id, 2.0, 0, 1.50000065f, 0))
258  .Times(0);
259  EXPECT_CALL(delegate,
260  OnPointerPanZoomUpdate(device_id, 2.0, 0, 1.50000047f, 0))
261  .Times(1)
262  .RetiresOnSaturation();
263  EXPECT_CALL(delegate, OnPointerPanZoomEnd(device_id));
264  EXPECT_CALL(viewport, GetViewportRect(_))
265  .WillOnce([DISPLAY_WIDTH, DISPLAY_HEIGHT](RECT* rect) {
266  rect->left = 0;
267  rect->top = 0;
268  rect->right = DISPLAY_WIDTH;
269  rect->bottom = DISPLAY_HEIGHT;
270  return S_OK;
271  });
272  EXPECT_CALL(viewport, ZoomToRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, false))
273  .WillOnce(::testing::Return(S_OK));
274  handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
275  (IDirectManipulationContent*)&content);
276  handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
277  (IDirectManipulationContent*)&content);
278  handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
279  DIRECTMANIPULATION_INERTIA,
280  DIRECTMANIPULATION_RUNNING);
281  handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
282  DIRECTMANIPULATION_READY,
283  DIRECTMANIPULATION_INERTIA);
284 }
285 
286 TEST(DirectManipulationTest, TestInertiaCancelSentForUserCancel) {
288  MockWindowBindingHandlerDelegate delegate;
290  const int DISPLAY_WIDTH = 800;
291  const int DISPLAY_HEIGHT = 600;
292  auto owner = std::make_unique<DirectManipulationOwner>(nullptr);
293  owner->SetBindingHandlerDelegate(&delegate);
294  auto handler =
295  fml::MakeRefCounted<DirectManipulationEventHandler>(owner.get());
296  int32_t device_id = (int32_t)reinterpret_cast<int64_t>(handler.get());
297  // No need to mock the actual gesture, just start at the end.
298  EXPECT_CALL(viewport, GetViewportRect(_))
299  .WillOnce([DISPLAY_WIDTH, DISPLAY_HEIGHT](RECT* rect) {
300  rect->left = 0;
301  rect->top = 0;
302  rect->right = DISPLAY_WIDTH;
303  rect->bottom = DISPLAY_HEIGHT;
304  return S_OK;
305  });
306  EXPECT_CALL(viewport, ZoomToRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, false))
307  .WillOnce(::testing::Return(S_OK));
308  EXPECT_CALL(delegate, OnPointerPanZoomEnd(device_id));
309  handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
310  DIRECTMANIPULATION_INERTIA,
311  DIRECTMANIPULATION_RUNNING);
312  // Have pan_y change by 10 between inertia updates.
313  EXPECT_CALL(content, GetContentTransform(_, 6))
314  .WillOnce([](float* transform, DWORD size) {
315  transform[0] = 1;
316  transform[4] = 0;
317  transform[5] = 100;
318  return S_OK;
319  });
320  handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
321  (IDirectManipulationContent*)&content);
322  EXPECT_CALL(content, GetContentTransform(_, 6))
323  .WillOnce([](float* transform, DWORD size) {
324  transform[0] = 1;
325  transform[4] = 0;
326  transform[5] = 110;
327  return S_OK;
328  });
329  handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
330  (IDirectManipulationContent*)&content);
331  // This looks like an interruption in the middle of synthetic inertia because
332  // of user input.
333  EXPECT_CALL(delegate, OnScrollInertiaCancel(device_id));
334  handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
335  DIRECTMANIPULATION_READY,
336  DIRECTMANIPULATION_INERTIA);
337 }
338 
339 TEST(DirectManipulationTest, TestInertiaCamcelNotSentAtInertiaEnd) {
341  MockWindowBindingHandlerDelegate delegate;
343  const int DISPLAY_WIDTH = 800;
344  const int DISPLAY_HEIGHT = 600;
345  auto owner = std::make_unique<DirectManipulationOwner>(nullptr);
346  owner->SetBindingHandlerDelegate(&delegate);
347  auto handler =
348  fml::MakeRefCounted<DirectManipulationEventHandler>(owner.get());
349  int32_t device_id = (int32_t)reinterpret_cast<int64_t>(handler.get());
350  // No need to mock the actual gesture, just start at the end.
351  EXPECT_CALL(viewport, GetViewportRect(_))
352  .WillOnce([DISPLAY_WIDTH, DISPLAY_HEIGHT](RECT* rect) {
353  rect->left = 0;
354  rect->top = 0;
355  rect->right = DISPLAY_WIDTH;
356  rect->bottom = DISPLAY_HEIGHT;
357  return S_OK;
358  });
359  EXPECT_CALL(viewport, ZoomToRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, false))
360  .WillOnce(::testing::Return(S_OK));
361  EXPECT_CALL(delegate, OnPointerPanZoomEnd(device_id));
362  handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
363  DIRECTMANIPULATION_INERTIA,
364  DIRECTMANIPULATION_RUNNING);
365  // Have no change in pan between events.
366  EXPECT_CALL(content, GetContentTransform(_, 6))
367  .WillOnce([](float* transform, DWORD size) {
368  transform[0] = 1;
369  transform[4] = 0;
370  transform[5] = 140;
371  return S_OK;
372  });
373  handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
374  (IDirectManipulationContent*)&content);
375  EXPECT_CALL(content, GetContentTransform(_, 6))
376  .WillOnce([](float* transform, DWORD size) {
377  transform[0] = 1;
378  transform[4] = 0;
379  transform[5] = 140;
380  return S_OK;
381  });
382  handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
383  (IDirectManipulationContent*)&content);
384  // OnScrollInertiaCancel should not be called.
385  EXPECT_CALL(delegate, OnScrollInertiaCancel(device_id)).Times(0);
386  handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
387  DIRECTMANIPULATION_READY,
388  DIRECTMANIPULATION_INERTIA);
389 }
390 
391 // Have some initial values in the matrix, only the differences should be
392 // reported.
393 TEST(DirectManipulationTest, TestGestureWithInitialData) {
395  MockWindowBindingHandlerDelegate delegate;
397  const float scale = 1.5;
398  const float pan_x = 32.0;
399  const float pan_y = 16.0;
400  const int DISPLAY_WIDTH = 800;
401  const int DISPLAY_HEIGHT = 600;
402  auto owner = std::make_unique<DirectManipulationOwner>(nullptr);
403  owner->SetBindingHandlerDelegate(&delegate);
404  auto handler =
405  fml::MakeRefCounted<DirectManipulationEventHandler>(owner.get());
406  int32_t device_id = (int32_t)reinterpret_cast<int64_t>(handler.get());
407  EXPECT_CALL(viewport, GetPrimaryContent(_, _))
408  .WillOnce([&content](REFIID in, void** out) {
409  *out = &content;
410  return S_OK;
411  })
412  .RetiresOnSaturation();
413  EXPECT_CALL(content, GetContentTransform(_, 6))
414  .WillOnce([scale](float* transform, DWORD size) {
415  transform[0] = 2.0f;
416  transform[4] = 234.0;
417  transform[5] = 345.0;
418  return S_OK;
419  })
420  .RetiresOnSaturation();
421  EXPECT_CALL(delegate, OnPointerPanZoomStart(device_id));
422  handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
423  DIRECTMANIPULATION_RUNNING,
424  DIRECTMANIPULATION_READY);
425  EXPECT_CALL(content, GetContentTransform(_, 6))
426  .WillOnce([scale, pan_x, pan_y](float* transform, DWORD size) {
427  transform[0] = 2.0f * scale;
428  transform[4] = 234.0 + pan_x;
429  transform[5] = 345.0 + pan_y;
430  return S_OK;
431  });
432  EXPECT_CALL(delegate,
433  OnPointerPanZoomUpdate(device_id, pan_x, pan_y, scale, 0));
434  handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
435  (IDirectManipulationContent*)&content);
436  EXPECT_CALL(delegate, OnPointerPanZoomEnd(device_id));
437  EXPECT_CALL(viewport, GetViewportRect(_))
438  .WillOnce([DISPLAY_WIDTH, DISPLAY_HEIGHT](RECT* rect) {
439  rect->left = 0;
440  rect->top = 0;
441  rect->right = DISPLAY_WIDTH;
442  rect->bottom = DISPLAY_HEIGHT;
443  return S_OK;
444  });
445  EXPECT_CALL(viewport, ZoomToRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, false))
446  .WillOnce(::testing::Return(S_OK));
447  handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
448  DIRECTMANIPULATION_INERTIA,
449  DIRECTMANIPULATION_RUNNING);
450  handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
451  DIRECTMANIPULATION_READY,
452  DIRECTMANIPULATION_INERTIA);
453 }
454 
455 } // namespace testing
456 } // namespace flutter
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, QueryInterface, HRESULT(REFIID, void **))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, GetContentTransform, HRESULT(float *, DWORD))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, GetOutputTransform, HRESULT(float *, DWORD))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Release, ULONG())
MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE, GetTag, HRESULT(REFIID, void **, UINT32 *))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, SyncContentTransform, HRESULT(const float *, DWORD))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetContentRect, HRESULT(RECT *))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, AddRef, ULONG())
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, SetTag, HRESULT(IUnknown *, UINT32))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetContentRect, HRESULT(const RECT *))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, GetViewport, HRESULT(REFIID, void **))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, QueryInterface, HRESULT(REFIID, void **))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Abandon, HRESULT())
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, AddRef, ULONG())
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetViewportRect, HRESULT(const RECT *))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, SyncDisplayTransform, HRESULT(const float *, DWORD))
MOCK_METHOD5_WITH_CALLTYPE(STDMETHODCALLTYPE, ZoomToRect, HRESULT(const float, const float, const float, const float, BOOL))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Enable, HRESULT())
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Disable, HRESULT())
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, RemoveEventHandler, HRESULT(DWORD))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, AddConfiguration, HRESULT(DIRECTMANIPULATION_CONFIGURATION))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetViewportOptions, HRESULT(DIRECTMANIPULATION_VIEWPORT_OPTIONS))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, RemoveContent, HRESULT(IDirectManipulationContent *))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, SetTag, HRESULT(IUnknown *, UINT32))
MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE, GetTag, HRESULT(REFIID, void **, UINT32 *))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetInputMode, HRESULT(DIRECTMANIPULATION_INPUT_MODE))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Stop, HRESULT())
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, SetViewportTransform, HRESULT(const float *, DWORD))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, ReleaseAllContacts, HRESULT())
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetUpdateMode, HRESULT(DIRECTMANIPULATION_INPUT_MODE))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Release, ULONG())
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, ActivateConfiguration, HRESULT(DIRECTMANIPULATION_CONFIGURATION))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, RemoveConfiguration, HRESULT(DIRECTMANIPULATION_CONFIGURATION))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, AddContent, HRESULT(IDirectManipulationContent *))
MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE, AddEventHandler, HRESULT(HWND, IDirectManipulationViewportEventHandler *, DWORD *))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetChaining, HRESULT(DIRECTMANIPULATION_MOTION_TYPES))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetStatus, HRESULT(DIRECTMANIPULATION_STATUS *))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, GetPrimaryContent, HRESULT(REFIID, void **))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, ReleaseContact, HRESULT(UINT32))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetViewportRect, HRESULT(RECT *))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetContact, HRESULT(UINT32))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetManualGesture, HRESULT(DIRECTMANIPULATION_GESTURE_CONFIGURATION))
union flutter::testing::@100::KeyboardChange::@0 content
TEST(AccessibilityBridgeWindows, GetParent)