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),
349 void OnText(
const std::u16string&
text)
override {
350 on_key_call_(KeyCall{
351 .type = KeyCall::kKeyCallOnText,
357 std::function<void(KeyCall)> on_key_call_;
364 using ResponseHandler =
368 : callback_handler_(RespondValue(false)),
369 map_virtual_key_layout_(LayoutDefault) {
370 engine_ = GetTestEngine(context);
371 view_ = std::make_unique<TestFlutterWindowsView>(
375 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>(),
376 [
this](KeyCall key_call) { key_calls.push_back(key_call); });
378 EngineModifier modifier{engine_.get()};
379 modifier.SetImplicitView(view_.get());
380 modifier.InitializeKeyboard();
382 window_ = std::make_unique<MockKeyboardManagerDelegate>(
383 view_.get(), [
this](
UINT virtual_key) ->
SHORT {
384 return map_virtual_key_layout_(virtual_key, MAPVK_VK_TO_CHAR);
388 TestFlutterWindowsView& GetView() {
return *view_; }
389 MockKeyboardManagerDelegate& GetWindow() {
return *window_; }
392 void ResetKeyboard() { EngineModifier{engine_.get()}.Restart(); }
395 void Responding(
bool response) { callback_handler_ = RespondValue(response); }
405 callback_handler_ = std::move(
handler);
408 void SetLayout(MapVirtualKeyLayout layout) {
409 map_virtual_key_layout_ = layout ==
nullptr ? LayoutDefault : layout;
412 void InjectKeyboardChanges(std::vector<KeyboardChange> changes) {
414 window_->InjectKeyboardChanges(std::move(changes));
418 void InjectPlatformMessage(
const char*
channel,
421 rapidjson::Document args_doc;
422 args_doc.Parse(
args);
425 rapidjson::Document message_doc(rapidjson::kObjectType);
426 auto&
allocator = message_doc.GetAllocator();
427 message_doc.AddMember(
"method", rapidjson::Value(method,
allocator),
429 message_doc.AddMember(
"args", args_doc,
allocator);
431 rapidjson::StringBuffer
buffer;
432 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
433 message_doc.Accept(writer);
435 std::unique_ptr<std::vector<uint8_t>>
data =
445 view_->GetEngine()->HandlePlatformMessage(&
message);
450 size_t RedispatchedMessageCountAndClear() {
451 auto& messages = window_->RedispatchedMessages();
452 size_t count = messages.size();
457 void clear_key_calls() {
459 if (key_call.type == KeyCall::kKeyCallOnKey &&
460 key_call.key_event.character !=
nullptr) {
461 delete[] key_call.key_event.character;
470 std::unique_ptr<FlutterWindowsEngine> engine_;
471 std::unique_ptr<TestFlutterWindowsView> view_;
472 std::unique_ptr<MockKeyboardManagerDelegate> window_;
474 MapVirtualKeyLayout map_virtual_key_layout_;
479 std::unique_ptr<FlutterWindowsEngine> GetTestEngine(
480 WindowsTestContext& context) {
481 FlutterWindowsEngineBuilder builder{context};
483 builder.SetCreateKeyboardHandlerCallbacks(
484 [
this](
int virtual_key) ->
SHORT {
487 return window_ ? window_->GetKeyState(virtual_key) : 0;
490 return map_virtual_key_layout_(
491 virtual_key,
extended ? MAPVK_VK_TO_VSC_EX : MAPVK_VK_TO_VSC);
494 auto engine = builder.Build();
496 EngineModifier modifier(
engine.get());
498 auto key_response_controller =
499 std::make_shared<MockKeyResponseController>();
500 key_response_controller->SetEmbedderResponse(
505 clone_event.
character =
event->character ==
nullptr
509 .type = KeyCall::kKeyCallOnKey,
510 .key_event = clone_event,
514 key_response_controller->SetTextInputResponse(
516 key_calls](std::unique_ptr<rapidjson::Document> document) {
517 rapidjson::StringBuffer buffer;
518 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
519 document->Accept(writer);
521 .type = KeyCall::kKeyCallTextMethodCall,
522 .text_method_call = buffer.GetString(),
544class KeyboardTest :
public WindowsTest {
546 KeyboardTest() =
default;
547 virtual ~KeyboardTest() =
default;
558#define EXPECT_CALL_IS_EVENT(_key_call, _type, _physical, _logical, \
559 _character, _synthesized) \
560 EXPECT_EQ(_key_call.type, KeyCall::kKeyCallOnKey); \
561 EXPECT_EVENT_EQUALS(_key_call.key_event, _type, _physical, _logical, \
562 _character, _synthesized);
564#define EXPECT_CALL_IS_TEXT(_key_call, u16_string) \
565 EXPECT_EQ(_key_call.type, KeyCall::kKeyCallOnText); \
566 EXPECT_EQ(_key_call.text, u16_string);
568#define EXPECT_CALL_IS_TEXT_METHOD_CALL(_key_call, json_string) \
569 EXPECT_EQ(_key_call.type, KeyCall::kKeyCallTextMethodCall); \
570 EXPECT_STREQ(_key_call.text_method_call.c_str(), json_string);
573 KeyboardTester tester{GetContext()};
574 tester.Responding(
true);
579 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
585 EXPECT_EQ(tester.key_calls.size(), 1);
587 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
588 tester.clear_key_calls();
589 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
592 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
596 EXPECT_EQ(tester.key_calls.size(), 1);
598 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
599 tester.clear_key_calls();
600 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
603TEST_F(KeyboardTest, LowerCaseAUnhandled) {
604 KeyboardTester tester{GetContext()};
605 tester.Responding(
false);
610 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
616 EXPECT_EQ(tester.key_calls.size(), 2);
618 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
620 tester.clear_key_calls();
621 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
624 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
628 EXPECT_EQ(tester.key_calls.size(), 1);
630 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
631 tester.clear_key_calls();
632 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
636 KeyboardTester tester{GetContext()};
637 tester.Responding(
true);
642 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
646 EXPECT_EQ(tester.key_calls.size(), 1);
648 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
650 tester.clear_key_calls();
651 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
654 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
658 EXPECT_EQ(tester.key_calls.size(), 1);
660 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
662 tester.clear_key_calls();
663 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
666TEST_F(KeyboardTest, ArrowLeftUnhandled) {
667 KeyboardTester tester{GetContext()};
668 tester.Responding(
false);
673 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
677 EXPECT_EQ(tester.key_calls.size(), 1);
679 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
681 tester.clear_key_calls();
682 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
685 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
689 EXPECT_EQ(tester.key_calls.size(), 1);
691 kPhysicalArrowLeft, kLogicalArrowLeft,
"",
693 tester.clear_key_calls();
694 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
697TEST_F(KeyboardTest, ShiftLeftUnhandled) {
698 KeyboardTester tester{GetContext()};
699 tester.Responding(
false);
704 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
705 KeyStateChange{VK_LSHIFT,
true,
false},
709 EXPECT_EQ(tester.key_calls.size(), 1);
711 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
713 tester.clear_key_calls();
714 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
717 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
721 EXPECT_EQ(tester.key_calls.size(), 1);
723 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
725 tester.clear_key_calls();
726 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
729 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
730 KeyStateChange{VK_LSHIFT,
false,
true},
734 EXPECT_EQ(tester.key_calls.size(), 1);
736 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
738 tester.clear_key_calls();
739 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
742TEST_F(KeyboardTest, ShiftRightUnhandled) {
743 KeyboardTester tester{GetContext()};
744 tester.Responding(
false);
749 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
750 KeyStateChange{VK_RSHIFT,
true,
false},
754 EXPECT_EQ(tester.key_calls.size(), 1);
756 kPhysicalShiftRight, kLogicalShiftRight,
"",
758 tester.clear_key_calls();
759 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
762 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
763 KeyStateChange{VK_RSHIFT,
false,
true},
767 EXPECT_EQ(tester.key_calls.size(), 1);
769 kPhysicalShiftRight, kLogicalShiftRight,
"",
771 tester.clear_key_calls();
772 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
776 KeyboardTester tester{GetContext()};
777 tester.Responding(
false);
782 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
783 KeyStateChange{VK_LCONTROL,
true,
false},
787 EXPECT_EQ(tester.key_calls.size(), 1);
789 kPhysicalControlLeft, kLogicalControlLeft,
"",
791 tester.clear_key_calls();
792 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
795 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
796 KeyStateChange{VK_LCONTROL,
false,
true},
800 EXPECT_EQ(tester.key_calls.size(), 1);
802 kPhysicalControlLeft, kLogicalControlLeft,
"",
804 tester.clear_key_calls();
805 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
808TEST_F(KeyboardTest, CtrlRightUnhandled) {
809 KeyboardTester tester{GetContext()};
810 tester.Responding(
false);
815 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
816 KeyStateChange{VK_RCONTROL,
true,
false},
820 EXPECT_EQ(tester.key_calls.size(), 1);
822 kPhysicalControlRight, kLogicalControlRight,
"",
824 tester.clear_key_calls();
825 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
828 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
829 KeyStateChange{VK_RCONTROL,
false,
true},
833 EXPECT_EQ(tester.key_calls.size(), 1);
835 kPhysicalControlRight, kLogicalControlRight,
"",
837 tester.clear_key_calls();
838 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
842 KeyboardTester tester{GetContext()};
843 tester.Responding(
false);
848 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
849 KeyStateChange{VK_LMENU,
true,
false},
853 EXPECT_EQ(tester.key_calls.size(), 1);
855 kPhysicalAltLeft, kLogicalAltLeft,
"", kNotSynthesized);
856 tester.clear_key_calls();
858 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
861 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
862 KeyStateChange{VK_LMENU,
false,
true},
866 EXPECT_EQ(tester.key_calls.size(), 1);
868 kPhysicalAltLeft, kLogicalAltLeft,
"", kNotSynthesized);
869 tester.clear_key_calls();
871 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
875 KeyboardTester tester{GetContext()};
876 tester.Responding(
false);
881 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
882 KeyStateChange{VK_RMENU,
true,
false},
886 EXPECT_EQ(tester.key_calls.size(), 1);
888 kPhysicalAltRight, kLogicalAltRight,
"",
890 tester.clear_key_calls();
892 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
895 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
896 KeyStateChange{VK_RMENU,
false,
true},
900 EXPECT_EQ(tester.key_calls.size(), 1);
902 kPhysicalAltRight, kLogicalAltRight,
"",
904 tester.clear_key_calls();
906 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
910 KeyboardTester tester{GetContext()};
911 tester.Responding(
false);
916 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
917 KeyStateChange{VK_LWIN,
true,
false},
921 EXPECT_EQ(tester.key_calls.size(), 1);
923 kPhysicalMetaLeft, kLogicalMetaLeft,
"",
925 tester.clear_key_calls();
926 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
929 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
930 KeyStateChange{VK_LWIN,
false,
true},
933 EXPECT_EQ(tester.key_calls.size(), 1);
935 kPhysicalMetaLeft, kLogicalMetaLeft,
"",
937 tester.clear_key_calls();
938 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
941TEST_F(KeyboardTest, MetaRightUnhandled) {
942 KeyboardTester tester{GetContext()};
943 tester.Responding(
false);
948 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
949 KeyStateChange{VK_RWIN,
true,
false},
953 EXPECT_EQ(tester.key_calls.size(), 1);
955 kPhysicalMetaRight, kLogicalMetaRight,
"",
957 tester.clear_key_calls();
958 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
961 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
962 KeyStateChange{VK_RWIN,
false,
true},
966 EXPECT_EQ(tester.key_calls.size(), 1);
968 kPhysicalMetaRight, kLogicalMetaRight,
"",
970 tester.clear_key_calls();
971 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
976 KeyboardTester tester{GetContext()};
977 tester.Responding(
true);
980 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
987 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
993 EXPECT_EQ(tester.key_calls.size(), 2);
995 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
997 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
998 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
1004TEST_F(KeyboardTest, RestartClearsKeyboardState) {
1005 KeyboardTester tester{GetContext()};
1006 tester.Responding(
true);
1009 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1016 tester.ResetKeyboard();
1020 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1026 EXPECT_EQ(tester.key_calls.size(), 2);
1028 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
1030 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
1031 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
1036TEST_F(KeyboardTest, FreshKeyDownAfterMissedUpIsDelivered) {
1037 KeyboardTester tester{GetContext()};
1038 tester.Responding(
true);
1040 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1044 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1048 ASSERT_EQ(tester.key_calls.size(), 3u);
1050 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
1052 kPhysicalEnter, kLogicalEnter,
"", kSynthesized);
1054 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
1055 tester.clear_key_calls();
1057 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1061 ASSERT_EQ(tester.key_calls.size(), 1u);
1063 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
1064 tester.clear_key_calls();
1065 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0u);
1071 KeyboardTester tester{GetContext()};
1072 tester.Responding(
false);
1077 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1078 KeyStateChange{VK_LSHIFT,
true,
true},
1082 EXPECT_EQ(tester.key_calls.size(), 1);
1084 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
1086 tester.clear_key_calls();
1087 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1090 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1096 EXPECT_EQ(tester.key_calls.size(), 2);
1098 kPhysicalKeyA, kLogicalKeyA,
"A", kNotSynthesized);
1100 tester.clear_key_calls();
1101 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1104 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1105 KeyStateChange{VK_LSHIFT,
false,
true},
1109 EXPECT_EQ(tester.key_calls.size(), 1);
1111 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
1113 tester.clear_key_calls();
1114 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1117 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1121 EXPECT_EQ(tester.key_calls.size(), 1);
1123 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
1124 tester.clear_key_calls();
1125 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1131 KeyboardTester tester{GetContext()};
1132 tester.Responding(
false);
1137 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1138 KeyStateChange{VK_LCONTROL,
true,
true},
1142 EXPECT_EQ(tester.key_calls.size(), 1);
1144 kPhysicalControlLeft, kLogicalControlLeft,
"",
1146 tester.clear_key_calls();
1147 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1150 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1156 EXPECT_EQ(tester.key_calls.size(), 1);
1158 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
1159 tester.clear_key_calls();
1160 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1163 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1167 EXPECT_EQ(tester.key_calls.size(), 1);
1169 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
1170 tester.clear_key_calls();
1171 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1174 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1175 KeyStateChange{VK_LCONTROL,
false,
true},
1179 EXPECT_EQ(tester.key_calls.size(), 1);
1181 kPhysicalControlLeft, kLogicalControlLeft,
"",
1183 tester.clear_key_calls();
1184 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1189 KeyboardTester tester{GetContext()};
1190 tester.Responding(
false);
1195 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1196 KeyStateChange{VK_LCONTROL,
true,
true},
1200 EXPECT_EQ(tester.key_calls.size(), 1);
1202 kPhysicalControlLeft, kLogicalControlLeft,
"",
1204 tester.clear_key_calls();
1205 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1208 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1212 EXPECT_EQ(tester.key_calls.size(), 1);
1214 kPhysicalDigit1, kLogicalDigit1,
"", kNotSynthesized);
1215 tester.clear_key_calls();
1216 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1219 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1223 EXPECT_EQ(tester.key_calls.size(), 1);
1225 kPhysicalDigit1, kLogicalDigit1,
"", kNotSynthesized);
1226 tester.clear_key_calls();
1227 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1230 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1231 KeyStateChange{VK_LCONTROL,
false,
true},
1235 EXPECT_EQ(tester.key_calls.size(), 1);
1237 kPhysicalControlLeft, kLogicalControlLeft,
"",
1239 tester.clear_key_calls();
1240 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1246 KeyboardTester tester{GetContext()};
1247 tester.Responding(
false);
1249 tester.SetLayout(LayoutFrench);
1252 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1258 EXPECT_EQ(tester.key_calls.size(), 2);
1260 kPhysicalDigit1, kLogicalDigit1,
"&", kNotSynthesized);
1262 tester.clear_key_calls();
1263 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1266 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1270 EXPECT_EQ(tester.key_calls.size(), 1);
1272 kPhysicalDigit1, kLogicalDigit1,
"", kNotSynthesized);
1273 tester.clear_key_calls();
1274 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1279 KeyboardTester tester{GetContext()};
1280 tester.Responding(
false);
1285 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1286 KeyStateChange{VK_LCONTROL,
true,
true},
1289 KeyStateChange{VK_RMENU,
true,
true},
1293 EXPECT_EQ(tester.key_calls.size(), 2);
1295 kPhysicalControlLeft, kLogicalControlLeft,
"",
1298 kPhysicalAltRight, kLogicalAltRight,
"",
1300 tester.clear_key_calls();
1301 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1304 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1310 EXPECT_EQ(tester.key_calls.size(), 2);
1312 kPhysicalKeyQ, kLogicalKeyQ,
"@", kNotSynthesized);
1314 tester.clear_key_calls();
1315 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1318 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1322 EXPECT_EQ(tester.key_calls.size(), 1);
1324 kPhysicalKeyQ, kLogicalKeyQ,
"", kNotSynthesized);
1325 tester.clear_key_calls();
1326 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1331 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1332 KeyStateChange{VK_LCONTROL,
false,
true},
1333 ExpectForgedMessage{
1336 KeyStateChange{VK_RMENU,
false,
true},
1340 EXPECT_EQ(tester.key_calls.size(), 2);
1342 kPhysicalControlLeft, kLogicalControlLeft,
"",
1345 kPhysicalAltRight, kLogicalAltRight,
"",
1347 tester.clear_key_calls();
1349 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1366 KeyboardTester tester{GetContext()};
1367 tester.Responding(
false);
1373 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1374 KeyStateChange{VK_LCONTROL,
true,
true},
1377 KeyStateChange{VK_RMENU,
true,
true},
1381 EXPECT_EQ(tester.key_calls.size(), 2);
1383 kPhysicalControlLeft, kLogicalControlLeft,
"",
1386 kPhysicalAltRight, kLogicalAltRight,
"",
1388 tester.clear_key_calls();
1389 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1394 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1395 KeyStateChange{VK_LCONTROL,
false,
true},
1396 ExpectForgedMessage{
1399 KeyStateChange{VK_RMENU,
false,
true},
1402 EXPECT_EQ(tester.key_calls.size(), 2);
1404 kPhysicalControlLeft, kLogicalControlLeft,
"",
1407 kPhysicalAltRight, kLogicalAltRight,
"",
1409 tester.clear_key_calls();
1411 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1415 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1416 KeyStateChange{VK_LCONTROL,
true,
false},
1419 KeyStateChange{VK_RMENU,
true,
true},
1423 EXPECT_EQ(tester.key_calls.size(), 2);
1425 kPhysicalControlLeft, kLogicalControlLeft,
"",
1428 kPhysicalAltRight, kLogicalAltRight,
"",
1430 tester.clear_key_calls();
1431 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1436 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1437 KeyStateChange{VK_LCONTROL,
false,
false},
1438 ExpectForgedMessage{
1441 KeyStateChange{VK_RMENU,
false,
false},
1444 EXPECT_EQ(tester.key_calls.size(), 2);
1446 kPhysicalControlLeft, kLogicalControlLeft,
"",
1449 kPhysicalAltRight, kLogicalAltRight,
"",
1451 tester.clear_key_calls();
1453 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1456 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1459 EXPECT_EQ(tester.key_calls.size(), 1);
1462 tester.clear_key_calls();
1463 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
1469 KeyboardTester tester{GetContext()};
1470 tester.Responding(
false);
1472 tester.SetLayout(LayoutFrench);
1475 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1481 EXPECT_EQ(tester.key_calls.size(), 1);
1483 kPhysicalBracketLeft, kLogicalBracketRight,
"^",
1485 tester.clear_key_calls();
1486 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1489 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1493 EXPECT_EQ(tester.key_calls.size(), 1);
1495 kPhysicalBracketLeft, kLogicalBracketRight,
"",
1497 tester.clear_key_calls();
1498 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1501 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1507 EXPECT_EQ(tester.key_calls.size(), 2);
1509 kPhysicalKeyE, kLogicalKeyE,
"ê", kNotSynthesized);
1511 tester.clear_key_calls();
1512 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1515 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1519 EXPECT_EQ(tester.key_calls.size(), 1);
1521 kPhysicalKeyE, kLogicalKeyE,
"", kNotSynthesized);
1522 tester.clear_key_calls();
1523 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1531TEST_F(KeyboardTest, DeadKeyWithoutDeadMaskThatCombines) {
1532 KeyboardTester tester{GetContext()};
1533 tester.Responding(
false);
1536 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1537 KeyStateChange{VK_LSHIFT,
true,
true},
1541 EXPECT_EQ(tester.key_calls.size(), 1);
1543 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
1545 tester.clear_key_calls();
1546 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1549 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1555 EXPECT_EQ(tester.key_calls.size(), 1);
1557 kPhysicalDigit6, kLogicalDigit6,
"6", kNotSynthesized);
1558 tester.clear_key_calls();
1559 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1562 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1565 EXPECT_EQ(tester.key_calls.size(), 1);
1567 kPhysicalDigit6, kLogicalDigit6,
"", kNotSynthesized);
1568 tester.clear_key_calls();
1569 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1572 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1573 KeyStateChange{VK_LSHIFT,
false,
true},
1577 EXPECT_EQ(tester.key_calls.size(), 1);
1579 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
1581 tester.clear_key_calls();
1582 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1585 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1591 EXPECT_EQ(tester.key_calls.size(), 2);
1593 kPhysicalKeyE, kLogicalKeyE,
"ê", kNotSynthesized);
1595 tester.clear_key_calls();
1596 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1599 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1603 EXPECT_EQ(tester.key_calls.size(), 1);
1605 kPhysicalKeyE, kLogicalKeyE,
"", kNotSynthesized);
1606 tester.clear_key_calls();
1607 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1612TEST_F(KeyboardTest, DeadKeyThatDoesNotCombine) {
1613 KeyboardTester tester{GetContext()};
1614 tester.Responding(
false);
1616 tester.SetLayout(LayoutFrench);
1619 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1625 EXPECT_EQ(tester.key_calls.size(), 1);
1627 kPhysicalBracketLeft, kLogicalBracketRight,
"^",
1629 tester.clear_key_calls();
1630 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1633 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1637 EXPECT_EQ(tester.key_calls.size(), 1);
1639 kPhysicalBracketLeft, kLogicalBracketRight,
"",
1641 tester.clear_key_calls();
1642 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1645 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1653 EXPECT_EQ(tester.key_calls.size(), 3);
1655 kPhysicalDigit1, kLogicalDigit1,
"^", kNotSynthesized);
1658 tester.clear_key_calls();
1664 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1667 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1671 EXPECT_EQ(tester.key_calls.size(), 1);
1673 kPhysicalDigit1, kLogicalDigit1,
"", kNotSynthesized);
1674 tester.clear_key_calls();
1675 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1681TEST_F(KeyboardTest, DeadKeyTwiceThenLetter) {
1682 KeyboardTester tester{GetContext()};
1683 tester.Responding(
false);
1688 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1694 EXPECT_EQ(tester.key_calls.size(), 1);
1696 kPhysicalBackquote, kLogicalBackquote,
"`",
1698 tester.clear_key_calls();
1699 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1702 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1706 EXPECT_EQ(tester.key_calls.size(), 1);
1708 kPhysicalBackquote, kLogicalBackquote,
"",
1710 tester.clear_key_calls();
1711 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1715 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
1716 tester.LateResponding(
1717 [&recorded_callbacks](
1720 recorded_callbacks.push_back(
callback);
1723 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1732 EXPECT_EQ(recorded_callbacks.size(), 1);
1733 EXPECT_EQ(tester.key_calls.size(), 1);
1735 kPhysicalBackquote, kLogicalBackquote,
"`",
1737 tester.clear_key_calls();
1739 recorded_callbacks.front()(
false);
1740 EXPECT_EQ(tester.key_calls.size(), 2);
1743 tester.clear_key_calls();
1747 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
1749 tester.Responding(
false);
1752 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1756 EXPECT_EQ(tester.key_calls.size(), 1);
1758 kPhysicalBackquote, kLogicalBackquote,
"",
1760 tester.clear_key_calls();
1761 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1766 KeyboardTester tester{GetContext()};
1767 tester.Responding(
false);
1773 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1781 const char* st = tester.key_calls[0].key_event.character;
1783 EXPECT_EQ(tester.key_calls.size(), 2);
1785 kPhysicalKeyW, kLogicalKeyW,
"𐍅", kNotSynthesized);
1787 tester.clear_key_calls();
1788 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 3);
1791 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1795 EXPECT_EQ(tester.key_calls.size(), 1);
1797 kPhysicalKeyW, kLogicalKeyW,
"", kNotSynthesized);
1798 tester.clear_key_calls();
1799 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1803 KeyboardTester tester{GetContext()};
1804 tester.Responding(
false);
1815 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1816 KeyStateChange{VK_LSHIFT,
true,
true}, event1});
1817 EXPECT_EQ(tester.key_calls.size(), 2);
1819 kPhysicalShiftLeft, kLogicalShiftLeft,
"", kSynthesized);
1820 tester.clear_key_calls();
1821 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1823 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1824 KeyStateChange{VK_LSHIFT,
false,
true}, event2});
1825 EXPECT_EQ(tester.key_calls.size(), 2);
1827 kPhysicalShiftLeft, kLogicalShiftLeft,
"", kSynthesized);
1828 tester.clear_key_calls();
1829 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1832 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1833 KeyStateChange{VK_RSHIFT,
true,
true}, event1});
1834 EXPECT_EQ(tester.key_calls.size(), 2);
1836 kPhysicalShiftRight, kLogicalShiftRight,
"",
1838 tester.clear_key_calls();
1839 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1841 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1842 KeyStateChange{VK_RSHIFT,
false,
true}, event2});
1843 EXPECT_EQ(tester.key_calls.size(), 2);
1845 kPhysicalShiftRight, kLogicalShiftRight,
"",
1847 tester.clear_key_calls();
1848 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1851 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1852 KeyStateChange{VK_LCONTROL,
true,
true}, event1});
1853 EXPECT_EQ(tester.key_calls.size(), 2);
1855 kPhysicalControlLeft, kLogicalControlLeft,
"",
1857 tester.clear_key_calls();
1858 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1860 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1861 KeyStateChange{VK_LCONTROL,
false,
true}, event2});
1862 EXPECT_EQ(tester.key_calls.size(), 2);
1864 kPhysicalControlLeft, kLogicalControlLeft,
"",
1866 tester.clear_key_calls();
1867 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1870 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1871 KeyStateChange{VK_RCONTROL,
true,
true}, event1});
1872 EXPECT_EQ(tester.key_calls.size(), 2);
1874 kPhysicalControlRight, kLogicalControlRight,
"",
1876 tester.clear_key_calls();
1877 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1879 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1880 KeyStateChange{VK_RCONTROL,
false,
true}, event2});
1881 EXPECT_EQ(tester.key_calls.size(), 2);
1883 kPhysicalControlRight, kLogicalControlRight,
"",
1885 tester.clear_key_calls();
1886 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1889 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1890 KeyStateChange{VK_LMENU,
true,
true}, event1});
1891 EXPECT_EQ(tester.key_calls.size(), 2);
1893 kPhysicalAltLeft, kLogicalAltLeft,
"", kSynthesized);
1894 tester.clear_key_calls();
1895 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1897 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1898 KeyStateChange{VK_LMENU,
false,
true}, event2});
1899 EXPECT_EQ(tester.key_calls.size(), 2);
1901 kPhysicalAltLeft, kLogicalAltLeft,
"", kSynthesized);
1902 tester.clear_key_calls();
1903 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1906 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1907 KeyStateChange{VK_RMENU,
true,
true}, event1});
1908 EXPECT_EQ(tester.key_calls.size(), 2);
1910 kPhysicalAltRight, kLogicalAltRight,
"", kSynthesized);
1911 tester.clear_key_calls();
1912 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1914 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1915 KeyStateChange{VK_RMENU,
false,
true}, event2});
1916 EXPECT_EQ(tester.key_calls.size(), 2);
1918 kPhysicalAltRight, kLogicalAltRight,
"", kSynthesized);
1919 tester.clear_key_calls();
1920 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1923 tester.InjectKeyboardChanges(
1924 std::vector<KeyboardChange>{KeyStateChange{VK_LWIN,
true,
true}, event1});
1925 EXPECT_EQ(tester.key_calls.size(), 2);
1927 kPhysicalMetaLeft, kLogicalMetaLeft,
"", kSynthesized);
1928 tester.clear_key_calls();
1929 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1931 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1932 KeyStateChange{VK_LWIN,
false,
true}, event2});
1933 EXPECT_EQ(tester.key_calls.size(), 2);
1935 kPhysicalMetaLeft, kLogicalMetaLeft,
"", kSynthesized);
1936 tester.clear_key_calls();
1937 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1940 tester.InjectKeyboardChanges(
1941 std::vector<KeyboardChange>{KeyStateChange{VK_RWIN,
true,
true}, event1});
1942 EXPECT_EQ(tester.key_calls.size(), 2);
1944 kPhysicalMetaRight, kLogicalMetaRight,
"", kSynthesized);
1945 tester.clear_key_calls();
1946 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1948 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1949 KeyStateChange{VK_RWIN,
false,
true}, event2});
1950 EXPECT_EQ(tester.key_calls.size(), 2);
1952 kPhysicalMetaRight, kLogicalMetaRight,
"", kSynthesized);
1953 tester.clear_key_calls();
1954 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1958 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1959 KeyStateChange{VK_CAPITAL,
false,
true}, event1});
1960 EXPECT_EQ(tester.key_calls.size(), 3);
1962 kPhysicalCapsLock, kLogicalCapsLock,
"", kSynthesized);
1964 kPhysicalCapsLock, kLogicalCapsLock,
"", kSynthesized);
1965 tester.clear_key_calls();
1966 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1968 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1969 KeyStateChange{VK_CAPITAL,
false,
false}, event2});
1970 EXPECT_EQ(tester.key_calls.size(), 3);
1972 kPhysicalCapsLock, kLogicalCapsLock,
"", kSynthesized);
1974 kPhysicalCapsLock, kLogicalCapsLock,
"", kSynthesized);
1975 tester.clear_key_calls();
1976 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1979 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1980 KeyStateChange{VK_SCROLL,
true,
true}, event1});
1981 EXPECT_EQ(tester.key_calls.size(), 2);
1983 kPhysicalScrollLock, kLogicalScrollLock,
"",
1985 tester.clear_key_calls();
1986 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
1988 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
1989 KeyStateChange{VK_SCROLL,
true,
false}, event2});
1990 EXPECT_EQ(tester.key_calls.size(), 3);
1992 kPhysicalScrollLock, kLogicalScrollLock,
"",
1995 kPhysicalScrollLock, kLogicalScrollLock,
"",
1997 tester.clear_key_calls();
1998 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2001 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2002 KeyStateChange{VK_NUMLOCK,
true,
false}, event1});
2007 EXPECT_EQ(tester.key_calls.size(), 2);
2009 kPhysicalNumLock, kLogicalNumLock,
"", kSynthesized);
2010 tester.clear_key_calls();
2011 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2013 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2014 KeyStateChange{VK_NUMLOCK,
false,
true}, event2});
2015 EXPECT_EQ(tester.key_calls.size(), 4);
2017 kPhysicalNumLock, kLogicalNumLock,
"", kSynthesized);
2019 kPhysicalNumLock, kLogicalNumLock,
"", kSynthesized);
2021 kPhysicalNumLock, kLogicalNumLock,
"", kSynthesized);
2022 tester.clear_key_calls();
2023 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2030TEST_F(KeyboardTest, ImeExtendedEventsAreIgnored) {
2031 KeyboardTester tester{GetContext()};
2032 tester.Responding(
false);
2040 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2041 KeyStateChange{VK_RCONTROL,
true,
false},
2045 EXPECT_EQ(tester.key_calls.size(), 1);
2048 tester.clear_key_calls();
2049 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2058TEST_F(KeyboardTest, UpOnlyImeEventsAreCorrectlyHandled) {
2059 KeyboardTester tester{GetContext()};
2060 tester.Responding(
true);
2065 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2066 KeyStateChange{VK_LSHIFT,
true,
false},
2071 KeyStateChange{VK_LSHIFT,
false,
true},
2077 EXPECT_EQ(tester.key_calls.size(), 4);
2079 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
2084 kPhysicalShiftLeft, kLogicalShiftLeft,
"",
2088 tester.clear_key_calls();
2098 KeyboardTester tester{GetContext()};
2100 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
2103 tester.LateResponding(
2104 [&recorded_callbacks](
2107 recorded_callbacks.push_back(
callback);
2111 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2118 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2124 EXPECT_EQ(tester.key_calls.size(), 1);
2126 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2127 EXPECT_EQ(recorded_callbacks.size(), 1);
2128 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2131 recorded_callbacks.front()(
false);
2133 EXPECT_EQ(tester.key_calls.size(), 3);
2134 EXPECT_EQ(recorded_callbacks.size(), 2);
2137 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2138 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2141 recorded_callbacks.back()(
false);
2143 EXPECT_EQ(tester.key_calls.size(), 4);
2145 tester.clear_key_calls();
2146 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2160TEST_F(KeyboardTest, SlowFrameworkResponseForIdenticalEvents) {
2161 KeyboardTester tester{GetContext()};
2162 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
2165 tester.LateResponding(
2166 [&recorded_callbacks](
2169 recorded_callbacks.push_back(
callback);
2173 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2179 EXPECT_EQ(tester.key_calls.size(), 1);
2181 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2182 tester.clear_key_calls();
2183 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2186 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2190 EXPECT_EQ(tester.key_calls.size(), 0);
2191 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2194 EXPECT_EQ(recorded_callbacks.size(), 1);
2195 recorded_callbacks.front()(
false);
2197 EXPECT_EQ(tester.key_calls.size(), 2);
2200 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
2201 tester.clear_key_calls();
2202 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2205 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2213 EXPECT_EQ(recorded_callbacks.size(), 2);
2214 EXPECT_EQ(tester.key_calls.size(), 0);
2215 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2219 recorded_callbacks.back()(
false);
2220 EXPECT_EQ(tester.key_calls.size(), 1);
2222 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2223 tester.clear_key_calls();
2224 EXPECT_EQ(recorded_callbacks.size(), 3);
2225 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2228 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2232 EXPECT_EQ(tester.key_calls.size(), 0);
2233 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2237 KeyboardTester tester{GetContext()};
2238 tester.Responding(
false);
2242 tester.InjectPlatformMessage(
2243 "flutter/textinput",
"TextInput.setClient",
2244 R
"|([108, {"inputAction": "TextInputAction.none", "viewId": 0}])|");
2247 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2253 EXPECT_EQ(tester.key_calls.size(), 2);
2255 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
2257 tester.key_calls[1],
2259 R
"|("method":"TextInputClient.performAction",)|"
2260 R"|("args":[108,"TextInputAction.none"])|"
2262 tester.clear_key_calls();
2263 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2266 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2270 EXPECT_EQ(tester.key_calls.size(), 1);
2272 kPhysicalEnter, kLogicalEnter,
"", kNotSynthesized);
2273 tester.clear_key_calls();
2274 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2281 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2287 EXPECT_EQ(tester.key_calls.size(), 2);
2289 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2291 tester.clear_key_calls();
2294 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2298 EXPECT_EQ(tester.key_calls.size(), 1);
2300 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
2301 tester.clear_key_calls();
2304TEST_F(KeyboardTest, VietnameseTelexAddDiacriticWithFastResponse) {
2314 KeyboardTester tester{GetContext()};
2315 tester.Responding(
false);
2320 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2326 EXPECT_EQ(tester.key_calls.size(), 2);
2328 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2330 tester.clear_key_calls();
2331 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2334 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2338 EXPECT_EQ(tester.key_calls.size(), 1);
2340 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
2341 tester.clear_key_calls();
2342 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2347 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2358 EXPECT_EQ(tester.key_calls.size(), 3);
2360 kPhysicalBackspace, kLogicalBackspace,
"",
2363 kPhysicalBackspace, kLogicalBackspace,
"",
2366 tester.clear_key_calls();
2372 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 3);
2375 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2380 EXPECT_EQ(tester.key_calls.size(), 1);
2383 tester.clear_key_calls();
2384 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2388 bool backspace_response) {
2398 KeyboardTester tester{context};
2399 tester.Responding(
false);
2404 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2410 EXPECT_EQ(tester.key_calls.size(), 2);
2412 kPhysicalKeyA, kLogicalKeyA,
"a", kNotSynthesized);
2414 tester.clear_key_calls();
2415 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 2);
2418 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2422 EXPECT_EQ(tester.key_calls.size(), 1);
2424 kPhysicalKeyA, kLogicalKeyA,
"", kNotSynthesized);
2425 tester.clear_key_calls();
2426 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2428 std::vector<MockKeyResponseController::ResponseCallback> recorded_callbacks;
2429 tester.LateResponding(
2430 [&recorded_callbacks](
2433 recorded_callbacks.push_back(
callback);
2439 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2455 EXPECT_EQ(tester.key_calls.size(), 1);
2457 kPhysicalBackspace, kLogicalBackspace,
"",
2459 tester.clear_key_calls();
2460 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2462 EXPECT_EQ(recorded_callbacks.size(), 1);
2463 recorded_callbacks[0](backspace_response);
2465 EXPECT_EQ(tester.key_calls.size(), 1);
2467 kPhysicalBackspace, kLogicalBackspace,
"",
2469 tester.clear_key_calls();
2470 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(),
2471 backspace_response ? 0 : 2);
2473 recorded_callbacks[1](
false);
2474 EXPECT_EQ(tester.key_calls.size(), 1);
2476 tester.clear_key_calls();
2477 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 1);
2479 tester.Responding(
false);
2482 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2487 EXPECT_EQ(tester.key_calls.size(), 1);
2490 tester.clear_key_calls();
2491 EXPECT_EQ(tester.RedispatchedMessageCountAndClear(), 0);
2494TEST_F(KeyboardTest, VietnameseTelexAddDiacriticWithSlowFalseResponse) {
2498TEST_F(KeyboardTest, VietnameseTelexAddDiacriticWithSlowTrueResponse) {
2505 KeyboardTester tester{GetContext()};
2506 tester.Responding(
false);
2508 tester.InjectKeyboardChanges(std::vector<KeyboardChange>{
2512 tester.clear_key_calls();
static const JsonMessageCodec & GetInstance()
virtual void RedispatchEvent(std::unique_ptr< PendingEvent > event)
std::unique_ptr< std::vector< uint8_t > > EncodeMessage(const T &message) const
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
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
union flutter::testing::@2836::KeyboardChange::@77 content
Win32Message expected_forged_message
#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)