4 #include "flutter/fml/macros.h"
6 #include "flutter/shell/platform/windows/testing/flutter_windows_engine_builder.h"
7 #include "flutter/shell/platform/windows/testing/mock_window_binding_handler_delegate.h"
8 #include "flutter/shell/platform/windows/testing/mock_windows_proc_table.h"
9 #include "flutter/shell/platform/windows/testing/windows_test.h"
10 #include "flutter/shell/platform/windows/testing/wm_builders.h"
12 #include "gmock/gmock.h"
13 #include "gtest/gtest.h"
19 using ::testing::AnyNumber;
21 using ::testing::Invoke;
22 using ::testing::Return;
25 static constexpr int32_t kDefaultPointerDeviceId = 0;
27 class MockFlutterWindow :
public FlutterWindow {
29 explicit MockFlutterWindow(
bool reset_view_on_exit =
true)
30 : reset_view_on_exit_(reset_view_on_exit) {
31 ON_CALL(*
this, GetDpiScale())
36 MockFlutterWindow(
int width,
38 std::shared_ptr<WindowsProcTable> proc_table =
nullptr)
39 : FlutterWindow(width, height, nullptr, std::move(proc_table)) {}
41 virtual ~MockFlutterWindow() {
42 if (reset_view_on_exit_) {
48 UINT GetDpi() {
return GetCurrentDPI(); }
50 LRESULT InjectWindowMessage(UINT
const message,
52 LPARAM
const lparam) {
53 return HandleMessage(
message, wparam, lparam);
56 MOCK_METHOD(
void, OnDpiScale, (
unsigned int), (
override));
57 MOCK_METHOD(
void, OnResize, (
unsigned int,
unsigned int), (
override));
58 MOCK_METHOD(
float, GetScrollOffsetMultiplier, (), (
override));
59 MOCK_METHOD(
float, GetDpiScale, (), (
override));
60 MOCK_METHOD(
void, UpdateCursorRect, (
const Rect&), (
override));
61 MOCK_METHOD(
void, OnResetImeComposing, (), (
override));
62 MOCK_METHOD(UINT, Win32DispatchMessage, (UINT, WPARAM, LPARAM), (
override));
63 MOCK_METHOD(BOOL, Win32PeekMessage, (LPMSG, UINT, UINT, UINT), (
override));
64 MOCK_METHOD(uint32_t, Win32MapVkToChar, (uint32_t), (
override));
65 MOCK_METHOD(HWND, GetWindowHandle, (), (
override));
66 MOCK_METHOD(ui::AXFragmentRootDelegateWin*,
67 GetAxFragmentRootDelegate,
74 LRESULT Win32DefWindowProc(HWND hWnd,
77 LPARAM lParam)
override {
78 return kWmResultDefault;
82 bool reset_view_on_exit_;
83 FML_DISALLOW_COPY_AND_ASSIGN(MockFlutterWindow);
86 LRESULT InjectPointerMessageWithClientPoint(MockFlutterWindow& window,
91 HWND flutter_window = window.FlutterWindow::GetWindowHandle();
93 CreateWindowEx(0, L
"STATIC", L
"", WS_POPUP, 100, 100, 300, 300,
nullptr,
94 nullptr, GetModuleHandle(
nullptr),
nullptr);
95 EXPECT_NE(parent_window,
nullptr);
96 EXPECT_NE(SetParent(flutter_window, parent_window),
nullptr);
97 EXPECT_TRUE(SetWindowPos(flutter_window,
nullptr, 0, 0, 100, 100,
98 SWP_NOZORDER | SWP_NOACTIVATE));
100 POINT point = {x, y};
101 EXPECT_TRUE(ClientToScreen(flutter_window, &point));
103 window.InjectWindowMessage(
message, wparam, MAKELPARAM(point.x, point.y));
105 EXPECT_NE(SetParent(flutter_window, HWND_MESSAGE),
nullptr);
106 DestroyWindow(parent_window);
110 class MockFlutterWindowsView :
public FlutterWindowsView {
113 std::unique_ptr<WindowBindingHandler> window_binding)
116 std::move(window_binding),
122 NotifyWinEventWrapper,
123 (ui::AXPlatformNodeWin*, ax::mojom::Event),
127 FML_DISALLOW_COPY_AND_ASSIGN(MockFlutterWindowsView);
130 class FlutterWindowTest :
public WindowsTest {};
134 TEST_F(FlutterWindowTest, CreateDestroy) {
135 std::unique_ptr<FlutterWindowsEngine> engine =
136 FlutterWindowsEngineBuilder{GetContext()}.Build();
141 TEST_F(FlutterWindowTest, OnBitmapSurfaceUpdated) {
142 std::unique_ptr<FlutterWindowsEngine> engine =
143 FlutterWindowsEngineBuilder{GetContext()}.Build();
144 FlutterWindow win32window(100, 100, engine->display_manager());
145 int old_handle_count = GetGuiResources(GetCurrentProcess(), GR_GDIOBJECTS);
147 constexpr
size_t row_bytes = 100 * 4;
148 constexpr
size_t height = 100;
149 std::array<char, row_bytes * height> allocation;
152 int new_handle_count = GetGuiResources(GetCurrentProcess(), GR_GDIOBJECTS);
154 EXPECT_EQ(old_handle_count, new_handle_count);
160 TEST_F(FlutterWindowTest, OnCursorRectUpdatedRegularDPI) {
161 MockFlutterWindow win32window;
162 EXPECT_CALL(win32window, GetDpiScale()).WillOnce(Return(1.0));
164 Rect cursor_rect(Point(10, 20), Size(30, 40));
165 EXPECT_CALL(win32window, UpdateCursorRect(cursor_rect)).Times(1);
167 win32window.OnCursorRectUpdated(cursor_rect);
173 TEST_F(FlutterWindowTest, OnCursorRectUpdatedHighDPI) {
174 MockFlutterWindow win32window;
175 EXPECT_CALL(win32window, GetDpiScale()).WillOnce(Return(1.5));
177 Rect expected_cursor_rect(Point(15, 30), Size(45, 60));
178 EXPECT_CALL(win32window, UpdateCursorRect(expected_cursor_rect)).Times(1);
180 Rect cursor_rect(Point(10, 20), Size(30, 40));
181 win32window.OnCursorRectUpdated(cursor_rect);
184 TEST_F(FlutterWindowTest, OnPointerStarSendsDeviceType) {
185 std::unique_ptr<FlutterWindowsEngine> engine =
186 FlutterWindowsEngineBuilder{GetContext()}.Build();
187 FlutterWindow win32window(100, 100, engine->display_manager());
188 MockWindowBindingHandlerDelegate delegate;
189 EXPECT_CALL(delegate, OnWindowStateEvent).Times(AnyNumber());
190 win32window.
SetView(&delegate);
193 EXPECT_CALL(delegate,
194 OnPointerMove(10.0, 10.0, kFlutterPointerDeviceKindMouse,
195 kDefaultPointerDeviceId, 0, 0, 0))
197 EXPECT_CALL(delegate,
198 OnPointerMove(10.0, 10.0, kFlutterPointerDeviceKindTouch,
199 kDefaultPointerDeviceId, 0, 0, 0))
201 EXPECT_CALL(delegate,
202 OnPointerMove(10.0, 10.0, kFlutterPointerDeviceKindStylus,
203 kDefaultPointerDeviceId, 0, 0, 0))
207 EXPECT_CALL(delegate,
208 OnPointerDown(10.0, 10.0, kFlutterPointerDeviceKindMouse,
209 kDefaultPointerDeviceId,
210 kFlutterPointerButtonMousePrimary, 0, 0))
212 EXPECT_CALL(delegate,
213 OnPointerDown(10.0, 10.0, kFlutterPointerDeviceKindTouch,
214 kDefaultPointerDeviceId,
215 kFlutterPointerButtonMousePrimary, 0, 0))
217 EXPECT_CALL(delegate,
218 OnPointerDown(10.0, 10.0, kFlutterPointerDeviceKindStylus,
219 kDefaultPointerDeviceId,
220 kFlutterPointerButtonMousePrimary, 0, 0))
224 EXPECT_CALL(delegate, OnPointerUp(10.0, 10.0, kFlutterPointerDeviceKindMouse,
225 kDefaultPointerDeviceId,
226 kFlutterPointerButtonMousePrimary))
228 EXPECT_CALL(delegate, OnPointerUp(10.0, 10.0, kFlutterPointerDeviceKindTouch,
229 kDefaultPointerDeviceId,
230 kFlutterPointerButtonMousePrimary))
232 EXPECT_CALL(delegate, OnPointerUp(10.0, 10.0, kFlutterPointerDeviceKindStylus,
233 kDefaultPointerDeviceId,
234 kFlutterPointerButtonMousePrimary))
238 EXPECT_CALL(delegate,
239 OnPointerLeave(10.0, 10.0, kFlutterPointerDeviceKindMouse,
240 kDefaultPointerDeviceId))
242 EXPECT_CALL(delegate,
243 OnPointerLeave(10.0, 10.0, kFlutterPointerDeviceKindTouch,
244 kDefaultPointerDeviceId))
246 EXPECT_CALL(delegate,
247 OnPointerLeave(10.0, 10.0, kFlutterPointerDeviceKindStylus,
248 kDefaultPointerDeviceId))
251 win32window.
OnPointerMove(10.0, 10.0, kFlutterPointerDeviceKindMouse,
252 kDefaultPointerDeviceId, 0, 0, 0);
253 win32window.
OnPointerDown(10.0, 10.0, kFlutterPointerDeviceKindMouse,
254 kDefaultPointerDeviceId, WM_LBUTTONDOWN, 0, 0);
255 win32window.
OnPointerUp(10.0, 10.0, kFlutterPointerDeviceKindMouse,
256 kDefaultPointerDeviceId, WM_LBUTTONDOWN);
257 win32window.
OnPointerLeave(10.0, 10.0, kFlutterPointerDeviceKindMouse,
258 kDefaultPointerDeviceId);
261 win32window.
OnPointerMove(10.0, 10.0, kFlutterPointerDeviceKindTouch,
262 kDefaultPointerDeviceId, 0, 0, 0);
263 win32window.
OnPointerDown(10.0, 10.0, kFlutterPointerDeviceKindTouch,
264 kDefaultPointerDeviceId, WM_LBUTTONDOWN, 0, 0);
265 win32window.
OnPointerUp(10.0, 10.0, kFlutterPointerDeviceKindTouch,
266 kDefaultPointerDeviceId, WM_LBUTTONDOWN);
267 win32window.
OnPointerLeave(10.0, 10.0, kFlutterPointerDeviceKindTouch,
268 kDefaultPointerDeviceId);
271 win32window.
OnPointerMove(10.0, 10.0, kFlutterPointerDeviceKindStylus,
272 kDefaultPointerDeviceId, 0, 0, 0);
273 win32window.
OnPointerDown(10.0, 10.0, kFlutterPointerDeviceKindStylus,
274 kDefaultPointerDeviceId, WM_LBUTTONDOWN, 0, 0);
275 win32window.
OnPointerUp(10.0, 10.0, kFlutterPointerDeviceKindStylus,
276 kDefaultPointerDeviceId, WM_LBUTTONDOWN);
277 win32window.
OnPointerLeave(10.0, 10.0, kFlutterPointerDeviceKindStylus,
278 kDefaultPointerDeviceId);
285 TEST_F(FlutterWindowTest, OnStylusPointerDown) {
286 auto mock_proc_table = std::make_shared<MockWindowsProcTable>();
289 EXPECT_CALL(*mock_proc_table, GetPointerInfo(_, _))
290 .WillRepeatedly([](UINT32 pointer_id, POINTER_INFO* pointer_info) {
291 if (pointer_info !=
nullptr) {
292 pointer_info->pointerType = PT_PEN;
293 pointer_info->pointerId = pointer_id;
294 pointer_info->pointerFlags = POINTER_FLAG_INCONTACT;
299 EXPECT_CALL(*mock_proc_table, GetPointerPenInfo(_, _))
300 .WillRepeatedly([](UINT32 pointer_id, POINTER_PEN_INFO* pen_info) {
301 if (pen_info !=
nullptr) {
302 pen_info->pressure = 720;
303 pen_info->rotation = 0;
308 POINTER_INFO test_pointer_info = {};
309 BOOL result = mock_proc_table->GetPointerInfo(1, &test_pointer_info);
311 MockFlutterWindow win32window(100, 100, mock_proc_table);
312 MockWindowBindingHandlerDelegate delegate;
314 win32window.SetView(&delegate);
316 EXPECT_CALL(delegate,
317 OnPointerDown(10.0, 10.0, kFlutterPointerDeviceKindStylus,
318 kDefaultPointerDeviceId,
319 kFlutterPointerButtonMousePrimary, 720, 0))
322 UINT32 pointerId = 1;
323 WPARAM wparam =
static_cast<WPARAM
>(pointerId);
324 InjectPointerMessageWithClientPoint(win32window, WM_POINTERDOWN, wparam, 10,
328 TEST_F(FlutterWindowTest, OnStylusPointerMove) {
329 auto mock_proc_table = std::make_shared<MockWindowsProcTable>();
331 EXPECT_CALL(*mock_proc_table, GetPointerInfo(_, _))
332 .WillRepeatedly([](UINT32 pointer_id, POINTER_INFO* pointer_info) {
333 if (pointer_info !=
nullptr) {
334 pointer_info->pointerType = PT_PEN;
335 pointer_info->pointerId = pointer_id;
336 pointer_info->pointerFlags =
337 POINTER_FLAG_INCONTACT | POINTER_FLAG_UPDATE;
342 EXPECT_CALL(*mock_proc_table, GetPointerPenInfo(_, _))
343 .WillRepeatedly([](UINT32 pointer_id, POINTER_PEN_INFO* pen_info) {
344 if (pen_info !=
nullptr) {
345 pen_info->pressure = 720;
346 pen_info->rotation = 10;
351 MockFlutterWindow win32window(100, 100, mock_proc_table);
352 MockWindowBindingHandlerDelegate delegate;
353 win32window.SetView(&delegate);
355 EXPECT_CALL(delegate, OnPointerMove(15, 20, kFlutterPointerDeviceKindStylus,
356 kDefaultPointerDeviceId, 10, 720, 0))
359 UINT32 pointerId = 1;
360 WPARAM wparam =
static_cast<WPARAM
>(pointerId);
361 InjectPointerMessageWithClientPoint(win32window, WM_POINTERUPDATE, wparam, 15,
365 TEST_F(FlutterWindowTest, OnStylusPointerUp) {
366 auto mock_proc_table = std::make_shared<MockWindowsProcTable>();
368 EXPECT_CALL(*mock_proc_table, GetPointerInfo(_, _))
369 .WillRepeatedly([](UINT32 pointer_id, POINTER_INFO* pointer_info) {
370 if (pointer_info !=
nullptr) {
371 pointer_info->pointerType = PT_PEN;
372 pointer_info->pointerId = pointer_id;
373 pointer_info->pointerFlags = POINTER_FLAG_UP;
378 EXPECT_CALL(*mock_proc_table, GetPointerPenInfo(_, _))
379 .WillRepeatedly([](UINT32 pointer_id, POINTER_PEN_INFO* pen_info) {
380 if (pen_info !=
nullptr) {
381 pen_info->pressure = 720;
382 pen_info->rotation = 0;
387 MockFlutterWindow win32window(100, 100, mock_proc_table);
388 MockWindowBindingHandlerDelegate delegate;
389 win32window.SetView(&delegate);
391 EXPECT_CALL(delegate, OnPointerUp(25, 30, kFlutterPointerDeviceKindStylus,
392 kDefaultPointerDeviceId,
393 kFlutterPointerButtonMousePrimary))
396 UINT32 pointerId = 1;
397 WPARAM wparam =
static_cast<WPARAM
>(pointerId);
398 InjectPointerMessageWithClientPoint(win32window, WM_POINTERUP, wparam, 25,
402 TEST_F(FlutterWindowTest, OnStylusPointerLeave) {
403 auto mock_proc_table = std::make_shared<MockWindowsProcTable>();
405 EXPECT_CALL(*mock_proc_table, GetPointerInfo(_, _))
406 .WillRepeatedly([](UINT32 pointer_id, POINTER_INFO* pointer_info) {
407 if (pointer_info !=
nullptr) {
408 pointer_info->pointerType = PT_PEN;
409 pointer_info->pointerId = pointer_id;
410 pointer_info->pointerFlags = POINTER_FLAG_UP;
415 EXPECT_CALL(*mock_proc_table, GetPointerPenInfo(_, _))
416 .WillRepeatedly([](UINT32 pointer_id, POINTER_PEN_INFO* pen_info) {
417 if (pen_info !=
nullptr) {
418 pen_info->pressure = 720;
419 pen_info->rotation = 0;
424 MockFlutterWindow win32window(100, 100, mock_proc_table);
425 MockWindowBindingHandlerDelegate delegate;
426 win32window.SetView(&delegate);
428 EXPECT_CALL(delegate, OnPointerLeave(35, 40, kFlutterPointerDeviceKindStylus,
429 kDefaultPointerDeviceId))
432 UINT32 pointerId = 1;
433 WPARAM wparam =
static_cast<WPARAM
>(pointerId);
434 InjectPointerMessageWithClientPoint(win32window, WM_POINTERLEAVE, wparam, 35,
438 TEST_F(FlutterWindowTest, OnStylusPointerHover) {
441 auto mock_proc_table = std::make_shared<MockWindowsProcTable>();
443 EXPECT_CALL(*mock_proc_table, GetPointerInfo(_, _))
444 .WillRepeatedly([](UINT32 pointer_id, POINTER_INFO* pointer_info) {
445 if (pointer_info !=
nullptr) {
446 pointer_info->pointerId = 1;
447 pointer_info->pointerType = PT_PEN;
449 pointer_info->pointerFlags = POINTER_FLAG_UPDATE;
450 pointer_info->ptPixelLocation.x = 45;
451 pointer_info->ptPixelLocation.y = 50;
456 EXPECT_CALL(*mock_proc_table, GetPointerPenInfo(_, _))
457 .WillRepeatedly([](UINT32 pointer_id, POINTER_PEN_INFO* pen_info) {
458 if (pen_info !=
nullptr) {
459 pen_info->pressure = 0;
460 pen_info->rotation = 0;
465 MockFlutterWindow win32window(100, 100, mock_proc_table);
466 MockWindowBindingHandlerDelegate delegate;
467 win32window.SetView(&delegate);
470 EXPECT_CALL(delegate,
471 OnPointerDown(45, 50, kFlutterPointerDeviceKindStylus, 0,
472 kFlutterPointerButtonMousePrimary, 0, 0))
475 UINT32 pointerId = 1;
476 WPARAM wparam =
static_cast<WPARAM
>(pointerId);
477 InjectPointerMessageWithClientPoint(win32window, WM_POINTERDOWN, wparam, 45,
481 EXPECT_CALL(delegate, OnPointerMove(45, 50, kFlutterPointerDeviceKindStylus,
486 InjectPointerMessageWithClientPoint(win32window, WM_POINTERUPDATE, wparam, 45,
490 TEST_F(FlutterWindowTest, OnMousePointerDown) {
491 auto mock_proc_table = std::make_shared<MockWindowsProcTable>();
493 EXPECT_CALL(*mock_proc_table, GetPointerInfo(_, _))
494 .WillRepeatedly([](UINT32 pointer_id, POINTER_INFO* pointer_info) {
495 if (pointer_info !=
nullptr) {
496 pointer_info->pointerType = PT_MOUSE;
497 pointer_info->pointerId = pointer_id;
498 pointer_info->pointerFlags = POINTER_FLAG_INCONTACT;
503 MockFlutterWindow win32window(100, 100, mock_proc_table);
504 MockWindowBindingHandlerDelegate delegate;
505 win32window.SetView(&delegate);
507 EXPECT_CALL(delegate, OnPointerDown(45, 50, kFlutterPointerDeviceKindMouse,
508 kDefaultPointerDeviceId,
509 kFlutterPointerButtonMousePrimary, 0, 0))
512 UINT32 pointerId = 1;
513 WPARAM wparam =
static_cast<WPARAM
>(pointerId);
514 InjectPointerMessageWithClientPoint(win32window, WM_POINTERDOWN, wparam, 45,
518 TEST_F(FlutterWindowTest, OnTouchPointerDown) {
519 auto mock_proc_table = std::make_shared<MockWindowsProcTable>();
521 EXPECT_CALL(*mock_proc_table, GetPointerInfo(_, _))
522 .WillRepeatedly([](UINT32 pointer_id, POINTER_INFO* pointer_info) {
523 if (pointer_info !=
nullptr) {
524 pointer_info->pointerType = PT_TOUCH;
525 pointer_info->pointerId = pointer_id;
526 pointer_info->pointerFlags = POINTER_FLAG_INCONTACT;
531 MockFlutterWindow win32window(100, 100, mock_proc_table);
532 MockWindowBindingHandlerDelegate delegate;
533 win32window.SetView(&delegate);
535 EXPECT_CALL(delegate, OnPointerDown(55, 60, kFlutterPointerDeviceKindTouch,
536 kDefaultPointerDeviceId,
537 kFlutterPointerButtonMousePrimary, 0, 0))
540 UINT32 pointerId = 1;
541 WPARAM wparam =
static_cast<WPARAM
>(pointerId);
542 InjectPointerMessageWithClientPoint(win32window, WM_POINTERDOWN, wparam, 55,
546 TEST_F(FlutterWindowTest, PointerMessageScreenCoordinatesAreConvertedToClient) {
547 constexpr
int kClientX = 15;
548 constexpr
int kClientY = 20;
550 auto mock_proc_table = std::make_shared<MockWindowsProcTable>();
552 EXPECT_CALL(*mock_proc_table, GetPointerInfo(_, _))
553 .WillRepeatedly([](UINT32 pointer_id, POINTER_INFO* pointer_info) {
554 if (pointer_info !=
nullptr) {
555 pointer_info->pointerType = PT_TOUCH;
556 pointer_info->pointerId = pointer_id;
557 pointer_info->pointerFlags = POINTER_FLAG_INCONTACT;
562 MockFlutterWindow win32window(100, 100, mock_proc_table);
563 MockWindowBindingHandlerDelegate delegate;
564 EXPECT_CALL(win32window, OnWindowStateEvent).Times(AnyNumber());
565 EXPECT_CALL(delegate, OnWindowStateEvent).Times(AnyNumber());
566 win32window.SetView(&delegate);
569 CreateWindowEx(0, L
"STATIC", L
"", WS_POPUP, 100, 100, 300, 300,
nullptr,
570 nullptr, GetModuleHandle(
nullptr),
nullptr);
571 ASSERT_NE(parent_window,
nullptr);
573 HWND flutter_window = win32window.FlutterWindow::GetWindowHandle();
574 ASSERT_NE(flutter_window,
nullptr);
575 ASSERT_NE(SetParent(flutter_window, parent_window),
nullptr);
576 ASSERT_TRUE(SetWindowPos(flutter_window,
nullptr, 25, 35, 100, 100,
577 SWP_NOZORDER | SWP_NOACTIVATE));
579 POINT pointer_point = {kClientX, kClientY};
580 ASSERT_TRUE(ClientToScreen(flutter_window, &pointer_point));
582 EXPECT_CALL(delegate,
583 OnPointerDown(kClientX, kClientY, kFlutterPointerDeviceKindTouch,
584 kDefaultPointerDeviceId,
585 kFlutterPointerButtonMousePrimary, 0, 0))
588 win32window.InjectWindowMessage(WM_POINTERDOWN, 1,
589 MAKELPARAM(pointer_point.x, pointer_point.y));
591 EXPECT_NE(SetParent(flutter_window, HWND_MESSAGE),
nullptr);
592 DestroyWindow(parent_window);
597 TEST_F(FlutterWindowTest, OnScrollCallsGetScrollOffsetMultiplier) {
598 MockFlutterWindow win32window;
599 MockWindowBindingHandlerDelegate delegate;
600 EXPECT_CALL(win32window, OnWindowStateEvent).Times(AnyNumber());
601 win32window.SetView(&delegate);
603 EXPECT_CALL(win32window, GetWindowHandle).WillOnce([&win32window]() {
604 return win32window.FlutterWindow::GetWindowHandle();
606 EXPECT_CALL(win32window, GetScrollOffsetMultiplier).WillOnce(Return(120.0f));
608 EXPECT_CALL(delegate,
609 OnScroll(_, _, 0, 0, 120.0f, kFlutterPointerDeviceKindMouse,
610 kDefaultPointerDeviceId))
613 win32window.OnScroll(0.0f, 0.0f, kFlutterPointerDeviceKindMouse,
614 kDefaultPointerDeviceId);
617 TEST_F(FlutterWindowTest, OnWindowRepaint) {
618 MockFlutterWindow win32window;
619 MockWindowBindingHandlerDelegate delegate;
620 EXPECT_CALL(win32window, OnWindowStateEvent).Times(AnyNumber());
621 win32window.SetView(&delegate);
623 EXPECT_CALL(delegate, OnWindowRepaint()).Times(1);
625 win32window.InjectWindowMessage(WM_PAINT, 0, 0);
628 TEST_F(FlutterWindowTest, OnThemeChange) {
629 MockFlutterWindow win32window;
630 MockWindowBindingHandlerDelegate delegate;
631 EXPECT_CALL(win32window, OnWindowStateEvent).Times(AnyNumber());
632 win32window.SetView(&delegate);
634 EXPECT_CALL(delegate, OnHighContrastChanged).Times(1);
636 win32window.InjectWindowMessage(WM_THEMECHANGED, 0, 0);
642 TEST_F(FlutterWindowTest, AccessibilityNodeWithoutView) {
643 MockFlutterWindow win32window;
645 EXPECT_EQ(win32window.GetNativeViewAccessible(),
nullptr);
651 std::unique_ptr<FlutterWindowsEngine> engine =
652 FlutterWindowsEngineBuilder{GetContext()}.Build();
653 auto win32window = std::make_unique<MockFlutterWindow>();
654 EXPECT_CALL(*win32window.get(), GetAxFragmentRootDelegate())
655 .WillRepeatedly(Return(
nullptr));
656 EXPECT_CALL(*win32window.get(), OnWindowStateEvent).Times(AnyNumber());
657 EXPECT_CALL(*win32window.get(), GetWindowHandle).Times(AnyNumber());
658 MockFlutterWindowsView view{engine.get(), std::move(win32window)};
659 std::wstring
message = L
"Test alert";
660 EXPECT_CALL(view, NotifyWinEventWrapper(_, ax::mojom::Event::kAlert))
665 VARIANT
self{.vt = VT_I4, .lVal = CHILDID_SELF};
667 alert->get_accName(
self, &strptr);
670 alert->get_accDescription(
self, &strptr);
673 alert->get_accValue(
self, &strptr);
677 alert->get_accRole(
self, &role);
678 EXPECT_EQ(role.vt, VT_I4);
679 EXPECT_EQ(role.lVal, ROLE_SYSTEM_ALERT);
682 TEST_F(FlutterWindowTest, LifecycleFocusMessages) {
683 MockFlutterWindow win32window;
684 EXPECT_CALL(win32window, GetWindowHandle)
685 .WillRepeatedly(Return(
reinterpret_cast<HWND
>(1)));
686 MockWindowBindingHandlerDelegate delegate;
689 EXPECT_CALL(delegate, OnWindowStateEvent)
693 EXPECT_CALL(win32window, OnWindowStateEvent)
695 win32window.FlutterWindow::OnWindowStateEvent(event);
697 EXPECT_CALL(win32window, OnResize).Times(AnyNumber());
699 win32window.SetView(&delegate);
701 win32window.InjectWindowMessage(WM_SIZE, 0, 0);
704 win32window.InjectWindowMessage(WM_SIZE, 0, MAKEWORD(1, 1));
707 EXPECT_CALL(delegate, OnFocus(Eq(FlutterViewFocusState::kFocused),
708 Eq(FlutterViewFocusDirection::kUndefined)))
710 win32window.InjectWindowMessage(WM_SETFOCUS, 0, 0);
713 EXPECT_CALL(delegate, OnFocus(Eq(FlutterViewFocusState::kUnfocused),
714 Eq(FlutterViewFocusDirection::kUndefined)))
716 win32window.InjectWindowMessage(WM_KILLFOCUS, 0, 0);
720 TEST_F(FlutterWindowTest, CachedLifecycleMessage) {
721 MockFlutterWindow win32window;
722 EXPECT_CALL(win32window, GetWindowHandle)
723 .WillRepeatedly(Return(
reinterpret_cast<HWND
>(1)));
724 EXPECT_CALL(win32window, OnWindowStateEvent)
726 win32window.FlutterWindow::OnWindowStateEvent(event);
728 EXPECT_CALL(win32window, OnResize).Times(1);
731 win32window.InjectWindowMessage(WM_SIZE, 0, MAKEWORD(1, 1));
734 win32window.InjectWindowMessage(WM_SETFOCUS, 0, 0);
736 MockWindowBindingHandlerDelegate delegate;
737 bool focused =
false;
738 bool restored =
false;
739 EXPECT_CALL(delegate, OnWindowStateEvent)
748 EXPECT_CALL(delegate, OnFocus(Eq(FlutterViewFocusState::kFocused),
749 Eq(FlutterViewFocusDirection::kUndefined)))
751 win32window.SetView(&delegate);
752 EXPECT_TRUE(focused);
753 EXPECT_TRUE(restored);
virtual void OnPointerMove(double x, double y, FlutterPointerDeviceKind device_kind, int32_t device_id, uint32_t rotation, uint32_t pressure, int modifiers_state)
virtual void OnPointerLeave(double x, double y, FlutterPointerDeviceKind device_kind, int32_t device_id)
virtual bool OnBitmapSurfaceUpdated(const void *allocation, size_t row_bytes, size_t height) override
virtual void OnPointerDown(double x, double y, FlutterPointerDeviceKind device_kind, int32_t device_id, UINT button, uint32_t rotation, uint32_t pressure)
virtual void OnPointerUp(double x, double y, FlutterPointerDeviceKind device_kind, int32_t device_id, UINT button)
virtual void SetView(WindowBindingHandlerDelegate *view) override
virtual float GetDpiScale() override
FlutterWindowsView(FlutterViewId view_id, FlutterWindowsEngine *engine, std::unique_ptr< WindowBindingHandler > window_binding, bool is_sized_to_content, const BoxConstraints &box_constraints, FlutterWindowsViewSizingDelegate *sizing_delegate=nullptr, std::shared_ptr< WindowsProcTable > windows_proc_table=nullptr)
MOCK_METHOD(void, NotifyWinEventWrapper,(ui::AXPlatformNodeWin *, ax::mojom::Event),(override))
MockFlutterWindowsView(FlutterWindowsEngine *engine, std::unique_ptr< WindowBindingHandler > wbh)
TEST_F(AccessibilityPluginTest, DirectAnnounceCall)
WindowStateEvent
An event representing a change in window state that may update the.
constexpr FlutterViewId kImplicitViewId