5 #include "flutter/fml/logging.h"
7 #include "flutter/shell/platform/embedder/embedder.h"
8 #include "flutter/shell/platform/embedder/test_utils/key_codes.g.h"
15 #include "flutter/shell/platform/windows/testing/engine_modifier.h"
16 #include "flutter/shell/platform/windows/testing/flutter_windows_engine_builder.h"
17 #include "flutter/shell/platform/windows/testing/mock_window_binding_handler.h"
18 #include "flutter/shell/platform/windows/testing/test_keyboard.h"
19 #include "flutter/shell/platform/windows/testing/windows_test.h"
21 #include "gmock/gmock.h"
22 #include "gtest/gtest.h"
23 #include "rapidjson/stringbuffer.h"
24 #include "rapidjson/writer.h"
31 using testing::Invoke;
32 using testing::Return;
33 using namespace ::flutter::testing::keycodes;
40 constexpr SHORT kStateMaskToggled = 0x01;
41 constexpr SHORT kStateMaskPressed = 0x80;
43 constexpr uint64_t kScanCodeBackquote = 0x29;
45 constexpr uint64_t kScanCodeKeyB = 0x30;
46 constexpr uint64_t kScanCodeKeyE = 0x12;
47 constexpr uint64_t kScanCodeKeyF = 0x21;
48 constexpr uint64_t kScanCodeKeyO = 0x18;
49 constexpr uint64_t kScanCodeKeyQ = 0x10;
50 constexpr uint64_t kScanCodeKeyW = 0x11;
51 constexpr uint64_t kScanCodeDigit1 = 0x02;
52 constexpr uint64_t kScanCodeDigit2 = 0x03;
53 constexpr uint64_t kScanCodeDigit6 = 0x07;
56 constexpr uint64_t kScanCodeControl = 0x1d;
57 constexpr uint64_t kScanCodeMetaLeft = 0x5b;
58 constexpr uint64_t kScanCodeMetaRight = 0x5c;
59 constexpr uint64_t kScanCodeAlt = 0x38;
62 constexpr uint64_t kScanCodeBracketLeft = 0x1a;
63 constexpr uint64_t kScanCodeArrowLeft = 0x4b;
64 constexpr uint64_t kScanCodeEnter = 0x1c;
65 constexpr uint64_t kScanCodeBackspace = 0x0e;
67 constexpr uint64_t kVirtualDigit1 = 0x31;
69 constexpr uint64_t kVirtualKeyB = 0x42;
70 constexpr uint64_t kVirtualKeyE = 0x45;
71 constexpr uint64_t kVirtualKeyF = 0x46;
72 constexpr uint64_t kVirtualKeyO = 0x4f;
73 constexpr uint64_t kVirtualKeyQ = 0x51;
74 constexpr uint64_t kVirtualKeyW = 0x57;
76 constexpr
bool kSynthesized =
true;
77 constexpr
bool kNotSynthesized =
false;
79 typedef UINT (*MapVirtualKeyLayout)(UINT uCode, UINT uMapType);
80 typedef std::function<UINT(UINT)> MapVirtualKeyToChar;
82 UINT LayoutDefault(UINT uCode, UINT uMapType) {
83 return MapVirtualKey(uCode, uMapType);
86 UINT LayoutFrench(UINT uCode, UINT uMapType) {
88 case MAPVK_VK_TO_CHAR:
93 return MapVirtualKey(uCode, MAPVK_VK_TO_CHAR);
96 return MapVirtualKey(uCode, uMapType);
100 class TestKeyboardManager :
public KeyboardManager {
102 explicit TestKeyboardManager(WindowDelegate* delegate)
103 : KeyboardManager(delegate) {}
105 bool DuringRedispatch() {
return during_redispatch_; }
108 void RedispatchEvent(std::unique_ptr<PendingEvent> event)
override {
109 FML_DCHECK(!during_redispatch_)
110 <<
"RedispatchEvent called while already redispatching an event";
111 during_redispatch_ =
true;
113 during_redispatch_ =
false;
117 bool during_redispatch_ =
false;
119 FML_DISALLOW_COPY_AND_ASSIGN(TestKeyboardManager);
124 struct KeyStateChange {
136 struct ExpectForgedMessage {
142 struct KeyboardChange {
145 KeyboardChange(Win32Message
message) :
type(kMessage) {
149 KeyboardChange(KeyStateChange change) :
type(kKeyStateChange) {
150 content.key_state_change = change;
153 KeyboardChange(ExpectForgedMessage forged_message)
154 :
type(kExpectForgedMessage) {
155 content.expected_forged_message = forged_message.message;
161 kExpectForgedMessage,
174 state_[virtual_key] = (
pressed ? kStateMaskPressed : 0) |
178 SHORT Get(uint32_t virtual_key) {
return state_[virtual_key]; }
181 std::map<uint32_t, SHORT> state_;
184 class MockKeyboardManagerDelegate :
public KeyboardManager::WindowDelegate,
185 protected MockMessageQueue {
187 MockKeyboardManagerDelegate(WindowBindingHandlerDelegate* view,
188 MapVirtualKeyToChar map_vk_to_char)
189 : view_(view), map_vk_to_char_(std::move(map_vk_to_char)) {
190 keyboard_manager_ = std::make_unique<TestKeyboardManager>(
this);
192 virtual ~MockKeyboardManagerDelegate() {}
201 KeyEventCallback
callback)
override {
207 void OnText(
const std::u16string&
text)
override { view_->OnText(
text); }
209 SHORT GetKeyState(
int virtual_key) {
return key_state_.Get(virtual_key); }
211 void InjectKeyboardChanges(std::vector<KeyboardChange> changes) {
213 for (
const KeyboardChange& change : changes) {
214 switch (change.type) {
215 case KeyboardChange::kMessage:
216 PushBack(&change.content.message);
222 for (
const KeyboardChange& change : changes) {
223 switch (change.type) {
224 case KeyboardChange::kMessage:
227 case KeyboardChange::kExpectForgedMessage:
228 forged_message_expectations_.push_back(ForgedMessageExpectation{
229 .message = change.content.expected_forged_message,
232 case KeyboardChange::kKeyStateChange: {
233 const KeyStateChange& state_change = change.content.key_state_change;
234 if (forged_message_expectations_.empty()) {
235 key_state_.Set(state_change.key, state_change.pressed,
236 state_change.toggled_on);
238 forged_message_expectations_.back()
239 .state_changes_afterwards.push_back(state_change);
244 FML_LOG(FATAL) <<
"Unhandled KeyboardChange type " << change.type;
249 std::list<Win32Message>& RedispatchedMessages() {
250 return redispatched_messages_;
254 BOOL Win32PeekMessage(LPMSG lpMsg,
257 UINT wRemoveMsg)
override {
258 return MockMessageQueue::Win32PeekMessage(lpMsg, wMsgFilterMin,
259 wMsgFilterMax, wRemoveMsg);
262 uint32_t Win32MapVkToChar(uint32_t virtual_key)
override {
263 return map_vk_to_char_(virtual_key);
268 LRESULT Win32SendMessage(UINT
const message,
270 LPARAM
const lparam)
override {
271 return keyboard_manager_->HandleMessage(
message, wparam, lparam)
278 UINT Win32DispatchMessage(UINT Msg, WPARAM wParam, LPARAM lParam)
override {
279 bool handled = keyboard_manager_->HandleMessage(Msg, wParam, lParam);
280 if (keyboard_manager_->DuringRedispatch()) {
281 redispatched_messages_.push_back(Win32Message{
286 EXPECT_FALSE(handled);
288 EXPECT_FALSE(forged_message_expectations_.empty());
289 ForgedMessageExpectation expectation =
290 forged_message_expectations_.front();
291 forged_message_expectations_.pop_front();
292 EXPECT_EQ(expectation.message.message, Msg);
293 EXPECT_EQ(expectation.message.wParam, wParam);
294 EXPECT_EQ(expectation.message.lParam, lParam);
295 if (expectation.message.expected_result != kWmResultDontCheck) {
296 EXPECT_EQ(expectation.message.expected_result,
297 handled ? kWmResultZero : kWmResultDefault);
299 for (
const KeyStateChange& change :
300 expectation.state_changes_afterwards) {
301 key_state_.Set(change.key, change.pressed, change.toggled_on);
308 struct ForgedMessageExpectation {
313 WindowBindingHandlerDelegate* view_;
314 std::unique_ptr<TestKeyboardManager> keyboard_manager_;
315 std::list<ForgedMessageExpectation> forged_message_expectations_;
316 MapVirtualKeyToChar map_vk_to_char_;
317 TestKeystate key_state_;
318 std::list<Win32Message> redispatched_messages_;
320 FML_DISALLOW_COPY_AND_ASSIGN(MockKeyboardManagerDelegate);
327 kKeyCallTextMethodCall,
337 class TestFlutterWindowsView :
public FlutterWindowsView {
339 TestFlutterWindowsView(FlutterWindowsEngine* engine,
340 std::unique_ptr<WindowBindingHandler> window,
341 std::function<
void(KeyCall)> on_key_call)
342 : on_key_call_(on_key_call),
349 void OnText(
const std::u16string&
text)
override {
350 on_key_call_(KeyCall{
351 .type = KeyCall::kKeyCallOnText,
357 std::function<void(KeyCall)> on_key_call_;
359 FML_DISALLOW_COPY_AND_ASSIGN(TestFlutterWindowsView);
362 class KeyboardTester {
364 using ResponseHandler =
365 std::function<void(MockKeyResponseController::ResponseCallback)>;
367 explicit KeyboardTester(WindowsTestContext& context)
368 : callback_handler_(RespondValue(false)),
369 map_virtual_key_layout_(LayoutDefault) {
370 engine_ = GetTestEngine(context);
371 view_ = std::make_unique<TestFlutterWindowsView>(
375 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>(),
376 [
this](KeyCall key_call) { key_calls.push_back(key_call); });
378 EngineModifier modifier{engine_.get()};
379 modifier.SetImplicitView(view_.get());
380 modifier.InitializeKeyboard();
382 window_ = std::make_unique<MockKeyboardManagerDelegate>(
383 view_.get(), [
this](UINT virtual_key) -> SHORT {
384 return map_virtual_key_layout_(virtual_key, MAPVK_VK_TO_CHAR);
388 TestFlutterWindowsView& GetView() {
return *view_; }
389 MockKeyboardManagerDelegate& GetWindow() {
return *window_; }
392 void ResetKeyboard() { EngineModifier{engine_.get()}.Restart(); }
395 void Responding(
bool response) { callback_handler_ = RespondValue(response); }
404 MockKeyResponseController::EmbedderCallbackHandler handler) {
405 callback_handler_ = std::move(handler);
408 void SetLayout(MapVirtualKeyLayout layout) {
409 map_virtual_key_layout_ = layout ==
nullptr ? LayoutDefault : layout;
412 void InjectKeyboardChanges(std::vector<KeyboardChange> changes) {
413 FML_DCHECK(window_ !=
nullptr);
414 window_->InjectKeyboardChanges(std::move(changes));
418 void InjectPlatformMessage(
const char* channel,
421 rapidjson::Document args_doc;
422 args_doc.Parse(args);
423 FML_DCHECK(!args_doc.HasParseError());
425 rapidjson::Document message_doc(rapidjson::kObjectType);
426 auto& allocator = message_doc.GetAllocator();
427 message_doc.AddMember(
"method", rapidjson::Value(method, allocator),
429 message_doc.AddMember(
"args", args_doc, allocator);
431 rapidjson::StringBuffer buffer;
432 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
433 message_doc.Accept(writer);
435 std::unique_ptr<std::vector<uint8_t>> data =
437 FlutterPlatformMessageResponseHandle response_handle;
438 const FlutterPlatformMessage
message = {
439 sizeof(FlutterPlatformMessage),
445 view_->GetEngine()->HandlePlatformMessage(&
message);
450 size_t RedispatchedMessageCountAndClear() {
451 auto& messages = window_->RedispatchedMessages();
452 size_t count = messages.size();
457 void clear_key_calls() {
459 if (key_call.type == KeyCall::kKeyCallOnKey &&
460 key_call.key_event.character !=
nullptr) {
461 delete[] key_call.key_event.character;
470 std::unique_ptr<FlutterWindowsEngine> engine_;
471 std::unique_ptr<TestFlutterWindowsView> view_;
472 std::unique_ptr<MockKeyboardManagerDelegate> window_;
473 MockKeyResponseController::EmbedderCallbackHandler callback_handler_;
474 MapVirtualKeyLayout map_virtual_key_layout_;
479 std::unique_ptr<FlutterWindowsEngine> GetTestEngine(
480 WindowsTestContext& context) {
481 FlutterWindowsEngineBuilder builder{context};
483 builder.SetCreateKeyboardHandlerCallbacks(
484 [
this](
int virtual_key) -> SHORT {
487 return window_ ? window_->GetKeyState(virtual_key) : 0;
489 [
this](UINT virtual_key,
bool extended) -> SHORT {
490 return map_virtual_key_layout_(
491 virtual_key,
extended ? MAPVK_VK_TO_VSC_EX : MAPVK_VK_TO_VSC);
494 auto engine = builder.Build();
496 EngineModifier modifier(engine.get());
498 auto key_response_controller =
499 std::make_shared<MockKeyResponseController>();
500 key_response_controller->SetEmbedderResponse(
502 const FlutterKeyEvent* event,
503 MockKeyResponseController::ResponseCallback
callback) {
504 FlutterKeyEvent clone_event = *event;
505 clone_event.character =
event->character ==
nullptr
507 : clone_string(event->character);
509 .type = KeyCall::kKeyCallOnKey,
510 .key_event = clone_event,
514 key_response_controller->SetTextInputResponse(
516 key_calls](std::unique_ptr<rapidjson::Document> document) {
517 rapidjson::StringBuffer buffer;
518 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
519 document->Accept(writer);
521 .type = KeyCall::kKeyCallTextMethodCall,
522 .text_method_call = buffer.GetString(),
525 MockEmbedderApiForKeyboard(modifier, key_response_controller);
532 static MockKeyResponseController::EmbedderCallbackHandler RespondValue(
534 return [value](
const FlutterKeyEvent* event,
535 MockKeyResponseController::ResponseCallback
callback) {
541 FML_DISALLOW_COPY_AND_ASSIGN(KeyboardTester);
544 class KeyboardTest :
public WindowsTest {
546 KeyboardTest() =
default;
547 virtual ~KeyboardTest() =
default;
550 FML_DISALLOW_COPY_AND_ASSIGN(KeyboardTest);
558 #define EXPECT_CALL_IS_EVENT(_key_call, _type, _physical, _logical, \
559 _character, _synthesized) \
560 EXPECT_EQ(_key_call.type, KeyCall::kKeyCallOnKey); \
561 EXPECT_EVENT_EQUALS(_key_call.key_event, _type, _physical, _logical, \
562 _character, _synthesized);
564 #define EXPECT_CALL_IS_TEXT(_key_call, u16_string) \
565 EXPECT_EQ(_key_call.type, KeyCall::kKeyCallOnText); \
566 EXPECT_EQ(_key_call.text, u16_string);
568 #define EXPECT_CALL_IS_TEXT_METHOD_CALL(_key_call, json_string) \
569 EXPECT_EQ(_key_call.type, KeyCall::kKeyCallTextMethodCall); \
570 EXPECT_STREQ(_key_call.text_method_call.c_str(), json_string);
572 TEST_F(KeyboardTest, LowerCaseAHandled) {
573 KeyboardTester tester{GetContext()};
574 tester.Responding(
true);
579 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
585 EXPECT_EQ(tester.key_calls.size(), 1);
587 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
588 tester.clear_key_calls();
589 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
592 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
596 EXPECT_EQ(tester.key_calls.size(), 1);
598 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
599 tester.clear_key_calls();
600 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
603 TEST_F(KeyboardTest, LowerCaseAUnhandled) {
604 KeyboardTester tester{GetContext()};
605 tester.Responding(
false);
610 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
616 EXPECT_EQ(tester.key_calls.size(), 2);
618 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
620 tester.clear_key_calls();
621 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
624 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
628 EXPECT_EQ(tester.key_calls.size(), 1);
630 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
631 tester.clear_key_calls();
632 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
636 KeyboardTester tester{GetContext()};
637 tester.Responding(
true);
642 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
643 WmKeyDownInfo{VK_LEFT, kScanCodeArrowLeft, kExtended, kWasUp}.Build(
646 EXPECT_EQ(tester.key_calls.size(), 1);
648 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
650 tester.clear_key_calls();
651 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
654 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
655 WmKeyUpInfo{VK_LEFT, kScanCodeArrowLeft, kExtended}.Build(
658 EXPECT_EQ(tester.key_calls.size(), 1);
660 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
662 tester.clear_key_calls();
663 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
666 TEST_F(KeyboardTest, ArrowLeftUnhandled) {
667 KeyboardTester tester{GetContext()};
668 tester.Responding(
false);
673 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
674 WmKeyDownInfo{VK_LEFT, kScanCodeArrowLeft, kExtended, kWasUp}.Build(
677 EXPECT_EQ(tester.key_calls.size(), 1);
679 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
681 tester.clear_key_calls();
682 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
685 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
686 WmKeyUpInfo{VK_LEFT, kScanCodeArrowLeft, kExtended}.Build(
689 EXPECT_EQ(tester.key_calls.size(), 1);
691 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
693 tester.clear_key_calls();
694 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
697 TEST_F(KeyboardTest, ShiftLeftUnhandled) {
698 KeyboardTester tester{GetContext()};
699 tester.Responding(
false);
704 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
705 KeyStateChange{VK_LSHIFT,
true,
false},
709 EXPECT_EQ(tester.key_calls.size(), 1);
711 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
713 tester.clear_key_calls();
714 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
717 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
721 EXPECT_EQ(tester.key_calls.size(), 1);
723 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
725 tester.clear_key_calls();
726 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
729 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
730 KeyStateChange{VK_LSHIFT,
false,
true},
734 EXPECT_EQ(tester.key_calls.size(), 1);
736 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
738 tester.clear_key_calls();
739 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
742 TEST_F(KeyboardTest, ShiftRightUnhandled) {
743 KeyboardTester tester{GetContext()};
744 tester.Responding(
false);
749 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
750 KeyStateChange{VK_RSHIFT,
true,
false},
754 EXPECT_EQ(tester.key_calls.size(), 1);
756 kPhysicalShiftRight, kLogicalShiftRight,
"",
758 tester.clear_key_calls();
759 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
762 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
763 KeyStateChange{VK_RSHIFT,
false,
true},
767 EXPECT_EQ(tester.key_calls.size(), 1);
769 kPhysicalShiftRight, kLogicalShiftRight,
"",
771 tester.clear_key_calls();
772 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
775 TEST_F(KeyboardTest, CtrlLeftUnhandled) {
776 KeyboardTester tester{GetContext()};
777 tester.Responding(
false);
782 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
783 KeyStateChange{VK_LCONTROL,
true,
false},
784 WmKeyDownInfo{VK_CONTROL, kScanCodeControl, kNotExtended, kWasUp}.Build(
787 EXPECT_EQ(tester.key_calls.size(), 1);
789 kPhysicalControlLeft, kLogicalControlLeft,
"",
791 tester.clear_key_calls();
792 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
795 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
796 KeyStateChange{VK_LCONTROL,
false,
true},
797 WmKeyUpInfo{VK_SHIFT, kScanCodeControl, kNotExtended}.Build(
800 EXPECT_EQ(tester.key_calls.size(), 1);
802 kPhysicalControlLeft, kLogicalControlLeft,
"",
804 tester.clear_key_calls();
805 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
808 TEST_F(KeyboardTest, CtrlRightUnhandled) {
809 KeyboardTester tester{GetContext()};
810 tester.Responding(
false);
815 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
816 KeyStateChange{VK_RCONTROL,
true,
false},
817 WmKeyDownInfo{VK_CONTROL, kScanCodeControl, kExtended, kWasUp}.Build(
820 EXPECT_EQ(tester.key_calls.size(), 1);
822 kPhysicalControlRight, kLogicalControlRight,
"",
824 tester.clear_key_calls();
825 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
828 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
829 KeyStateChange{VK_RCONTROL,
false,
true},
830 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kExtended}.Build(
833 EXPECT_EQ(tester.key_calls.size(), 1);
835 kPhysicalControlRight, kLogicalControlRight,
"",
837 tester.clear_key_calls();
838 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
842 KeyboardTester tester{GetContext()};
843 tester.Responding(
false);
848 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
849 KeyStateChange{VK_LMENU,
true,
false},
850 WmSysKeyDownInfo{VK_MENU, kScanCodeAlt, kNotExtended, kWasUp}.Build(
853 EXPECT_EQ(tester.key_calls.size(), 1);
855 kPhysicalAltLeft, kLogicalAltLeft,
"", kNotSynthesized);
856 tester.clear_key_calls();
858 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
861 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
862 KeyStateChange{VK_LMENU,
false,
true},
863 WmSysKeyUpInfo{VK_MENU, kScanCodeAlt, kNotExtended}.Build(
866 EXPECT_EQ(tester.key_calls.size(), 1);
868 kPhysicalAltLeft, kLogicalAltLeft,
"", kNotSynthesized);
869 tester.clear_key_calls();
871 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
874 TEST_F(KeyboardTest, AltRightUnhandled) {
875 KeyboardTester tester{GetContext()};
876 tester.Responding(
false);
881 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
882 KeyStateChange{VK_RMENU,
true,
false},
883 WmSysKeyDownInfo{VK_MENU, kScanCodeAlt, kExtended, kWasUp}.Build(
886 EXPECT_EQ(tester.key_calls.size(), 1);
888 kPhysicalAltRight, kLogicalAltRight,
"",
890 tester.clear_key_calls();
892 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
895 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
896 KeyStateChange{VK_RMENU,
false,
true},
897 WmSysKeyUpInfo{VK_MENU, kScanCodeAlt, kExtended}.Build(
900 EXPECT_EQ(tester.key_calls.size(), 1);
902 kPhysicalAltRight, kLogicalAltRight,
"",
904 tester.clear_key_calls();
906 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
909 TEST_F(KeyboardTest, MetaLeftUnhandled) {
910 KeyboardTester tester{GetContext()};
911 tester.Responding(
false);
916 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
917 KeyStateChange{VK_LWIN,
true,
false},
918 WmKeyDownInfo{VK_LWIN, kScanCodeMetaLeft, kExtended, kWasUp}.Build(
921 EXPECT_EQ(tester.key_calls.size(), 1);
923 kPhysicalMetaLeft, kLogicalMetaLeft,
"",
925 tester.clear_key_calls();
926 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
929 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
930 KeyStateChange{VK_LWIN,
false,
true},
931 WmKeyUpInfo{VK_LWIN, kScanCodeMetaLeft, kExtended}.Build(kWmResultZero)});
933 EXPECT_EQ(tester.key_calls.size(), 1);
935 kPhysicalMetaLeft, kLogicalMetaLeft,
"",
937 tester.clear_key_calls();
938 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
941 TEST_F(KeyboardTest, MetaRightUnhandled) {
942 KeyboardTester tester{GetContext()};
943 tester.Responding(
false);
948 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
949 KeyStateChange{VK_RWIN,
true,
false},
950 WmKeyDownInfo{VK_RWIN, kScanCodeMetaRight, kExtended, kWasUp}.Build(
953 EXPECT_EQ(tester.key_calls.size(), 1);
955 kPhysicalMetaRight, kLogicalMetaRight,
"",
957 tester.clear_key_calls();
958 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
961 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
962 KeyStateChange{VK_RWIN,
false,
true},
963 WmKeyUpInfo{VK_RWIN, kScanCodeMetaRight, kExtended}.Build(
966 EXPECT_EQ(tester.key_calls.size(), 1);
968 kPhysicalMetaRight, kLogicalMetaRight,
"",
970 tester.clear_key_calls();
971 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
976 KeyboardTester tester{GetContext()};
977 tester.Responding(
true);
980 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
987 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
990 WmCharInfo{
'a',
kScanCodeKeyA, kNotExtended, kWasDown}.Build(
993 EXPECT_EQ(tester.key_calls.size(), 2);
995 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
997 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
998 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
1004 TEST_F(KeyboardTest, RestartClearsKeyboardState) {
1005 KeyboardTester tester{GetContext()};
1006 tester.Responding(
true);
1009 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1016 tester.ResetKeyboard();
1020 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1023 WmCharInfo{
'a',
kScanCodeKeyA, kNotExtended, kWasDown}.Build(
1026 EXPECT_EQ(tester.key_calls.size(), 2);
1028 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
1030 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
1031 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
1036 TEST_F(KeyboardTest, FreshKeyDownAfterMissedUpIsDelivered) {
1037 KeyboardTester tester{GetContext()};
1038 tester.Responding(
true);
1040 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1041 WmKeyDownInfo{VK_RETURN, kScanCodeEnter, kNotExtended, kWasUp}.Build(
1044 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1045 WmKeyDownInfo{VK_RETURN, kScanCodeEnter, kNotExtended, kWasUp}.Build(
1048 ASSERT_EQ(tester.key_calls.size(), 3u);
1050 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
1052 kPhysicalEnter, kLogicalEnter,
"", kSynthesized);
1054 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
1055 tester.clear_key_calls();
1057 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1058 WmKeyUpInfo{VK_RETURN, kScanCodeEnter, kNotExtended}.Build(
1061 ASSERT_EQ(tester.key_calls.size(), 1u);
1063 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
1064 tester.clear_key_calls();
1065 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0u);
1071 KeyboardTester tester{GetContext()};
1072 tester.Responding(
false);
1077 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1078 KeyStateChange{VK_LSHIFT,
true,
true},
1082 EXPECT_EQ(tester.key_calls.size(), 1);
1084 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
1086 tester.clear_key_calls();
1087 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1090 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1096 EXPECT_EQ(tester.key_calls.size(), 2);
1098 kPhysicalKeyA, kLogicalKeyA,
"A", kNotSynthesized);
1100 tester.clear_key_calls();
1101 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1104 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1105 KeyStateChange{VK_LSHIFT,
false,
true},
1109 EXPECT_EQ(tester.key_calls.size(), 1);
1111 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
1113 tester.clear_key_calls();
1114 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1117 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1121 EXPECT_EQ(tester.key_calls.size(), 1);
1123 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
1124 tester.clear_key_calls();
1125 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1131 KeyboardTester tester{GetContext()};
1132 tester.Responding(
false);
1137 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1138 KeyStateChange{VK_LCONTROL,
true,
true},
1139 WmKeyDownInfo{VK_CONTROL, kScanCodeControl, kNotExtended, kWasUp}.Build(
1142 EXPECT_EQ(tester.key_calls.size(), 1);
1144 kPhysicalControlLeft, kLogicalControlLeft,
"",
1146 tester.clear_key_calls();
1147 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1150 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1153 WmCharInfo{0x01,
kScanCodeKeyA, kNotExtended, kWasUp}.Build(
1156 EXPECT_EQ(tester.key_calls.size(), 1);
1158 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
1159 tester.clear_key_calls();
1160 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1163 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1167 EXPECT_EQ(tester.key_calls.size(), 1);
1169 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
1170 tester.clear_key_calls();
1171 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1174 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1175 KeyStateChange{VK_LCONTROL,
false,
true},
1176 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kNotExtended}.Build(
1179 EXPECT_EQ(tester.key_calls.size(), 1);
1181 kPhysicalControlLeft, kLogicalControlLeft,
"",
1183 tester.clear_key_calls();
1184 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1189 KeyboardTester tester{GetContext()};
1190 tester.Responding(
false);
1195 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1196 KeyStateChange{VK_LCONTROL,
true,
true},
1197 WmKeyDownInfo{VK_CONTROL, kScanCodeControl, kNotExtended, kWasUp}.Build(
1200 EXPECT_EQ(tester.key_calls.size(), 1);
1202 kPhysicalControlLeft, kLogicalControlLeft,
"",
1204 tester.clear_key_calls();
1205 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1208 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1209 WmKeyDownInfo{kVirtualDigit1, kScanCodeDigit1, kNotExtended, kWasUp}
1210 .Build(kWmResultZero)});
1212 EXPECT_EQ(tester.key_calls.size(), 1);
1214 kPhysicalDigit1, kLogicalDigit1,
"", kNotSynthesized);
1215 tester.clear_key_calls();
1216 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1219 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1220 WmKeyUpInfo{kVirtualDigit1, kScanCodeDigit1, kNotExtended}.Build(
1223 EXPECT_EQ(tester.key_calls.size(), 1);
1225 kPhysicalDigit1, kLogicalDigit1,
"", kNotSynthesized);
1226 tester.clear_key_calls();
1227 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1230 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1231 KeyStateChange{VK_LCONTROL,
false,
true},
1232 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kNotExtended}.Build(
1235 EXPECT_EQ(tester.key_calls.size(), 1);
1237 kPhysicalControlLeft, kLogicalControlLeft,
"",
1239 tester.clear_key_calls();
1240 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1246 KeyboardTester tester{GetContext()};
1247 tester.Responding(
false);
1249 tester.SetLayout(LayoutFrench);
1252 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1253 WmKeyDownInfo{kVirtualDigit1, kScanCodeDigit1, kNotExtended, kWasUp}
1254 .Build(kWmResultZero),
1255 WmCharInfo{
'&', kScanCodeDigit1, kNotExtended, kWasUp}.Build(
1258 EXPECT_EQ(tester.key_calls.size(), 2);
1260 kPhysicalDigit1, kLogicalDigit1,
"&", kNotSynthesized);
1262 tester.clear_key_calls();
1263 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1266 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1267 WmKeyUpInfo{kVirtualDigit1, kScanCodeDigit1, kNotExtended}.Build(
1270 EXPECT_EQ(tester.key_calls.size(), 1);
1272 kPhysicalDigit1, kLogicalDigit1,
"", kNotSynthesized);
1273 tester.clear_key_calls();
1274 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1279 KeyboardTester tester{GetContext()};
1280 tester.Responding(
false);
1285 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1286 KeyStateChange{VK_LCONTROL,
true,
true},
1287 WmKeyDownInfo{VK_LCONTROL, kScanCodeControl, kNotExtended, kWasUp}.Build(
1289 KeyStateChange{VK_RMENU,
true,
true},
1290 WmKeyDownInfo{VK_MENU, kScanCodeAlt, kExtended, kWasUp}.Build(
1293 EXPECT_EQ(tester.key_calls.size(), 2);
1295 kPhysicalControlLeft, kLogicalControlLeft,
"",
1298 kPhysicalAltRight, kLogicalAltRight,
"",
1300 tester.clear_key_calls();
1301 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1304 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1305 WmKeyDownInfo{kVirtualKeyQ, kScanCodeKeyQ, kNotExtended, kWasUp}.Build(
1307 WmCharInfo{
'@', kScanCodeKeyQ, kNotExtended, kWasUp}.Build(
1310 EXPECT_EQ(tester.key_calls.size(), 2);
1312 kPhysicalKeyQ, kLogicalKeyQ,
"@", kNotSynthesized);
1314 tester.clear_key_calls();
1315 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1318 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1319 WmKeyUpInfo{kVirtualKeyQ, kScanCodeKeyQ, kNotExtended}.Build(
1322 EXPECT_EQ(tester.key_calls.size(), 1);
1324 kPhysicalKeyQ, kLogicalKeyQ,
"", kNotSynthesized);
1325 tester.clear_key_calls();
1326 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1331 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1332 KeyStateChange{VK_LCONTROL,
false,
true},
1333 ExpectForgedMessage{
1334 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kNotExtended}.Build(
1336 KeyStateChange{VK_RMENU,
false,
true},
1337 WmSysKeyUpInfo{VK_MENU, kScanCodeAlt, kExtended}.Build(
1338 kWmResultDefault)});
1340 EXPECT_EQ(tester.key_calls.size(), 2);
1342 kPhysicalControlLeft, kLogicalControlLeft,
"",
1345 kPhysicalAltRight, kLogicalAltRight,
"",
1347 tester.clear_key_calls();
1349 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1366 KeyboardTester tester{GetContext()};
1367 tester.Responding(
false);
1373 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1374 KeyStateChange{VK_LCONTROL,
true,
true},
1375 WmKeyDownInfo{VK_CONTROL, kScanCodeControl, kNotExtended, kWasUp}.Build(
1377 KeyStateChange{VK_RMENU,
true,
true},
1378 WmKeyDownInfo{VK_MENU, kScanCodeAlt, kExtended, kWasUp}.Build(
1381 EXPECT_EQ(tester.key_calls.size(), 2);
1383 kPhysicalControlLeft, kLogicalControlLeft,
"",
1386 kPhysicalAltRight, kLogicalAltRight,
"",
1388 tester.clear_key_calls();
1389 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1394 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1395 KeyStateChange{VK_LCONTROL,
false,
true},
1396 ExpectForgedMessage{
1397 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kNotExtended}.Build(
1399 KeyStateChange{VK_RMENU,
false,
true},
1400 WmSysKeyUpInfo{VK_MENU, kScanCodeAlt, kExtended}.Build(
1401 kWmResultDefault)});
1402 EXPECT_EQ(tester.key_calls.size(), 2);
1404 kPhysicalControlLeft, kLogicalControlLeft,
"",
1407 kPhysicalAltRight, kLogicalAltRight,
"",
1409 tester.clear_key_calls();
1411 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1415 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1416 KeyStateChange{VK_LCONTROL,
true,
false},
1417 WmKeyDownInfo{VK_CONTROL, kScanCodeControl, kNotExtended, kWasUp}.Build(
1419 KeyStateChange{VK_RMENU,
true,
true},
1420 WmKeyDownInfo{VK_MENU, kScanCodeAlt, kExtended, kWasUp}.Build(
1423 EXPECT_EQ(tester.key_calls.size(), 2);
1425 kPhysicalControlLeft, kLogicalControlLeft,
"",
1428 kPhysicalAltRight, kLogicalAltRight,
"",
1430 tester.clear_key_calls();
1431 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1436 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1437 KeyStateChange{VK_LCONTROL,
false,
false},
1438 ExpectForgedMessage{
1439 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kNotExtended}.Build(
1441 KeyStateChange{VK_RMENU,
false,
false},
1442 WmSysKeyUpInfo{VK_MENU, kScanCodeAlt, kExtended}.Build(
1443 kWmResultDefault)});
1444 EXPECT_EQ(tester.key_calls.size(), 2);
1446 kPhysicalControlLeft, kLogicalControlLeft,
"",
1449 kPhysicalAltRight, kLogicalAltRight,
"",
1451 tester.clear_key_calls();
1453 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1456 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1457 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kNotExtended}.Build(
1459 EXPECT_EQ(tester.key_calls.size(), 1);
1462 tester.clear_key_calls();
1463 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
1469 KeyboardTester tester{GetContext()};
1470 tester.Responding(
false);
1472 tester.SetLayout(LayoutFrench);
1475 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1476 WmKeyDownInfo{0xDD, kScanCodeBracketLeft, kNotExtended, kWasUp}.Build(
1478 WmDeadCharInfo{
'^', kScanCodeBracketLeft, kNotExtended, kWasUp}.Build(
1481 EXPECT_EQ(tester.key_calls.size(), 1);
1483 kPhysicalBracketLeft, kLogicalBracketRight,
"^",
1485 tester.clear_key_calls();
1486 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1489 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1490 WmKeyUpInfo{0xDD, kScanCodeBracketLeft, kNotExtended}.Build(
1493 EXPECT_EQ(tester.key_calls.size(), 1);
1495 kPhysicalBracketLeft, kLogicalBracketRight,
"",
1497 tester.clear_key_calls();
1498 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1501 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1502 WmKeyDownInfo{kVirtualKeyE, kScanCodeKeyE, kNotExtended, kWasUp}.Build(
1504 WmCharInfo{0xEA, kScanCodeKeyE, kNotExtended, kWasUp}.Build(
1507 EXPECT_EQ(tester.key_calls.size(), 2);
1509 kPhysicalKeyE, kLogicalKeyE,
"ê", kNotSynthesized);
1511 tester.clear_key_calls();
1512 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1515 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1516 WmKeyUpInfo{kVirtualKeyE, kScanCodeKeyE, kNotExtended}.Build(
1519 EXPECT_EQ(tester.key_calls.size(), 1);
1521 kPhysicalKeyE, kLogicalKeyE,
"", kNotSynthesized);
1522 tester.clear_key_calls();
1523 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1531 TEST_F(KeyboardTest, DeadKeyWithoutDeadMaskThatCombines) {
1532 KeyboardTester tester{GetContext()};
1533 tester.Responding(
false);
1536 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1537 KeyStateChange{VK_LSHIFT,
true,
true},
1541 EXPECT_EQ(tester.key_calls.size(), 1);
1543 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
1545 tester.clear_key_calls();
1546 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1549 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1550 WmKeyDownInfo{
'6', kScanCodeDigit6, kNotExtended, kWasUp}.Build(
1552 WmDeadCharInfo{
'^', kScanCodeDigit6, kNotExtended, kWasUp}.Build(
1555 EXPECT_EQ(tester.key_calls.size(), 1);
1557 kPhysicalDigit6, kLogicalDigit6,
"6", kNotSynthesized);
1558 tester.clear_key_calls();
1559 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1562 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1563 WmKeyUpInfo{
'6', kScanCodeDigit6, kNotExtended}.Build(kWmResultZero)});
1565 EXPECT_EQ(tester.key_calls.size(), 1);
1567 kPhysicalDigit6, kLogicalDigit6,
"", kNotSynthesized);
1568 tester.clear_key_calls();
1569 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1572 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1573 KeyStateChange{VK_LSHIFT,
false,
true},
1577 EXPECT_EQ(tester.key_calls.size(), 1);
1579 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
1581 tester.clear_key_calls();
1582 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1585 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1586 WmKeyDownInfo{kVirtualKeyE, kScanCodeKeyE, kNotExtended, kWasUp}.Build(
1588 WmCharInfo{0xEA, kScanCodeKeyE, kNotExtended, kWasUp}.Build(
1591 EXPECT_EQ(tester.key_calls.size(), 2);
1593 kPhysicalKeyE, kLogicalKeyE,
"ê", kNotSynthesized);
1595 tester.clear_key_calls();
1596 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1599 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1600 WmKeyUpInfo{kVirtualKeyE, kScanCodeKeyE, kNotExtended}.Build(
1603 EXPECT_EQ(tester.key_calls.size(), 1);
1605 kPhysicalKeyE, kLogicalKeyE,
"", kNotSynthesized);
1606 tester.clear_key_calls();
1607 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1612 TEST_F(KeyboardTest, DeadKeyThatDoesNotCombine) {
1613 KeyboardTester tester{GetContext()};
1614 tester.Responding(
false);
1616 tester.SetLayout(LayoutFrench);
1619 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1620 WmKeyDownInfo{0xDD, kScanCodeBracketLeft, kNotExtended, kWasUp}.Build(
1622 WmDeadCharInfo{
'^', kScanCodeBracketLeft, kNotExtended, kWasUp}.Build(
1625 EXPECT_EQ(tester.key_calls.size(), 1);
1627 kPhysicalBracketLeft, kLogicalBracketRight,
"^",
1629 tester.clear_key_calls();
1630 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1633 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1634 WmKeyUpInfo{0xDD, kScanCodeBracketLeft, kNotExtended}.Build(
1637 EXPECT_EQ(tester.key_calls.size(), 1);
1639 kPhysicalBracketLeft, kLogicalBracketRight,
"",
1641 tester.clear_key_calls();
1642 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1645 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1646 WmKeyDownInfo{kVirtualDigit1, kScanCodeDigit1, kNotExtended, kWasUp}
1647 .Build(kWmResultZero),
1648 WmCharInfo{
'^', kScanCodeDigit1, kNotExtended, kWasUp}.Build(
1650 WmCharInfo{
'&', kScanCodeDigit1, kNotExtended, kWasUp}.Build(
1653 EXPECT_EQ(tester.key_calls.size(), 3);
1655 kPhysicalDigit1, kLogicalDigit1,
"^", kNotSynthesized);
1658 tester.clear_key_calls();
1664 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1667 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1668 WmKeyUpInfo{kVirtualDigit1, kScanCodeDigit1, kNotExtended}.Build(
1671 EXPECT_EQ(tester.key_calls.size(), 1);
1673 kPhysicalDigit1, kLogicalDigit1,
"", kNotSynthesized);
1674 tester.clear_key_calls();
1675 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1681 TEST_F(KeyboardTest, DeadKeyTwiceThenLetter) {
1682 KeyboardTester tester{GetContext()};
1683 tester.Responding(
false);
1688 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1689 WmKeyDownInfo{0xC0, kScanCodeBackquote, kNotExtended, kWasUp}.Build(
1691 WmDeadCharInfo{
'`', kScanCodeBackquote, kNotExtended, kWasUp}.Build(
1694 EXPECT_EQ(tester.key_calls.size(), 1);
1696 kPhysicalBackquote, kLogicalBackquote,
"`",
1698 tester.clear_key_calls();
1699 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1702 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1703 WmKeyUpInfo{0xC0, kScanCodeBackquote, kNotExtended}.Build(
1706 EXPECT_EQ(tester.key_calls.size(), 1);
1708 kPhysicalBackquote, kLogicalBackquote,
"",
1710 tester.clear_key_calls();
1711 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1715 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
1716 tester.LateResponding(
1717 [&recorded_callbacks](
1718 const FlutterKeyEvent* event,
1719 MockKeyResponseController::ResponseCallback
callback) {
1720 recorded_callbacks.push_back(
callback);
1723 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1724 WmKeyDownInfo{0xC0, kScanCodeBackquote, kNotExtended, kWasUp}.Build(
1726 WmCharInfo{
'`', kScanCodeBackquote, kNotExtended, kWasUp, kBeingReleased,
1727 kNoContext, 1,
true}
1728 .Build(kWmResultZero),
1729 WmCharInfo{
'`', kScanCodeBackquote, kNotExtended, kWasUp}.Build(
1732 EXPECT_EQ(recorded_callbacks.size(), 1);
1733 EXPECT_EQ(tester.key_calls.size(), 1);
1735 kPhysicalBackquote, kLogicalBackquote,
"`",
1737 tester.clear_key_calls();
1739 recorded_callbacks.front()(
false);
1740 EXPECT_EQ(tester.key_calls.size(), 2);
1743 tester.clear_key_calls();
1747 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1749 tester.Responding(
false);
1752 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1753 WmKeyUpInfo{0xC0, kScanCodeBackquote, kNotExtended}.Build(
1756 EXPECT_EQ(tester.key_calls.size(), 1);
1758 kPhysicalBackquote, kLogicalBackquote,
"",
1760 tester.clear_key_calls();
1761 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1766 KeyboardTester tester{GetContext()};
1767 tester.Responding(
false);
1773 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1774 WmKeyDownInfo{kVirtualKeyW, kScanCodeKeyW, kNotExtended, kWasUp}.Build(
1776 WmCharInfo{0xd800, kScanCodeKeyW, kNotExtended, kWasUp}.Build(
1778 WmCharInfo{0xdf45, kScanCodeKeyW, kNotExtended, kWasUp}.Build(
1781 const char* st = tester.key_calls[0].key_event.character;
1783 EXPECT_EQ(tester.key_calls.size(), 2);
1785 kPhysicalKeyW, kLogicalKeyW,
"𐍅", kNotSynthesized);
1787 tester.clear_key_calls();
1788 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 3);
1791 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1792 WmKeyUpInfo{kVirtualKeyW, kScanCodeKeyW, kNotExtended}.Build(
1795 EXPECT_EQ(tester.key_calls.size(), 1);
1797 kPhysicalKeyW, kLogicalKeyW,
"", kNotSynthesized);
1798 tester.clear_key_calls();
1799 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1803 KeyboardTester tester{GetContext()};
1804 tester.Responding(
false);
1807 Win32Message event1 =
1808 WmKeyDownInfo{VK_BACK, kScanCodeBackspace, kNotExtended, kWasUp}.Build(
1810 Win32Message event2 =
1811 WmKeyUpInfo{VK_BACK, kScanCodeBackspace, kNotExtended}.Build(
1815 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1816 KeyStateChange{VK_LSHIFT,
true,
true}, event1});
1817 EXPECT_EQ(tester.key_calls.size(), 2);
1819 kPhysicalShiftLeft, kLogicalShiftLeft,
"", kSynthesized);
1820 tester.clear_key_calls();
1821 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1823 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1824 KeyStateChange{VK_LSHIFT,
false,
true}, event2});
1825 EXPECT_EQ(tester.key_calls.size(), 2);
1827 kPhysicalShiftLeft, kLogicalShiftLeft,
"", kSynthesized);
1828 tester.clear_key_calls();
1829 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1832 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1833 KeyStateChange{VK_RSHIFT,
true,
true}, event1});
1834 EXPECT_EQ(tester.key_calls.size(), 2);
1836 kPhysicalShiftRight, kLogicalShiftRight,
"",
1838 tester.clear_key_calls();
1839 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1841 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1842 KeyStateChange{VK_RSHIFT,
false,
true}, event2});
1843 EXPECT_EQ(tester.key_calls.size(), 2);
1845 kPhysicalShiftRight, kLogicalShiftRight,
"",
1847 tester.clear_key_calls();
1848 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1851 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1852 KeyStateChange{VK_LCONTROL,
true,
true}, event1});
1853 EXPECT_EQ(tester.key_calls.size(), 2);
1855 kPhysicalControlLeft, kLogicalControlLeft,
"",
1857 tester.clear_key_calls();
1858 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1860 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1861 KeyStateChange{VK_LCONTROL,
false,
true}, event2});
1862 EXPECT_EQ(tester.key_calls.size(), 2);
1864 kPhysicalControlLeft, kLogicalControlLeft,
"",
1866 tester.clear_key_calls();
1867 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1870 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1871 KeyStateChange{VK_RCONTROL,
true,
true}, event1});
1872 EXPECT_EQ(tester.key_calls.size(), 2);
1874 kPhysicalControlRight, kLogicalControlRight,
"",
1876 tester.clear_key_calls();
1877 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1879 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1880 KeyStateChange{VK_RCONTROL,
false,
true}, event2});
1881 EXPECT_EQ(tester.key_calls.size(), 2);
1883 kPhysicalControlRight, kLogicalControlRight,
"",
1885 tester.clear_key_calls();
1886 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1889 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1890 KeyStateChange{VK_LMENU,
true,
true}, event1});
1891 EXPECT_EQ(tester.key_calls.size(), 2);
1893 kPhysicalAltLeft, kLogicalAltLeft,
"", kSynthesized);
1894 tester.clear_key_calls();
1895 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1897 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1898 KeyStateChange{VK_LMENU,
false,
true}, event2});
1899 EXPECT_EQ(tester.key_calls.size(), 2);
1901 kPhysicalAltLeft, kLogicalAltLeft,
"", kSynthesized);
1902 tester.clear_key_calls();
1903 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1906 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1907 KeyStateChange{VK_RMENU,
true,
true}, event1});
1908 EXPECT_EQ(tester.key_calls.size(), 2);
1910 kPhysicalAltRight, kLogicalAltRight,
"", kSynthesized);
1911 tester.clear_key_calls();
1912 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1914 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1915 KeyStateChange{VK_RMENU,
false,
true}, event2});
1916 EXPECT_EQ(tester.key_calls.size(), 2);
1918 kPhysicalAltRight, kLogicalAltRight,
"", kSynthesized);
1919 tester.clear_key_calls();
1920 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1923 tester.InjectKeyboardChanges(
1924 std::vector<KeyboardChange>{KeyStateChange{VK_LWIN,
true,
true}, event1});
1925 EXPECT_EQ(tester.key_calls.size(), 2);
1927 kPhysicalMetaLeft, kLogicalMetaLeft,
"", kSynthesized);
1928 tester.clear_key_calls();
1929 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1931 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1932 KeyStateChange{VK_LWIN,
false,
true}, event2});
1933 EXPECT_EQ(tester.key_calls.size(), 2);
1935 kPhysicalMetaLeft, kLogicalMetaLeft,
"", kSynthesized);
1936 tester.clear_key_calls();
1937 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1940 tester.InjectKeyboardChanges(
1941 std::vector<KeyboardChange>{KeyStateChange{VK_RWIN,
true,
true}, event1});
1942 EXPECT_EQ(tester.key_calls.size(), 2);
1944 kPhysicalMetaRight, kLogicalMetaRight,
"", kSynthesized);
1945 tester.clear_key_calls();
1946 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1948 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1949 KeyStateChange{VK_RWIN,
false,
true}, event2});
1950 EXPECT_EQ(tester.key_calls.size(), 2);
1952 kPhysicalMetaRight, kLogicalMetaRight,
"", kSynthesized);
1953 tester.clear_key_calls();
1954 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1958 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1959 KeyStateChange{VK_CAPITAL,
false,
true}, event1});
1960 EXPECT_EQ(tester.key_calls.size(), 3);
1962 kPhysicalCapsLock, kLogicalCapsLock,
"", kSynthesized);
1964 kPhysicalCapsLock, kLogicalCapsLock,
"", kSynthesized);
1965 tester.clear_key_calls();
1966 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1968 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1969 KeyStateChange{VK_CAPITAL,
false,
false}, event2});
1970 EXPECT_EQ(tester.key_calls.size(), 3);
1972 kPhysicalCapsLock, kLogicalCapsLock,
"", kSynthesized);
1974 kPhysicalCapsLock, kLogicalCapsLock,
"", kSynthesized);
1975 tester.clear_key_calls();
1976 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1979 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1980 KeyStateChange{VK_SCROLL,
true,
true}, event1});
1981 EXPECT_EQ(tester.key_calls.size(), 2);
1983 kPhysicalScrollLock, kLogicalScrollLock,
"",
1985 tester.clear_key_calls();
1986 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1988 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1989 KeyStateChange{VK_SCROLL,
true,
false}, event2});
1990 EXPECT_EQ(tester.key_calls.size(), 3);
1992 kPhysicalScrollLock, kLogicalScrollLock,
"",
1995 kPhysicalScrollLock, kLogicalScrollLock,
"",
1997 tester.clear_key_calls();
1998 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2001 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2002 KeyStateChange{VK_NUMLOCK,
true,
false}, event1});
2007 EXPECT_EQ(tester.key_calls.size(), 2);
2009 kPhysicalNumLock, kLogicalNumLock,
"", kSynthesized);
2010 tester.clear_key_calls();
2011 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2013 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2014 KeyStateChange{VK_NUMLOCK,
false,
true}, event2});
2015 EXPECT_EQ(tester.key_calls.size(), 4);
2017 kPhysicalNumLock, kLogicalNumLock,
"", kSynthesized);
2019 kPhysicalNumLock, kLogicalNumLock,
"", kSynthesized);
2021 kPhysicalNumLock, kLogicalNumLock,
"", kSynthesized);
2022 tester.clear_key_calls();
2023 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2030 TEST_F(KeyboardTest, ImeExtendedEventsAreIgnored) {
2031 KeyboardTester tester{GetContext()};
2032 tester.Responding(
false);
2040 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2041 KeyStateChange{VK_RCONTROL,
true,
false},
2042 WmKeyDownInfo{VK_PROCESSKEY, kScanCodeControl, kExtended, kWasUp}.Build(
2045 EXPECT_EQ(tester.key_calls.size(), 1);
2048 tester.clear_key_calls();
2049 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2058 TEST_F(KeyboardTest, UpOnlyImeEventsAreCorrectlyHandled) {
2059 KeyboardTester tester{GetContext()};
2060 tester.Responding(
true);
2065 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2066 KeyStateChange{VK_LSHIFT,
true,
false},
2069 WmKeyDownInfo{VK_PROCESSKEY, kScanCodeDigit2, kNotExtended, kWasUp}.Build(
2071 KeyStateChange{VK_LSHIFT,
false,
true},
2074 WmKeyUpInfo{
'2', kScanCodeDigit2, kNotExtended, kWasUp}.Build(
2077 EXPECT_EQ(tester.key_calls.size(), 4);
2079 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
2084 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
2088 tester.clear_key_calls();
2097 TEST_F(KeyboardTest, SlowFrameworkResponse) {
2098 KeyboardTester tester{GetContext()};
2100 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
2103 tester.LateResponding(
2104 [&recorded_callbacks](
2105 const FlutterKeyEvent* event,
2106 MockKeyResponseController::ResponseCallback
callback) {
2107 recorded_callbacks.push_back(
callback);
2111 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2118 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2121 WmCharInfo{
'a',
kScanCodeKeyA, kNotExtended, kWasDown}.Build(
2124 EXPECT_EQ(tester.key_calls.size(), 1);
2126 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2127 EXPECT_EQ(recorded_callbacks.size(), 1);
2128 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2131 recorded_callbacks.front()(
false);
2133 EXPECT_EQ(tester.key_calls.size(), 3);
2134 EXPECT_EQ(recorded_callbacks.size(), 2);
2137 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2138 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2141 recorded_callbacks.back()(
false);
2143 EXPECT_EQ(tester.key_calls.size(), 4);
2145 tester.clear_key_calls();
2146 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2160 TEST_F(KeyboardTest, SlowFrameworkResponseForIdenticalEvents) {
2161 KeyboardTester tester{GetContext()};
2162 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
2165 tester.LateResponding(
2166 [&recorded_callbacks](
2167 const FlutterKeyEvent* event,
2168 MockKeyResponseController::ResponseCallback
callback) {
2169 recorded_callbacks.push_back(
callback);
2173 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2179 EXPECT_EQ(tester.key_calls.size(), 1);
2181 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2182 tester.clear_key_calls();
2183 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2186 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2190 EXPECT_EQ(tester.key_calls.size(), 0);
2191 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2194 EXPECT_EQ(recorded_callbacks.size(), 1);
2195 recorded_callbacks.front()(
false);
2197 EXPECT_EQ(tester.key_calls.size(), 2);
2200 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
2201 tester.clear_key_calls();
2202 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2205 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2213 EXPECT_EQ(recorded_callbacks.size(), 2);
2214 EXPECT_EQ(tester.key_calls.size(), 0);
2215 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2219 recorded_callbacks.back()(
false);
2220 EXPECT_EQ(tester.key_calls.size(), 1);
2222 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2223 tester.clear_key_calls();
2224 EXPECT_EQ(recorded_callbacks.size(), 3);
2225 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2228 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2232 EXPECT_EQ(tester.key_calls.size(), 0);
2233 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2237 KeyboardTester tester{GetContext()};
2238 tester.Responding(
false);
2242 tester.InjectPlatformMessage(
2243 "flutter/textinput",
"TextInput.setClient",
2244 R
"|([108, {"inputAction": "TextInputAction.none", "viewId": 0}])|");
2247 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2248 WmKeyDownInfo{VK_RETURN, kScanCodeEnter, kNotExtended, kWasUp}.Build(
2250 WmCharInfo{
'\n', kScanCodeEnter, kNotExtended, kWasUp}.Build(
2253 EXPECT_EQ(tester.key_calls.size(), 2);
2255 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
2257 tester.key_calls[1],
2259 R
"|("method":"TextInputClient.performAction",)|"
2260 R"|("args":[108,"TextInputAction.none"])|"
2262 tester.clear_key_calls();
2263 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2266 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2267 WmKeyUpInfo{VK_RETURN, kScanCodeEnter, kNotExtended}.Build(
2270 EXPECT_EQ(tester.key_calls.size(), 1);
2272 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
2273 tester.clear_key_calls();
2274 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2281 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2287 EXPECT_EQ(tester.key_calls.size(), 2);
2289 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2291 tester.clear_key_calls();
2294 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2298 EXPECT_EQ(tester.key_calls.size(), 1);
2300 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
2301 tester.clear_key_calls();
2304 TEST_F(KeyboardTest, VietnameseTelexAddDiacriticWithFastResponse) {
2314 KeyboardTester tester{GetContext()};
2315 tester.Responding(
false);
2320 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2326 EXPECT_EQ(tester.key_calls.size(), 2);
2328 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2330 tester.clear_key_calls();
2331 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2334 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2338 EXPECT_EQ(tester.key_calls.size(), 1);
2340 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
2341 tester.clear_key_calls();
2342 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2347 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2348 WmKeyDownInfo{VK_BACK, kScanCodeBackspace, kNotExtended, kWasUp}.Build(
2350 WmCharInfo{0x8, kScanCodeBackspace, kNotExtended, kWasUp}.Build(
2352 WmKeyUpInfo{VK_BACK, kScanCodeBackspace, kNotExtended}.Build(
2354 WmKeyDownInfo{VK_PACKET, 0, kNotExtended, kWasUp}.Build(kWmResultDefault),
2355 WmCharInfo{0xe0 , 0, kNotExtended, kWasUp}.Build(kWmResultZero),
2356 WmKeyUpInfo{VK_PACKET, 0, kNotExtended}.Build(kWmResultDefault)});
2358 EXPECT_EQ(tester.key_calls.size(), 3);
2360 kPhysicalBackspace, kLogicalBackspace,
"",
2363 kPhysicalBackspace, kLogicalBackspace,
"",
2366 tester.clear_key_calls();
2372 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 3);
2375 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2376 WmKeyUpInfo{kVirtualKeyF, kScanCodeKeyF, kNotExtended,
2378 .Build(kWmResultZero)});
2380 EXPECT_EQ(tester.key_calls.size(), 1);
2383 tester.clear_key_calls();
2384 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2388 bool backspace_response) {
2398 KeyboardTester tester{context};
2399 tester.Responding(
false);
2404 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2410 EXPECT_EQ(tester.key_calls.size(), 2);
2412 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2414 tester.clear_key_calls();
2415 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2418 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2422 EXPECT_EQ(tester.key_calls.size(), 1);
2424 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
2425 tester.clear_key_calls();
2426 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2428 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
2429 tester.LateResponding(
2430 [&recorded_callbacks](
2431 const FlutterKeyEvent* event,
2432 MockKeyResponseController::ResponseCallback
callback) {
2433 recorded_callbacks.push_back(
callback);
2439 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2440 WmKeyDownInfo{VK_BACK, kScanCodeBackspace, kNotExtended, kWasUp}.Build(
2442 WmCharInfo{0x8, kScanCodeBackspace, kNotExtended, kWasUp}.Build(
2444 WmKeyUpInfo{VK_BACK, kScanCodeBackspace, kNotExtended}.Build(
2446 WmKeyDownInfo{VK_PACKET, 0, kNotExtended, kWasUp}.Build(kWmResultDefault),
2447 WmCharInfo{0xe0 , 0, kNotExtended, kWasUp}.Build(kWmResultZero),
2448 WmKeyUpInfo{VK_PACKET, 0, kNotExtended}.Build(kWmResultDefault)});
2455 EXPECT_EQ(tester.key_calls.size(), 1);
2457 kPhysicalBackspace, kLogicalBackspace,
"",
2459 tester.clear_key_calls();
2460 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2462 EXPECT_EQ(recorded_callbacks.size(), 1);
2463 recorded_callbacks[0](backspace_response);
2465 EXPECT_EQ(tester.key_calls.size(), 1);
2467 kPhysicalBackspace, kLogicalBackspace,
"",
2469 tester.clear_key_calls();
2470 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(),
2471 backspace_response ? 0 : 2);
2473 recorded_callbacks[1](
false);
2474 EXPECT_EQ(tester.key_calls.size(), 1);
2476 tester.clear_key_calls();
2477 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2479 tester.Responding(
false);
2482 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2483 WmKeyUpInfo{kVirtualKeyF, kScanCodeKeyF, kNotExtended,
2485 .Build(kWmResultZero)});
2487 EXPECT_EQ(tester.key_calls.size(), 1);
2490 tester.clear_key_calls();
2491 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2494 TEST_F(KeyboardTest, VietnameseTelexAddDiacriticWithSlowFalseResponse) {
2498 TEST_F(KeyboardTest, VietnameseTelexAddDiacriticWithSlowTrueResponse) {
2505 KeyboardTester tester{GetContext()};
2506 tester.Responding(
false);
2508 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2509 WmKeyDownInfo{VK_CAPITAL, 0, kNotExtended}.Build(),
2510 WmKeyUpInfo{VK_CAPITAL, 0, kNotExtended}.Build()});
2512 tester.clear_key_calls();
static const JsonMessageCodec & GetInstance()
virtual void RedispatchEvent(std::unique_ptr< PendingEvent > event)
std::unique_ptr< std::vector< uint8_t > > EncodeMessage(const T &message) const
FlutterDesktopBinaryReply callback
CallbackHandler callback_handler
std::string text_method_call
FlutterKeyEvent key_event
#define EXPECT_CALL_IS_TEXT(_key_call, u16_string)
#define EXPECT_CALL_IS_TEXT_METHOD_CALL(_key_call, json_string)
union flutter::testing::@100::KeyboardChange::@0 content
std::list< KeyStateChange > state_changes_afterwards
std::vector< KeyCall > key_calls
KeyStateChange key_state_change
Win32Message expected_forged_message
#define EXPECT_CALL_IS_EVENT(_key_call, _type, _physical, _logical, _character, _synthesized)
enum flutter::testing::@100::KeyboardChange::Type type
TEST_F(AccessibilityPluginTest, DirectAnnounceCall)
constexpr uint64_t kScanCodeKeyA
constexpr uint64_t kVirtualKeyA
void VietnameseTelexAddDiacriticWithSlowResponse(WindowsTestContext &context, bool backspace_response)
constexpr int kScanCodeShiftRight
constexpr int kScanCodeShiftLeft
constexpr FlutterViewId kImplicitViewId