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),
345 void OnText(
const std::u16string&
text)
override {
346 on_key_call_(KeyCall{
347 .type = KeyCall::kKeyCallOnText,
353 std::function<void(KeyCall)> on_key_call_;
355 FML_DISALLOW_COPY_AND_ASSIGN(TestFlutterWindowsView);
358 class KeyboardTester {
360 using ResponseHandler =
361 std::function<void(MockKeyResponseController::ResponseCallback)>;
363 explicit KeyboardTester(WindowsTestContext& context)
364 : callback_handler_(RespondValue(false)),
365 map_virtual_key_layout_(LayoutDefault) {
366 engine_ = GetTestEngine(context);
367 view_ = std::make_unique<TestFlutterWindowsView>(
371 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>(),
372 [
this](KeyCall key_call) { key_calls.push_back(key_call); });
374 EngineModifier modifier{engine_.get()};
375 modifier.SetImplicitView(view_.get());
376 modifier.InitializeKeyboard();
378 window_ = std::make_unique<MockKeyboardManagerDelegate>(
379 view_.get(), [
this](UINT virtual_key) -> SHORT {
380 return map_virtual_key_layout_(virtual_key, MAPVK_VK_TO_CHAR);
384 TestFlutterWindowsView& GetView() {
return *view_; }
385 MockKeyboardManagerDelegate& GetWindow() {
return *window_; }
388 void ResetKeyboard() { EngineModifier{engine_.get()}.Restart(); }
391 void Responding(
bool response) { callback_handler_ = RespondValue(response); }
400 MockKeyResponseController::EmbedderCallbackHandler handler) {
401 callback_handler_ = std::move(handler);
404 void SetLayout(MapVirtualKeyLayout layout) {
405 map_virtual_key_layout_ = layout ==
nullptr ? LayoutDefault : layout;
408 void InjectKeyboardChanges(std::vector<KeyboardChange> changes) {
409 FML_DCHECK(window_ !=
nullptr);
410 window_->InjectKeyboardChanges(std::move(changes));
414 void InjectPlatformMessage(
const char* channel,
417 rapidjson::Document args_doc;
418 args_doc.Parse(args);
419 FML_DCHECK(!args_doc.HasParseError());
421 rapidjson::Document message_doc(rapidjson::kObjectType);
422 auto& allocator = message_doc.GetAllocator();
423 message_doc.AddMember(
"method", rapidjson::Value(method, allocator),
425 message_doc.AddMember(
"args", args_doc, allocator);
427 rapidjson::StringBuffer buffer;
428 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
429 message_doc.Accept(writer);
431 std::unique_ptr<std::vector<uint8_t>> data =
433 FlutterPlatformMessageResponseHandle response_handle;
434 const FlutterPlatformMessage
message = {
435 sizeof(FlutterPlatformMessage),
441 view_->GetEngine()->HandlePlatformMessage(&
message);
446 size_t RedispatchedMessageCountAndClear() {
447 auto& messages = window_->RedispatchedMessages();
448 size_t count = messages.size();
453 void clear_key_calls() {
455 if (key_call.type == KeyCall::kKeyCallOnKey &&
456 key_call.key_event.character !=
nullptr) {
457 delete[] key_call.key_event.character;
466 std::unique_ptr<FlutterWindowsEngine> engine_;
467 std::unique_ptr<TestFlutterWindowsView> view_;
468 std::unique_ptr<MockKeyboardManagerDelegate> window_;
469 MockKeyResponseController::EmbedderCallbackHandler callback_handler_;
470 MapVirtualKeyLayout map_virtual_key_layout_;
475 std::unique_ptr<FlutterWindowsEngine> GetTestEngine(
476 WindowsTestContext& context) {
477 FlutterWindowsEngineBuilder builder{context};
479 builder.SetCreateKeyboardHandlerCallbacks(
480 [
this](
int virtual_key) -> SHORT {
483 return window_ ? window_->GetKeyState(virtual_key) : 0;
485 [
this](UINT virtual_key,
bool extended) -> SHORT {
486 return map_virtual_key_layout_(
487 virtual_key,
extended ? MAPVK_VK_TO_VSC_EX : MAPVK_VK_TO_VSC);
490 auto engine = builder.Build();
492 EngineModifier modifier(engine.get());
494 auto key_response_controller =
495 std::make_shared<MockKeyResponseController>();
496 key_response_controller->SetEmbedderResponse(
498 const FlutterKeyEvent* event,
499 MockKeyResponseController::ResponseCallback
callback) {
500 FlutterKeyEvent clone_event = *event;
501 clone_event.character =
event->character ==
nullptr
503 : clone_string(event->character);
505 .type = KeyCall::kKeyCallOnKey,
506 .key_event = clone_event,
510 key_response_controller->SetTextInputResponse(
512 key_calls](std::unique_ptr<rapidjson::Document> document) {
513 rapidjson::StringBuffer buffer;
514 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
515 document->Accept(writer);
517 .type = KeyCall::kKeyCallTextMethodCall,
518 .text_method_call = buffer.GetString(),
521 MockEmbedderApiForKeyboard(modifier, key_response_controller);
528 static MockKeyResponseController::EmbedderCallbackHandler RespondValue(
530 return [value](
const FlutterKeyEvent* event,
531 MockKeyResponseController::ResponseCallback
callback) {
537 FML_DISALLOW_COPY_AND_ASSIGN(KeyboardTester);
540 class KeyboardTest :
public WindowsTest {
542 KeyboardTest() =
default;
543 virtual ~KeyboardTest() =
default;
546 FML_DISALLOW_COPY_AND_ASSIGN(KeyboardTest);
554 #define EXPECT_CALL_IS_EVENT(_key_call, _type, _physical, _logical, \
555 _character, _synthesized) \
556 EXPECT_EQ(_key_call.type, KeyCall::kKeyCallOnKey); \
557 EXPECT_EVENT_EQUALS(_key_call.key_event, _type, _physical, _logical, \
558 _character, _synthesized);
560 #define EXPECT_CALL_IS_TEXT(_key_call, u16_string) \
561 EXPECT_EQ(_key_call.type, KeyCall::kKeyCallOnText); \
562 EXPECT_EQ(_key_call.text, u16_string);
564 #define EXPECT_CALL_IS_TEXT_METHOD_CALL(_key_call, json_string) \
565 EXPECT_EQ(_key_call.type, KeyCall::kKeyCallTextMethodCall); \
566 EXPECT_STREQ(_key_call.text_method_call.c_str(), json_string);
568 TEST_F(KeyboardTest, LowerCaseAHandled) {
569 KeyboardTester tester{GetContext()};
570 tester.Responding(
true);
575 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
581 EXPECT_EQ(tester.key_calls.size(), 1);
583 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
584 tester.clear_key_calls();
585 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
588 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
592 EXPECT_EQ(tester.key_calls.size(), 1);
594 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
595 tester.clear_key_calls();
596 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
599 TEST_F(KeyboardTest, LowerCaseAUnhandled) {
600 KeyboardTester tester{GetContext()};
601 tester.Responding(
false);
606 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
612 EXPECT_EQ(tester.key_calls.size(), 2);
614 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
616 tester.clear_key_calls();
617 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
620 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
624 EXPECT_EQ(tester.key_calls.size(), 1);
626 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
627 tester.clear_key_calls();
628 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
632 KeyboardTester tester{GetContext()};
633 tester.Responding(
true);
638 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
639 WmKeyDownInfo{VK_LEFT, kScanCodeArrowLeft, kExtended, kWasUp}.Build(
642 EXPECT_EQ(tester.key_calls.size(), 1);
644 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
646 tester.clear_key_calls();
647 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
650 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
651 WmKeyUpInfo{VK_LEFT, kScanCodeArrowLeft, kExtended}.Build(
654 EXPECT_EQ(tester.key_calls.size(), 1);
656 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
658 tester.clear_key_calls();
659 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
662 TEST_F(KeyboardTest, ArrowLeftUnhandled) {
663 KeyboardTester tester{GetContext()};
664 tester.Responding(
false);
669 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
670 WmKeyDownInfo{VK_LEFT, kScanCodeArrowLeft, kExtended, kWasUp}.Build(
673 EXPECT_EQ(tester.key_calls.size(), 1);
675 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
677 tester.clear_key_calls();
678 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
681 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
682 WmKeyUpInfo{VK_LEFT, kScanCodeArrowLeft, kExtended}.Build(
685 EXPECT_EQ(tester.key_calls.size(), 1);
687 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
689 tester.clear_key_calls();
690 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
693 TEST_F(KeyboardTest, ShiftLeftUnhandled) {
694 KeyboardTester tester{GetContext()};
695 tester.Responding(
false);
700 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
701 KeyStateChange{VK_LSHIFT,
true,
false},
705 EXPECT_EQ(tester.key_calls.size(), 1);
707 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
709 tester.clear_key_calls();
710 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
713 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
717 EXPECT_EQ(tester.key_calls.size(), 1);
719 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
721 tester.clear_key_calls();
722 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
725 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
726 KeyStateChange{VK_LSHIFT,
false,
true},
730 EXPECT_EQ(tester.key_calls.size(), 1);
732 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
734 tester.clear_key_calls();
735 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
738 TEST_F(KeyboardTest, ShiftRightUnhandled) {
739 KeyboardTester tester{GetContext()};
740 tester.Responding(
false);
745 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
746 KeyStateChange{VK_RSHIFT,
true,
false},
750 EXPECT_EQ(tester.key_calls.size(), 1);
752 kPhysicalShiftRight, kLogicalShiftRight,
"",
754 tester.clear_key_calls();
755 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
758 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
759 KeyStateChange{VK_RSHIFT,
false,
true},
763 EXPECT_EQ(tester.key_calls.size(), 1);
765 kPhysicalShiftRight, kLogicalShiftRight,
"",
767 tester.clear_key_calls();
768 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
771 TEST_F(KeyboardTest, CtrlLeftUnhandled) {
772 KeyboardTester tester{GetContext()};
773 tester.Responding(
false);
778 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
779 KeyStateChange{VK_LCONTROL,
true,
false},
780 WmKeyDownInfo{VK_CONTROL, kScanCodeControl, kNotExtended, kWasUp}.Build(
783 EXPECT_EQ(tester.key_calls.size(), 1);
785 kPhysicalControlLeft, kLogicalControlLeft,
"",
787 tester.clear_key_calls();
788 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
791 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
792 KeyStateChange{VK_LCONTROL,
false,
true},
793 WmKeyUpInfo{VK_SHIFT, kScanCodeControl, kNotExtended}.Build(
796 EXPECT_EQ(tester.key_calls.size(), 1);
798 kPhysicalControlLeft, kLogicalControlLeft,
"",
800 tester.clear_key_calls();
801 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
804 TEST_F(KeyboardTest, CtrlRightUnhandled) {
805 KeyboardTester tester{GetContext()};
806 tester.Responding(
false);
811 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
812 KeyStateChange{VK_RCONTROL,
true,
false},
813 WmKeyDownInfo{VK_CONTROL, kScanCodeControl, kExtended, kWasUp}.Build(
816 EXPECT_EQ(tester.key_calls.size(), 1);
818 kPhysicalControlRight, kLogicalControlRight,
"",
820 tester.clear_key_calls();
821 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
824 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
825 KeyStateChange{VK_RCONTROL,
false,
true},
826 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kExtended}.Build(
829 EXPECT_EQ(tester.key_calls.size(), 1);
831 kPhysicalControlRight, kLogicalControlRight,
"",
833 tester.clear_key_calls();
834 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
838 KeyboardTester tester{GetContext()};
839 tester.Responding(
false);
844 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
845 KeyStateChange{VK_LMENU,
true,
false},
846 WmSysKeyDownInfo{VK_MENU, kScanCodeAlt, kNotExtended, kWasUp}.Build(
849 EXPECT_EQ(tester.key_calls.size(), 1);
851 kPhysicalAltLeft, kLogicalAltLeft,
"", kNotSynthesized);
852 tester.clear_key_calls();
854 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
857 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
858 KeyStateChange{VK_LMENU,
false,
true},
859 WmSysKeyUpInfo{VK_MENU, kScanCodeAlt, kNotExtended}.Build(
862 EXPECT_EQ(tester.key_calls.size(), 1);
864 kPhysicalAltLeft, kLogicalAltLeft,
"", kNotSynthesized);
865 tester.clear_key_calls();
867 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
870 TEST_F(KeyboardTest, AltRightUnhandled) {
871 KeyboardTester tester{GetContext()};
872 tester.Responding(
false);
877 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
878 KeyStateChange{VK_RMENU,
true,
false},
879 WmSysKeyDownInfo{VK_MENU, kScanCodeAlt, kExtended, kWasUp}.Build(
882 EXPECT_EQ(tester.key_calls.size(), 1);
884 kPhysicalAltRight, kLogicalAltRight,
"",
886 tester.clear_key_calls();
888 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
891 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
892 KeyStateChange{VK_RMENU,
false,
true},
893 WmSysKeyUpInfo{VK_MENU, kScanCodeAlt, kExtended}.Build(
896 EXPECT_EQ(tester.key_calls.size(), 1);
898 kPhysicalAltRight, kLogicalAltRight,
"",
900 tester.clear_key_calls();
902 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
905 TEST_F(KeyboardTest, MetaLeftUnhandled) {
906 KeyboardTester tester{GetContext()};
907 tester.Responding(
false);
912 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
913 KeyStateChange{VK_LWIN,
true,
false},
914 WmKeyDownInfo{VK_LWIN, kScanCodeMetaLeft, kExtended, kWasUp}.Build(
917 EXPECT_EQ(tester.key_calls.size(), 1);
919 kPhysicalMetaLeft, kLogicalMetaLeft,
"",
921 tester.clear_key_calls();
922 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
925 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
926 KeyStateChange{VK_LWIN,
false,
true},
927 WmKeyUpInfo{VK_LWIN, kScanCodeMetaLeft, kExtended}.Build(kWmResultZero)});
929 EXPECT_EQ(tester.key_calls.size(), 1);
931 kPhysicalMetaLeft, kLogicalMetaLeft,
"",
933 tester.clear_key_calls();
934 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
937 TEST_F(KeyboardTest, MetaRightUnhandled) {
938 KeyboardTester tester{GetContext()};
939 tester.Responding(
false);
944 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
945 KeyStateChange{VK_RWIN,
true,
false},
946 WmKeyDownInfo{VK_RWIN, kScanCodeMetaRight, kExtended, kWasUp}.Build(
949 EXPECT_EQ(tester.key_calls.size(), 1);
951 kPhysicalMetaRight, kLogicalMetaRight,
"",
953 tester.clear_key_calls();
954 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
957 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
958 KeyStateChange{VK_RWIN,
false,
true},
959 WmKeyUpInfo{VK_RWIN, kScanCodeMetaRight, kExtended}.Build(
962 EXPECT_EQ(tester.key_calls.size(), 1);
964 kPhysicalMetaRight, kLogicalMetaRight,
"",
966 tester.clear_key_calls();
967 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
972 KeyboardTester tester{GetContext()};
973 tester.Responding(
true);
976 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
983 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
986 WmCharInfo{
'a',
kScanCodeKeyA, kNotExtended, kWasDown}.Build(
989 EXPECT_EQ(tester.key_calls.size(), 2);
991 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
993 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
994 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
1000 TEST_F(KeyboardTest, RestartClearsKeyboardState) {
1001 KeyboardTester tester{GetContext()};
1002 tester.Responding(
true);
1005 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1012 tester.ResetKeyboard();
1016 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1019 WmCharInfo{
'a',
kScanCodeKeyA, kNotExtended, kWasDown}.Build(
1022 EXPECT_EQ(tester.key_calls.size(), 2);
1024 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
1026 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
1027 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
1032 TEST_F(KeyboardTest, FreshKeyDownAfterMissedUpIsDelivered) {
1033 KeyboardTester tester{GetContext()};
1034 tester.Responding(
true);
1036 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1037 WmKeyDownInfo{VK_RETURN, kScanCodeEnter, kNotExtended, kWasUp}.Build(
1040 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1041 WmKeyDownInfo{VK_RETURN, kScanCodeEnter, kNotExtended, kWasUp}.Build(
1044 ASSERT_EQ(tester.key_calls.size(), 3u);
1046 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
1048 kPhysicalEnter, kLogicalEnter,
"", kSynthesized);
1050 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
1051 tester.clear_key_calls();
1053 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1054 WmKeyUpInfo{VK_RETURN, kScanCodeEnter, kNotExtended}.Build(
1057 ASSERT_EQ(tester.key_calls.size(), 1u);
1059 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
1060 tester.clear_key_calls();
1061 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0u);
1067 KeyboardTester tester{GetContext()};
1068 tester.Responding(
false);
1073 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1074 KeyStateChange{VK_LSHIFT,
true,
true},
1078 EXPECT_EQ(tester.key_calls.size(), 1);
1080 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
1082 tester.clear_key_calls();
1083 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1086 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1092 EXPECT_EQ(tester.key_calls.size(), 2);
1094 kPhysicalKeyA, kLogicalKeyA,
"A", kNotSynthesized);
1096 tester.clear_key_calls();
1097 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1100 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1101 KeyStateChange{VK_LSHIFT,
false,
true},
1105 EXPECT_EQ(tester.key_calls.size(), 1);
1107 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
1109 tester.clear_key_calls();
1110 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1113 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1117 EXPECT_EQ(tester.key_calls.size(), 1);
1119 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
1120 tester.clear_key_calls();
1121 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1127 KeyboardTester tester{GetContext()};
1128 tester.Responding(
false);
1133 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1134 KeyStateChange{VK_LCONTROL,
true,
true},
1135 WmKeyDownInfo{VK_CONTROL, kScanCodeControl, kNotExtended, kWasUp}.Build(
1138 EXPECT_EQ(tester.key_calls.size(), 1);
1140 kPhysicalControlLeft, kLogicalControlLeft,
"",
1142 tester.clear_key_calls();
1143 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1146 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1149 WmCharInfo{0x01,
kScanCodeKeyA, kNotExtended, kWasUp}.Build(
1152 EXPECT_EQ(tester.key_calls.size(), 1);
1154 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
1155 tester.clear_key_calls();
1156 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1159 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1163 EXPECT_EQ(tester.key_calls.size(), 1);
1165 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
1166 tester.clear_key_calls();
1167 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1170 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1171 KeyStateChange{VK_LCONTROL,
false,
true},
1172 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kNotExtended}.Build(
1175 EXPECT_EQ(tester.key_calls.size(), 1);
1177 kPhysicalControlLeft, kLogicalControlLeft,
"",
1179 tester.clear_key_calls();
1180 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1185 KeyboardTester tester{GetContext()};
1186 tester.Responding(
false);
1191 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1192 KeyStateChange{VK_LCONTROL,
true,
true},
1193 WmKeyDownInfo{VK_CONTROL, kScanCodeControl, kNotExtended, kWasUp}.Build(
1196 EXPECT_EQ(tester.key_calls.size(), 1);
1198 kPhysicalControlLeft, kLogicalControlLeft,
"",
1200 tester.clear_key_calls();
1201 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1204 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1205 WmKeyDownInfo{kVirtualDigit1, kScanCodeDigit1, kNotExtended, kWasUp}
1206 .Build(kWmResultZero)});
1208 EXPECT_EQ(tester.key_calls.size(), 1);
1210 kPhysicalDigit1, kLogicalDigit1,
"", kNotSynthesized);
1211 tester.clear_key_calls();
1212 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1215 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1216 WmKeyUpInfo{kVirtualDigit1, kScanCodeDigit1, kNotExtended}.Build(
1219 EXPECT_EQ(tester.key_calls.size(), 1);
1221 kPhysicalDigit1, kLogicalDigit1,
"", kNotSynthesized);
1222 tester.clear_key_calls();
1223 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1226 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1227 KeyStateChange{VK_LCONTROL,
false,
true},
1228 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kNotExtended}.Build(
1231 EXPECT_EQ(tester.key_calls.size(), 1);
1233 kPhysicalControlLeft, kLogicalControlLeft,
"",
1235 tester.clear_key_calls();
1236 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1242 KeyboardTester tester{GetContext()};
1243 tester.Responding(
false);
1245 tester.SetLayout(LayoutFrench);
1248 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1249 WmKeyDownInfo{kVirtualDigit1, kScanCodeDigit1, kNotExtended, kWasUp}
1250 .Build(kWmResultZero),
1251 WmCharInfo{
'&', kScanCodeDigit1, kNotExtended, kWasUp}.Build(
1254 EXPECT_EQ(tester.key_calls.size(), 2);
1256 kPhysicalDigit1, kLogicalDigit1,
"&", kNotSynthesized);
1258 tester.clear_key_calls();
1259 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1262 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1263 WmKeyUpInfo{kVirtualDigit1, kScanCodeDigit1, kNotExtended}.Build(
1266 EXPECT_EQ(tester.key_calls.size(), 1);
1268 kPhysicalDigit1, kLogicalDigit1,
"", kNotSynthesized);
1269 tester.clear_key_calls();
1270 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1275 KeyboardTester tester{GetContext()};
1276 tester.Responding(
false);
1281 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1282 KeyStateChange{VK_LCONTROL,
true,
true},
1283 WmKeyDownInfo{VK_LCONTROL, kScanCodeControl, kNotExtended, kWasUp}.Build(
1285 KeyStateChange{VK_RMENU,
true,
true},
1286 WmKeyDownInfo{VK_MENU, kScanCodeAlt, kExtended, kWasUp}.Build(
1289 EXPECT_EQ(tester.key_calls.size(), 2);
1291 kPhysicalControlLeft, kLogicalControlLeft,
"",
1294 kPhysicalAltRight, kLogicalAltRight,
"",
1296 tester.clear_key_calls();
1297 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1300 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1301 WmKeyDownInfo{kVirtualKeyQ, kScanCodeKeyQ, kNotExtended, kWasUp}.Build(
1303 WmCharInfo{
'@', kScanCodeKeyQ, kNotExtended, kWasUp}.Build(
1306 EXPECT_EQ(tester.key_calls.size(), 2);
1308 kPhysicalKeyQ, kLogicalKeyQ,
"@", kNotSynthesized);
1310 tester.clear_key_calls();
1311 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1314 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1315 WmKeyUpInfo{kVirtualKeyQ, kScanCodeKeyQ, kNotExtended}.Build(
1318 EXPECT_EQ(tester.key_calls.size(), 1);
1320 kPhysicalKeyQ, kLogicalKeyQ,
"", kNotSynthesized);
1321 tester.clear_key_calls();
1322 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1327 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1328 KeyStateChange{VK_LCONTROL,
false,
true},
1329 ExpectForgedMessage{
1330 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kNotExtended}.Build(
1332 KeyStateChange{VK_RMENU,
false,
true},
1333 WmSysKeyUpInfo{VK_MENU, kScanCodeAlt, kExtended}.Build(
1334 kWmResultDefault)});
1336 EXPECT_EQ(tester.key_calls.size(), 2);
1338 kPhysicalControlLeft, kLogicalControlLeft,
"",
1341 kPhysicalAltRight, kLogicalAltRight,
"",
1343 tester.clear_key_calls();
1345 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1362 KeyboardTester tester{GetContext()};
1363 tester.Responding(
false);
1369 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1370 KeyStateChange{VK_LCONTROL,
true,
true},
1371 WmKeyDownInfo{VK_CONTROL, kScanCodeControl, kNotExtended, kWasUp}.Build(
1373 KeyStateChange{VK_RMENU,
true,
true},
1374 WmKeyDownInfo{VK_MENU, kScanCodeAlt, kExtended, kWasUp}.Build(
1377 EXPECT_EQ(tester.key_calls.size(), 2);
1379 kPhysicalControlLeft, kLogicalControlLeft,
"",
1382 kPhysicalAltRight, kLogicalAltRight,
"",
1384 tester.clear_key_calls();
1385 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1390 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1391 KeyStateChange{VK_LCONTROL,
false,
true},
1392 ExpectForgedMessage{
1393 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kNotExtended}.Build(
1395 KeyStateChange{VK_RMENU,
false,
true},
1396 WmSysKeyUpInfo{VK_MENU, kScanCodeAlt, kExtended}.Build(
1397 kWmResultDefault)});
1398 EXPECT_EQ(tester.key_calls.size(), 2);
1400 kPhysicalControlLeft, kLogicalControlLeft,
"",
1403 kPhysicalAltRight, kLogicalAltRight,
"",
1405 tester.clear_key_calls();
1407 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1411 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1412 KeyStateChange{VK_LCONTROL,
true,
false},
1413 WmKeyDownInfo{VK_CONTROL, kScanCodeControl, kNotExtended, kWasUp}.Build(
1415 KeyStateChange{VK_RMENU,
true,
true},
1416 WmKeyDownInfo{VK_MENU, kScanCodeAlt, kExtended, kWasUp}.Build(
1419 EXPECT_EQ(tester.key_calls.size(), 2);
1421 kPhysicalControlLeft, kLogicalControlLeft,
"",
1424 kPhysicalAltRight, kLogicalAltRight,
"",
1426 tester.clear_key_calls();
1427 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1432 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1433 KeyStateChange{VK_LCONTROL,
false,
false},
1434 ExpectForgedMessage{
1435 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kNotExtended}.Build(
1437 KeyStateChange{VK_RMENU,
false,
false},
1438 WmSysKeyUpInfo{VK_MENU, kScanCodeAlt, kExtended}.Build(
1439 kWmResultDefault)});
1440 EXPECT_EQ(tester.key_calls.size(), 2);
1442 kPhysicalControlLeft, kLogicalControlLeft,
"",
1445 kPhysicalAltRight, kLogicalAltRight,
"",
1447 tester.clear_key_calls();
1449 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1452 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1453 WmKeyUpInfo{VK_CONTROL, kScanCodeControl, kNotExtended}.Build(
1455 EXPECT_EQ(tester.key_calls.size(), 1);
1458 tester.clear_key_calls();
1459 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
1465 KeyboardTester tester{GetContext()};
1466 tester.Responding(
false);
1468 tester.SetLayout(LayoutFrench);
1471 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1472 WmKeyDownInfo{0xDD, kScanCodeBracketLeft, kNotExtended, kWasUp}.Build(
1474 WmDeadCharInfo{
'^', kScanCodeBracketLeft, kNotExtended, kWasUp}.Build(
1477 EXPECT_EQ(tester.key_calls.size(), 1);
1479 kPhysicalBracketLeft, kLogicalBracketRight,
"^",
1481 tester.clear_key_calls();
1482 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1485 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1486 WmKeyUpInfo{0xDD, kScanCodeBracketLeft, kNotExtended}.Build(
1489 EXPECT_EQ(tester.key_calls.size(), 1);
1491 kPhysicalBracketLeft, kLogicalBracketRight,
"",
1493 tester.clear_key_calls();
1494 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1497 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1498 WmKeyDownInfo{kVirtualKeyE, kScanCodeKeyE, kNotExtended, kWasUp}.Build(
1500 WmCharInfo{0xEA, kScanCodeKeyE, kNotExtended, kWasUp}.Build(
1503 EXPECT_EQ(tester.key_calls.size(), 2);
1505 kPhysicalKeyE, kLogicalKeyE,
"ê", kNotSynthesized);
1507 tester.clear_key_calls();
1508 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1511 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1512 WmKeyUpInfo{kVirtualKeyE, kScanCodeKeyE, kNotExtended}.Build(
1515 EXPECT_EQ(tester.key_calls.size(), 1);
1517 kPhysicalKeyE, kLogicalKeyE,
"", kNotSynthesized);
1518 tester.clear_key_calls();
1519 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1527 TEST_F(KeyboardTest, DeadKeyWithoutDeadMaskThatCombines) {
1528 KeyboardTester tester{GetContext()};
1529 tester.Responding(
false);
1532 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1533 KeyStateChange{VK_LSHIFT,
true,
true},
1537 EXPECT_EQ(tester.key_calls.size(), 1);
1539 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
1541 tester.clear_key_calls();
1542 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1545 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1546 WmKeyDownInfo{
'6', kScanCodeDigit6, kNotExtended, kWasUp}.Build(
1548 WmDeadCharInfo{
'^', kScanCodeDigit6, kNotExtended, kWasUp}.Build(
1551 EXPECT_EQ(tester.key_calls.size(), 1);
1553 kPhysicalDigit6, kLogicalDigit6,
"6", kNotSynthesized);
1554 tester.clear_key_calls();
1555 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1558 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1559 WmKeyUpInfo{
'6', kScanCodeDigit6, kNotExtended}.Build(kWmResultZero)});
1561 EXPECT_EQ(tester.key_calls.size(), 1);
1563 kPhysicalDigit6, kLogicalDigit6,
"", kNotSynthesized);
1564 tester.clear_key_calls();
1565 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1568 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1569 KeyStateChange{VK_LSHIFT,
false,
true},
1573 EXPECT_EQ(tester.key_calls.size(), 1);
1575 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
1577 tester.clear_key_calls();
1578 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1581 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1582 WmKeyDownInfo{kVirtualKeyE, kScanCodeKeyE, kNotExtended, kWasUp}.Build(
1584 WmCharInfo{0xEA, kScanCodeKeyE, kNotExtended, kWasUp}.Build(
1587 EXPECT_EQ(tester.key_calls.size(), 2);
1589 kPhysicalKeyE, kLogicalKeyE,
"ê", kNotSynthesized);
1591 tester.clear_key_calls();
1592 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1595 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1596 WmKeyUpInfo{kVirtualKeyE, kScanCodeKeyE, kNotExtended}.Build(
1599 EXPECT_EQ(tester.key_calls.size(), 1);
1601 kPhysicalKeyE, kLogicalKeyE,
"", kNotSynthesized);
1602 tester.clear_key_calls();
1603 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1608 TEST_F(KeyboardTest, DeadKeyThatDoesNotCombine) {
1609 KeyboardTester tester{GetContext()};
1610 tester.Responding(
false);
1612 tester.SetLayout(LayoutFrench);
1615 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1616 WmKeyDownInfo{0xDD, kScanCodeBracketLeft, kNotExtended, kWasUp}.Build(
1618 WmDeadCharInfo{
'^', kScanCodeBracketLeft, kNotExtended, kWasUp}.Build(
1621 EXPECT_EQ(tester.key_calls.size(), 1);
1623 kPhysicalBracketLeft, kLogicalBracketRight,
"^",
1625 tester.clear_key_calls();
1626 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1629 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1630 WmKeyUpInfo{0xDD, kScanCodeBracketLeft, kNotExtended}.Build(
1633 EXPECT_EQ(tester.key_calls.size(), 1);
1635 kPhysicalBracketLeft, kLogicalBracketRight,
"",
1637 tester.clear_key_calls();
1638 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1641 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1642 WmKeyDownInfo{kVirtualDigit1, kScanCodeDigit1, kNotExtended, kWasUp}
1643 .Build(kWmResultZero),
1644 WmCharInfo{
'^', kScanCodeDigit1, kNotExtended, kWasUp}.Build(
1646 WmCharInfo{
'&', kScanCodeDigit1, kNotExtended, kWasUp}.Build(
1649 EXPECT_EQ(tester.key_calls.size(), 3);
1651 kPhysicalDigit1, kLogicalDigit1,
"^", kNotSynthesized);
1654 tester.clear_key_calls();
1660 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1663 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1664 WmKeyUpInfo{kVirtualDigit1, kScanCodeDigit1, kNotExtended}.Build(
1667 EXPECT_EQ(tester.key_calls.size(), 1);
1669 kPhysicalDigit1, kLogicalDigit1,
"", kNotSynthesized);
1670 tester.clear_key_calls();
1671 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1677 TEST_F(KeyboardTest, DeadKeyTwiceThenLetter) {
1678 KeyboardTester tester{GetContext()};
1679 tester.Responding(
false);
1684 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1685 WmKeyDownInfo{0xC0, kScanCodeBackquote, kNotExtended, kWasUp}.Build(
1687 WmDeadCharInfo{
'`', kScanCodeBackquote, kNotExtended, kWasUp}.Build(
1690 EXPECT_EQ(tester.key_calls.size(), 1);
1692 kPhysicalBackquote, kLogicalBackquote,
"`",
1694 tester.clear_key_calls();
1695 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1698 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1699 WmKeyUpInfo{0xC0, kScanCodeBackquote, kNotExtended}.Build(
1702 EXPECT_EQ(tester.key_calls.size(), 1);
1704 kPhysicalBackquote, kLogicalBackquote,
"",
1706 tester.clear_key_calls();
1707 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1711 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
1712 tester.LateResponding(
1713 [&recorded_callbacks](
1714 const FlutterKeyEvent* event,
1715 MockKeyResponseController::ResponseCallback
callback) {
1716 recorded_callbacks.push_back(
callback);
1719 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1720 WmKeyDownInfo{0xC0, kScanCodeBackquote, kNotExtended, kWasUp}.Build(
1722 WmCharInfo{
'`', kScanCodeBackquote, kNotExtended, kWasUp, kBeingReleased,
1723 kNoContext, 1,
true}
1724 .Build(kWmResultZero),
1725 WmCharInfo{
'`', kScanCodeBackquote, kNotExtended, kWasUp}.Build(
1728 EXPECT_EQ(recorded_callbacks.size(), 1);
1729 EXPECT_EQ(tester.key_calls.size(), 1);
1731 kPhysicalBackquote, kLogicalBackquote,
"`",
1733 tester.clear_key_calls();
1735 recorded_callbacks.front()(
false);
1736 EXPECT_EQ(tester.key_calls.size(), 2);
1739 tester.clear_key_calls();
1743 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1745 tester.Responding(
false);
1748 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1749 WmKeyUpInfo{0xC0, kScanCodeBackquote, kNotExtended}.Build(
1752 EXPECT_EQ(tester.key_calls.size(), 1);
1754 kPhysicalBackquote, kLogicalBackquote,
"",
1756 tester.clear_key_calls();
1757 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1762 KeyboardTester tester{GetContext()};
1763 tester.Responding(
false);
1769 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1770 WmKeyDownInfo{kVirtualKeyW, kScanCodeKeyW, kNotExtended, kWasUp}.Build(
1772 WmCharInfo{0xd800, kScanCodeKeyW, kNotExtended, kWasUp}.Build(
1774 WmCharInfo{0xdf45, kScanCodeKeyW, kNotExtended, kWasUp}.Build(
1777 const char* st = tester.key_calls[0].key_event.character;
1779 EXPECT_EQ(tester.key_calls.size(), 2);
1781 kPhysicalKeyW, kLogicalKeyW,
"𐍅", kNotSynthesized);
1783 tester.clear_key_calls();
1784 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 3);
1787 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1788 WmKeyUpInfo{kVirtualKeyW, kScanCodeKeyW, kNotExtended}.Build(
1791 EXPECT_EQ(tester.key_calls.size(), 1);
1793 kPhysicalKeyW, kLogicalKeyW,
"", kNotSynthesized);
1794 tester.clear_key_calls();
1795 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1799 KeyboardTester tester{GetContext()};
1800 tester.Responding(
false);
1803 Win32Message event1 =
1804 WmKeyDownInfo{VK_BACK, kScanCodeBackspace, kNotExtended, kWasUp}.Build(
1806 Win32Message event2 =
1807 WmKeyUpInfo{VK_BACK, kScanCodeBackspace, kNotExtended}.Build(
1811 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1812 KeyStateChange{VK_LSHIFT,
true,
true}, event1});
1813 EXPECT_EQ(tester.key_calls.size(), 2);
1815 kPhysicalShiftLeft, kLogicalShiftLeft,
"", kSynthesized);
1816 tester.clear_key_calls();
1817 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1819 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1820 KeyStateChange{VK_LSHIFT,
false,
true}, event2});
1821 EXPECT_EQ(tester.key_calls.size(), 2);
1823 kPhysicalShiftLeft, kLogicalShiftLeft,
"", kSynthesized);
1824 tester.clear_key_calls();
1825 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1828 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1829 KeyStateChange{VK_RSHIFT,
true,
true}, event1});
1830 EXPECT_EQ(tester.key_calls.size(), 2);
1832 kPhysicalShiftRight, kLogicalShiftRight,
"",
1834 tester.clear_key_calls();
1835 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1837 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1838 KeyStateChange{VK_RSHIFT,
false,
true}, event2});
1839 EXPECT_EQ(tester.key_calls.size(), 2);
1841 kPhysicalShiftRight, kLogicalShiftRight,
"",
1843 tester.clear_key_calls();
1844 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1847 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1848 KeyStateChange{VK_LCONTROL,
true,
true}, event1});
1849 EXPECT_EQ(tester.key_calls.size(), 2);
1851 kPhysicalControlLeft, kLogicalControlLeft,
"",
1853 tester.clear_key_calls();
1854 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1856 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1857 KeyStateChange{VK_LCONTROL,
false,
true}, event2});
1858 EXPECT_EQ(tester.key_calls.size(), 2);
1860 kPhysicalControlLeft, kLogicalControlLeft,
"",
1862 tester.clear_key_calls();
1863 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1866 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1867 KeyStateChange{VK_RCONTROL,
true,
true}, event1});
1868 EXPECT_EQ(tester.key_calls.size(), 2);
1870 kPhysicalControlRight, kLogicalControlRight,
"",
1872 tester.clear_key_calls();
1873 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1875 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1876 KeyStateChange{VK_RCONTROL,
false,
true}, event2});
1877 EXPECT_EQ(tester.key_calls.size(), 2);
1879 kPhysicalControlRight, kLogicalControlRight,
"",
1881 tester.clear_key_calls();
1882 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1885 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1886 KeyStateChange{VK_LMENU,
true,
true}, event1});
1887 EXPECT_EQ(tester.key_calls.size(), 2);
1889 kPhysicalAltLeft, kLogicalAltLeft,
"", kSynthesized);
1890 tester.clear_key_calls();
1891 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1893 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1894 KeyStateChange{VK_LMENU,
false,
true}, event2});
1895 EXPECT_EQ(tester.key_calls.size(), 2);
1897 kPhysicalAltLeft, kLogicalAltLeft,
"", kSynthesized);
1898 tester.clear_key_calls();
1899 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1902 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1903 KeyStateChange{VK_RMENU,
true,
true}, event1});
1904 EXPECT_EQ(tester.key_calls.size(), 2);
1906 kPhysicalAltRight, kLogicalAltRight,
"", kSynthesized);
1907 tester.clear_key_calls();
1908 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1910 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1911 KeyStateChange{VK_RMENU,
false,
true}, event2});
1912 EXPECT_EQ(tester.key_calls.size(), 2);
1914 kPhysicalAltRight, kLogicalAltRight,
"", kSynthesized);
1915 tester.clear_key_calls();
1916 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1919 tester.InjectKeyboardChanges(
1920 std::vector<KeyboardChange>{KeyStateChange{VK_LWIN,
true,
true}, event1});
1921 EXPECT_EQ(tester.key_calls.size(), 2);
1923 kPhysicalMetaLeft, kLogicalMetaLeft,
"", kSynthesized);
1924 tester.clear_key_calls();
1925 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1927 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1928 KeyStateChange{VK_LWIN,
false,
true}, event2});
1929 EXPECT_EQ(tester.key_calls.size(), 2);
1931 kPhysicalMetaLeft, kLogicalMetaLeft,
"", kSynthesized);
1932 tester.clear_key_calls();
1933 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1936 tester.InjectKeyboardChanges(
1937 std::vector<KeyboardChange>{KeyStateChange{VK_RWIN,
true,
true}, event1});
1938 EXPECT_EQ(tester.key_calls.size(), 2);
1940 kPhysicalMetaRight, kLogicalMetaRight,
"", kSynthesized);
1941 tester.clear_key_calls();
1942 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1944 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1945 KeyStateChange{VK_RWIN,
false,
true}, event2});
1946 EXPECT_EQ(tester.key_calls.size(), 2);
1948 kPhysicalMetaRight, kLogicalMetaRight,
"", kSynthesized);
1949 tester.clear_key_calls();
1950 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1954 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1955 KeyStateChange{VK_CAPITAL,
false,
true}, event1});
1956 EXPECT_EQ(tester.key_calls.size(), 3);
1958 kPhysicalCapsLock, kLogicalCapsLock,
"", kSynthesized);
1960 kPhysicalCapsLock, kLogicalCapsLock,
"", kSynthesized);
1961 tester.clear_key_calls();
1962 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1964 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1965 KeyStateChange{VK_CAPITAL,
false,
false}, event2});
1966 EXPECT_EQ(tester.key_calls.size(), 3);
1968 kPhysicalCapsLock, kLogicalCapsLock,
"", kSynthesized);
1970 kPhysicalCapsLock, kLogicalCapsLock,
"", kSynthesized);
1971 tester.clear_key_calls();
1972 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1975 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1976 KeyStateChange{VK_SCROLL,
true,
true}, event1});
1977 EXPECT_EQ(tester.key_calls.size(), 2);
1979 kPhysicalScrollLock, kLogicalScrollLock,
"",
1981 tester.clear_key_calls();
1982 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1984 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1985 KeyStateChange{VK_SCROLL,
true,
false}, event2});
1986 EXPECT_EQ(tester.key_calls.size(), 3);
1988 kPhysicalScrollLock, kLogicalScrollLock,
"",
1991 kPhysicalScrollLock, kLogicalScrollLock,
"",
1993 tester.clear_key_calls();
1994 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1997 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1998 KeyStateChange{VK_NUMLOCK,
true,
false}, event1});
2003 EXPECT_EQ(tester.key_calls.size(), 2);
2005 kPhysicalNumLock, kLogicalNumLock,
"", kSynthesized);
2006 tester.clear_key_calls();
2007 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2009 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2010 KeyStateChange{VK_NUMLOCK,
false,
true}, event2});
2011 EXPECT_EQ(tester.key_calls.size(), 4);
2013 kPhysicalNumLock, kLogicalNumLock,
"", kSynthesized);
2015 kPhysicalNumLock, kLogicalNumLock,
"", kSynthesized);
2017 kPhysicalNumLock, kLogicalNumLock,
"", kSynthesized);
2018 tester.clear_key_calls();
2019 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2026 TEST_F(KeyboardTest, ImeExtendedEventsAreIgnored) {
2027 KeyboardTester tester{GetContext()};
2028 tester.Responding(
false);
2036 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2037 KeyStateChange{VK_RCONTROL,
true,
false},
2038 WmKeyDownInfo{VK_PROCESSKEY, kScanCodeControl, kExtended, kWasUp}.Build(
2041 EXPECT_EQ(tester.key_calls.size(), 1);
2044 tester.clear_key_calls();
2045 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2054 TEST_F(KeyboardTest, UpOnlyImeEventsAreCorrectlyHandled) {
2055 KeyboardTester tester{GetContext()};
2056 tester.Responding(
true);
2061 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2062 KeyStateChange{VK_LSHIFT,
true,
false},
2065 WmKeyDownInfo{VK_PROCESSKEY, kScanCodeDigit2, kNotExtended, kWasUp}.Build(
2067 KeyStateChange{VK_LSHIFT,
false,
true},
2070 WmKeyUpInfo{
'2', kScanCodeDigit2, kNotExtended, kWasUp}.Build(
2073 EXPECT_EQ(tester.key_calls.size(), 4);
2075 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
2080 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
2084 tester.clear_key_calls();
2093 TEST_F(KeyboardTest, SlowFrameworkResponse) {
2094 KeyboardTester tester{GetContext()};
2096 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
2099 tester.LateResponding(
2100 [&recorded_callbacks](
2101 const FlutterKeyEvent* event,
2102 MockKeyResponseController::ResponseCallback
callback) {
2103 recorded_callbacks.push_back(
callback);
2107 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2114 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2117 WmCharInfo{
'a',
kScanCodeKeyA, kNotExtended, kWasDown}.Build(
2120 EXPECT_EQ(tester.key_calls.size(), 1);
2122 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2123 EXPECT_EQ(recorded_callbacks.size(), 1);
2124 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2127 recorded_callbacks.front()(
false);
2129 EXPECT_EQ(tester.key_calls.size(), 3);
2130 EXPECT_EQ(recorded_callbacks.size(), 2);
2133 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2134 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2137 recorded_callbacks.back()(
false);
2139 EXPECT_EQ(tester.key_calls.size(), 4);
2141 tester.clear_key_calls();
2142 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2156 TEST_F(KeyboardTest, SlowFrameworkResponseForIdenticalEvents) {
2157 KeyboardTester tester{GetContext()};
2158 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
2161 tester.LateResponding(
2162 [&recorded_callbacks](
2163 const FlutterKeyEvent* event,
2164 MockKeyResponseController::ResponseCallback
callback) {
2165 recorded_callbacks.push_back(
callback);
2169 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2175 EXPECT_EQ(tester.key_calls.size(), 1);
2177 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2178 tester.clear_key_calls();
2179 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2182 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2186 EXPECT_EQ(tester.key_calls.size(), 0);
2187 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2190 EXPECT_EQ(recorded_callbacks.size(), 1);
2191 recorded_callbacks.front()(
false);
2193 EXPECT_EQ(tester.key_calls.size(), 2);
2196 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
2197 tester.clear_key_calls();
2198 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2201 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2209 EXPECT_EQ(recorded_callbacks.size(), 2);
2210 EXPECT_EQ(tester.key_calls.size(), 0);
2211 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2215 recorded_callbacks.back()(
false);
2216 EXPECT_EQ(tester.key_calls.size(), 1);
2218 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2219 tester.clear_key_calls();
2220 EXPECT_EQ(recorded_callbacks.size(), 3);
2221 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2224 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2228 EXPECT_EQ(tester.key_calls.size(), 0);
2229 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2233 KeyboardTester tester{GetContext()};
2234 tester.Responding(
false);
2238 tester.InjectPlatformMessage(
2239 "flutter/textinput",
"TextInput.setClient",
2240 R
"|([108, {"inputAction": "TextInputAction.none", "viewId": 0}])|");
2243 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2244 WmKeyDownInfo{VK_RETURN, kScanCodeEnter, kNotExtended, kWasUp}.Build(
2246 WmCharInfo{
'\n', kScanCodeEnter, kNotExtended, kWasUp}.Build(
2249 EXPECT_EQ(tester.key_calls.size(), 2);
2251 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
2253 tester.key_calls[1],
2255 R
"|("method":"TextInputClient.performAction",)|"
2256 R"|("args":[108,"TextInputAction.none"])|"
2258 tester.clear_key_calls();
2259 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2262 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2263 WmKeyUpInfo{VK_RETURN, kScanCodeEnter, kNotExtended}.Build(
2266 EXPECT_EQ(tester.key_calls.size(), 1);
2268 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
2269 tester.clear_key_calls();
2270 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2277 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2283 EXPECT_EQ(tester.key_calls.size(), 2);
2285 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2287 tester.clear_key_calls();
2290 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2294 EXPECT_EQ(tester.key_calls.size(), 1);
2296 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
2297 tester.clear_key_calls();
2300 TEST_F(KeyboardTest, VietnameseTelexAddDiacriticWithFastResponse) {
2310 KeyboardTester tester{GetContext()};
2311 tester.Responding(
false);
2316 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2322 EXPECT_EQ(tester.key_calls.size(), 2);
2324 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2326 tester.clear_key_calls();
2327 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2330 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2334 EXPECT_EQ(tester.key_calls.size(), 1);
2336 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
2337 tester.clear_key_calls();
2338 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2343 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2344 WmKeyDownInfo{VK_BACK, kScanCodeBackspace, kNotExtended, kWasUp}.Build(
2346 WmCharInfo{0x8, kScanCodeBackspace, kNotExtended, kWasUp}.Build(
2348 WmKeyUpInfo{VK_BACK, kScanCodeBackspace, kNotExtended}.Build(
2350 WmKeyDownInfo{VK_PACKET, 0, kNotExtended, kWasUp}.Build(kWmResultDefault),
2351 WmCharInfo{0xe0 , 0, kNotExtended, kWasUp}.Build(kWmResultZero),
2352 WmKeyUpInfo{VK_PACKET, 0, kNotExtended}.Build(kWmResultDefault)});
2354 EXPECT_EQ(tester.key_calls.size(), 3);
2356 kPhysicalBackspace, kLogicalBackspace,
"",
2359 kPhysicalBackspace, kLogicalBackspace,
"",
2362 tester.clear_key_calls();
2368 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 3);
2371 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2372 WmKeyUpInfo{kVirtualKeyF, kScanCodeKeyF, kNotExtended,
2374 .Build(kWmResultZero)});
2376 EXPECT_EQ(tester.key_calls.size(), 1);
2379 tester.clear_key_calls();
2380 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2384 bool backspace_response) {
2394 KeyboardTester tester{context};
2395 tester.Responding(
false);
2400 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2406 EXPECT_EQ(tester.key_calls.size(), 2);
2408 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2410 tester.clear_key_calls();
2411 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2414 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2418 EXPECT_EQ(tester.key_calls.size(), 1);
2420 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
2421 tester.clear_key_calls();
2422 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2424 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
2425 tester.LateResponding(
2426 [&recorded_callbacks](
2427 const FlutterKeyEvent* event,
2428 MockKeyResponseController::ResponseCallback
callback) {
2429 recorded_callbacks.push_back(
callback);
2435 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2436 WmKeyDownInfo{VK_BACK, kScanCodeBackspace, kNotExtended, kWasUp}.Build(
2438 WmCharInfo{0x8, kScanCodeBackspace, kNotExtended, kWasUp}.Build(
2440 WmKeyUpInfo{VK_BACK, kScanCodeBackspace, kNotExtended}.Build(
2442 WmKeyDownInfo{VK_PACKET, 0, kNotExtended, kWasUp}.Build(kWmResultDefault),
2443 WmCharInfo{0xe0 , 0, kNotExtended, kWasUp}.Build(kWmResultZero),
2444 WmKeyUpInfo{VK_PACKET, 0, kNotExtended}.Build(kWmResultDefault)});
2451 EXPECT_EQ(tester.key_calls.size(), 1);
2453 kPhysicalBackspace, kLogicalBackspace,
"",
2455 tester.clear_key_calls();
2456 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2458 EXPECT_EQ(recorded_callbacks.size(), 1);
2459 recorded_callbacks[0](backspace_response);
2461 EXPECT_EQ(tester.key_calls.size(), 1);
2463 kPhysicalBackspace, kLogicalBackspace,
"",
2465 tester.clear_key_calls();
2466 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(),
2467 backspace_response ? 0 : 2);
2469 recorded_callbacks[1](
false);
2470 EXPECT_EQ(tester.key_calls.size(), 1);
2472 tester.clear_key_calls();
2473 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2475 tester.Responding(
false);
2478 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2479 WmKeyUpInfo{kVirtualKeyF, kScanCodeKeyF, kNotExtended,
2481 .Build(kWmResultZero)});
2483 EXPECT_EQ(tester.key_calls.size(), 1);
2486 tester.clear_key_calls();
2487 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2490 TEST_F(KeyboardTest, VietnameseTelexAddDiacriticWithSlowFalseResponse) {
2494 TEST_F(KeyboardTest, VietnameseTelexAddDiacriticWithSlowTrueResponse) {
2501 KeyboardTester tester{GetContext()};
2502 tester.Responding(
false);
2504 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2505 WmKeyDownInfo{VK_CAPITAL, 0, kNotExtended}.Build(),
2506 WmKeyUpInfo{VK_CAPITAL, 0, kNotExtended}.Build()});
2508 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
union flutter::testing::@98::KeyboardChange::@0 content
#define EXPECT_CALL_IS_TEXT(_key_call, u16_string)
#define EXPECT_CALL_IS_TEXT_METHOD_CALL(_key_call, json_string)
std::list< KeyStateChange > state_changes_afterwards
std::vector< KeyCall > key_calls
KeyStateChange key_state_change
Win32Message expected_forged_message
enum flutter::testing::@98::KeyboardChange::Type type
#define EXPECT_CALL_IS_EVENT(_key_call, _type, _physical, _logical, _character, _synthesized)
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