21#include "gmock/gmock.h"
22#include "gtest/gtest.h"
23#include "rapidjson/stringbuffer.h"
24#include "rapidjson/writer.h"
40constexpr SHORT kStateMaskToggled = 0x01;
41constexpr SHORT kStateMaskPressed = 0x80;
43constexpr uint64_t kScanCodeBackquote = 0x29;
45constexpr uint64_t kScanCodeKeyB = 0x30;
46constexpr uint64_t kScanCodeKeyE = 0x12;
47constexpr uint64_t kScanCodeKeyF = 0x21;
48constexpr uint64_t kScanCodeKeyO = 0x18;
49constexpr uint64_t kScanCodeKeyQ = 0x10;
50constexpr uint64_t kScanCodeKeyW = 0x11;
51constexpr uint64_t kScanCodeDigit1 = 0x02;
52constexpr uint64_t kScanCodeDigit2 = 0x03;
53constexpr uint64_t kScanCodeDigit6 = 0x07;
56constexpr uint64_t kScanCodeControl = 0x1d;
57constexpr uint64_t kScanCodeMetaLeft = 0x5b;
58constexpr uint64_t kScanCodeMetaRight = 0x5c;
59constexpr uint64_t kScanCodeAlt = 0x38;
62constexpr uint64_t kScanCodeBracketLeft = 0x1a;
63constexpr uint64_t kScanCodeArrowLeft = 0x4b;
64constexpr uint64_t kScanCodeEnter = 0x1c;
65constexpr uint64_t kScanCodeBackspace = 0x0e;
67constexpr uint64_t kVirtualDigit1 = 0x31;
69constexpr uint64_t kVirtualKeyB = 0x42;
70constexpr uint64_t kVirtualKeyE = 0x45;
71constexpr uint64_t kVirtualKeyF = 0x46;
72constexpr uint64_t kVirtualKeyO = 0x4f;
73constexpr uint64_t kVirtualKeyQ = 0x51;
74constexpr uint64_t kVirtualKeyW = 0x57;
76constexpr bool kSynthesized =
true;
77constexpr bool kNotSynthesized =
false;
79typedef UINT (*MapVirtualKeyLayout)(
UINT uCode,
UINT uMapType);
80typedef std::function<
UINT(
UINT)> MapVirtualKeyToChar;
83 return MapVirtualKey(uCode, uMapType);
88 case MAPVK_VK_TO_CHAR:
93 return MapVirtualKey(uCode, MAPVK_VK_TO_CHAR);
96 return MapVirtualKey(uCode, uMapType);
100class 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 {
110 <<
"RedispatchEvent called while already redispatching an event";
111 during_redispatch_ =
true;
113 during_redispatch_ =
false;
117 bool during_redispatch_ =
false;
124struct KeyStateChange {
136struct ExpectForgedMessage {
142struct 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_;
184class 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_;
257 UINT wRemoveMsg)
override {
259 wMsgFilterMax, wRemoveMsg);
262 uint32_t Win32MapVkToChar(uint32_t virtual_key)
override {
263 return map_vk_to_char_(virtual_key);
270 LPARAM const lparam)
override {
271 return keyboard_manager_->HandleMessage(
message, wparam, lparam)
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);
296 EXPECT_EQ(expectation.message.expected_result,
299 for (
const KeyStateChange& change :
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_;
327 kKeyCallTextMethodCall,
337class 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_;
360 using ResponseHandler =
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); }
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) {
410 window_->InjectKeyboardChanges(std::move(changes));
414 void InjectPlatformMessage(
const char*
channel,
417 rapidjson::Document args_doc;
418 args_doc.Parse(
args);
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 =
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_;
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;
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(
501 clone_event.
character =
event->character ==
nullptr
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(),
540class KeyboardTest :
public WindowsTest {
542 KeyboardTest() =
default;
543 virtual ~KeyboardTest() =
default;
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);
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);
599TEST_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>{
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>{
654 EXPECT_EQ(tester.key_calls.size(), 1);
656 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
658 tester.clear_key_calls();
659 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
662TEST_F(KeyboardTest, ArrowLeftUnhandled) {
663 KeyboardTester tester{GetContext()};
664 tester.Responding(
false);
669 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
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>{
685 EXPECT_EQ(tester.key_calls.size(), 1);
687 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
689 tester.clear_key_calls();
690 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
693TEST_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);
738TEST_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);
772 KeyboardTester tester{GetContext()};
773 tester.Responding(
false);
778 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
779 KeyStateChange{VK_LCONTROL,
true,
false},
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},
796 EXPECT_EQ(tester.key_calls.size(), 1);
798 kPhysicalControlLeft, kLogicalControlLeft,
"",
800 tester.clear_key_calls();
801 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
804TEST_F(KeyboardTest, CtrlRightUnhandled) {
805 KeyboardTester tester{GetContext()};
806 tester.Responding(
false);
811 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
812 KeyStateChange{VK_RCONTROL,
true,
false},
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},
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},
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},
862 EXPECT_EQ(tester.key_calls.size(), 1);
864 kPhysicalAltLeft, kLogicalAltLeft,
"", kNotSynthesized);
865 tester.clear_key_calls();
867 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
871 KeyboardTester tester{GetContext()};
872 tester.Responding(
false);
877 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
878 KeyStateChange{VK_RMENU,
true,
false},
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},
896 EXPECT_EQ(tester.key_calls.size(), 1);
898 kPhysicalAltRight, kLogicalAltRight,
"",
900 tester.clear_key_calls();
902 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
906 KeyboardTester tester{GetContext()};
907 tester.Responding(
false);
912 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
913 KeyStateChange{VK_LWIN,
true,
false},
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},
929 EXPECT_EQ(tester.key_calls.size(), 1);
931 kPhysicalMetaLeft, kLogicalMetaLeft,
"",
933 tester.clear_key_calls();
934 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
937TEST_F(KeyboardTest, MetaRightUnhandled) {
938 KeyboardTester tester{GetContext()};
939 tester.Responding(
false);
944 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
945 KeyStateChange{VK_RWIN,
true,
false},
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},
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>{
989 EXPECT_EQ(tester.key_calls.size(), 2);
991 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
993 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
994 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
1000TEST_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>{
1022 EXPECT_EQ(tester.key_calls.size(), 2);
1024 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
1026 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
1027 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
1032TEST_F(KeyboardTest, FreshKeyDownAfterMissedUpIsDelivered) {
1033 KeyboardTester tester{GetContext()};
1034 tester.Responding(
true);
1036 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1040 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
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>{
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},
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>{
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},
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},
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>{
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>{
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},
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>{
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>{
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},
1285 KeyStateChange{VK_RMENU,
true,
true},
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>{
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>{
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{
1332 KeyStateChange{VK_RMENU,
false,
true},
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},
1373 KeyStateChange{VK_RMENU,
true,
true},
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{
1395 KeyStateChange{VK_RMENU,
false,
true},
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},
1415 KeyStateChange{VK_RMENU,
true,
true},
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{
1437 KeyStateChange{VK_RMENU,
false,
false},
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>{
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>{
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>{
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>{
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>{
1515 EXPECT_EQ(tester.key_calls.size(), 1);
1517 kPhysicalKeyE, kLogicalKeyE,
"", kNotSynthesized);
1518 tester.clear_key_calls();
1519 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1527TEST_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>{
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>{
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>{
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>{
1599 EXPECT_EQ(tester.key_calls.size(), 1);
1601 kPhysicalKeyE, kLogicalKeyE,
"", kNotSynthesized);
1602 tester.clear_key_calls();
1603 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1608TEST_F(KeyboardTest, DeadKeyThatDoesNotCombine) {
1609 KeyboardTester tester{GetContext()};
1610 tester.Responding(
false);
1612 tester.SetLayout(LayoutFrench);
1615 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
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>{
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>{
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>{
1667 EXPECT_EQ(tester.key_calls.size(), 1);
1669 kPhysicalDigit1, kLogicalDigit1,
"", kNotSynthesized);
1670 tester.clear_key_calls();
1671 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1677TEST_F(KeyboardTest, DeadKeyTwiceThenLetter) {
1678 KeyboardTester tester{GetContext()};
1679 tester.Responding(
false);
1684 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
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>{
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](
1716 recorded_callbacks.push_back(
callback);
1719 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
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>{
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>{
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>{
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);
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);
2026TEST_F(KeyboardTest, ImeExtendedEventsAreIgnored) {
2027 KeyboardTester tester{GetContext()};
2028 tester.Responding(
false);
2036 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2037 KeyStateChange{VK_RCONTROL,
true,
false},
2041 EXPECT_EQ(tester.key_calls.size(), 1);
2044 tester.clear_key_calls();
2045 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2054TEST_F(KeyboardTest, UpOnlyImeEventsAreCorrectlyHandled) {
2055 KeyboardTester tester{GetContext()};
2056 tester.Responding(
true);
2061 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2062 KeyStateChange{VK_LSHIFT,
true,
false},
2067 KeyStateChange{VK_LSHIFT,
false,
true},
2073 EXPECT_EQ(tester.key_calls.size(), 4);
2075 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
2080 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
2084 tester.clear_key_calls();
2094 KeyboardTester tester{GetContext()};
2096 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
2099 tester.LateResponding(
2100 [&recorded_callbacks](
2103 recorded_callbacks.push_back(
callback);
2107 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2114 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
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);
2156TEST_F(KeyboardTest, SlowFrameworkResponseForIdenticalEvents) {
2157 KeyboardTester tester{GetContext()};
2158 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
2161 tester.LateResponding(
2162 [&recorded_callbacks](
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>{
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>{
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();
2300TEST_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>{
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>{
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](
2429 recorded_callbacks.push_back(
callback);
2435 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
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>{
2483 EXPECT_EQ(tester.key_calls.size(), 1);
2486 tester.clear_key_calls();
2487 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2490TEST_F(KeyboardTest, VietnameseTelexAddDiacriticWithSlowFalseResponse) {
2494TEST_F(KeyboardTest, VietnameseTelexAddDiacriticWithSlowTrueResponse) {
2501 KeyboardTester tester{GetContext()};
2502 tester.Responding(
false);
2504 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
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
std::function< void(const FlutterKeyEvent *, ResponseCallback)> EmbedderCallbackHandler
std::function< void(bool)> ResponseCallback
BOOL Win32PeekMessage(LPMSG lpMsg, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg)
@ kFlutterKeyEventTypeDown
@ kFlutterKeyEventTypeRepeat
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
const gchar FlBinaryMessengerMessageHandler handler
G_BEGIN_DECLS GBytes * message
FlutterDesktopBinaryReply callback
#define FML_LOG(severity)
#define FML_DCHECK(condition)
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
std::shared_ptr< ImpellerAllocator > allocator
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)
std::list< KeyStateChange > state_changes_afterwards
std::vector< KeyCall > key_calls
KeyStateChange key_state_change
Win32Message expected_forged_message
union flutter::testing::@2827::KeyboardChange::@78 content
#define EXPECT_CALL_IS_EVENT(_key_call, _type, _physical, _logical, _character, _synthesized)
constexpr uint64_t kScanCodeKeyA
TEST_F(DisplayListTest, Defaults)
constexpr LRESULT kWmResultZero
constexpr LRESULT kWmResultDefault
constexpr uint64_t kVirtualKeyA
void MockEmbedderApiForKeyboard(EngineModifier &modifier, std::shared_ptr< MockKeyResponseController > response_controller)
constexpr LRESULT kWmResultDontCheck
char * clone_string(const char *string)
void VietnameseTelexAddDiacriticWithSlowResponse(WindowsTestContext &context, bool backspace_response)
constexpr int64_t kImplicitViewId
constexpr int kScanCodeShiftRight
constexpr int kScanCodeShiftLeft
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not defaults to or::depending on whether ipv6 is specified disable vm Disable the Dart VM Service The Dart VM Service is never available in release mode Bind to the IPv6 localhost address for the Dart VM Service Ignored if vm service host is set profile Make the profiler discard new samples once the profiler sample buffer is full When this flag is not the profiler sample buffer is used as a ring buffer
Win32Message Build(LRESULT expected_result=kWmResultDontCheck)
Win32Message Build(LRESULT expected_result=kWmResultDontCheck)
Win32Message Build(LRESULT expected_result=kWmResultDontCheck)
Win32Message Build(LRESULT expected_result=kWmResultDontCheck)
Win32Message Build(LRESULT expected_result=kWmResultDontCheck)
Win32Message Build(LRESULT expected_result=kWmResultDontCheck)