Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 91b78ee

Browse files
committed
Add missing file
1 parent c911702 commit 91b78ee

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1463,6 +1463,7 @@ FILE: ../../../flutter/shell/platform/windows/flutter_windows_win32.cc
14631463
FILE: ../../../flutter/shell/platform/windows/flutter_windows_winuwp.cc
14641464
FILE: ../../../flutter/shell/platform/windows/key_event_handler.cc
14651465
FILE: ../../../flutter/shell/platform/windows/key_event_handler.h
1466+
FILE: ../../../flutter/shell/platform/windows/key_event_handler_unittests.cc
14661467
FILE: ../../../flutter/shell/platform/windows/keyboard_hook_handler.h
14671468
FILE: ../../../flutter/shell/platform/windows/platform_handler.cc
14681469
FILE: ../../../flutter/shell/platform/windows/platform_handler.h
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
#include "flutter/shell/platform/windows/key_event_handler.h"
5+
6+
#include <rapidjson/document.h>
7+
#include <memory>
8+
9+
#include "flutter/shell/platform/common/cpp/json_message_codec.h"
10+
#include "flutter/shell/platform/windows/flutter_windows_view.h"
11+
#include "flutter/shell/platform/windows/testing/test_binary_messenger.h"
12+
#include "gmock/gmock.h"
13+
#include "gtest/gtest.h"
14+
15+
namespace flutter {
16+
namespace testing {
17+
18+
static constexpr char kScanCodeKey[] = "scanCode";
19+
static constexpr int kHandledScanCode = 20;
20+
static constexpr int kUnhandledScanCode = 21;
21+
22+
std::unique_ptr<std::vector<uint8_t>> CreateResponse(bool handled) {
23+
auto response_doc =
24+
std::make_unique<rapidjson::Document>(rapidjson::kObjectType);
25+
auto& allocator = response_doc->GetAllocator();
26+
response_doc->AddMember("handled", handled, allocator);
27+
return JsonMessageCodec::GetInstance().EncodeMessage(*response_doc);
28+
}
29+
30+
TEST(KeyEventHandlerTest, KeyboardHookHandling) {
31+
auto handled_message = CreateResponse(true);
32+
auto unhandled_message = CreateResponse(false);
33+
int received_scancode = 0;
34+
35+
TestBinaryMessenger messenger(
36+
[&received_scancode, &handled_message, &unhandled_message](
37+
const std::string& channel, const uint8_t* message,
38+
size_t message_size, BinaryReply reply) {
39+
if (channel == "flutter/keyevent") {
40+
auto message_doc = JsonMessageCodec::GetInstance().DecodeMessage(
41+
message, message_size);
42+
received_scancode = (*message_doc)[kScanCodeKey].GetInt();
43+
if (received_scancode == kHandledScanCode) {
44+
reply(handled_message->data(), handled_message->size());
45+
} else {
46+
reply(unhandled_message->data(), unhandled_message->size());
47+
}
48+
}
49+
});
50+
51+
int redispatch_scancode = 0;
52+
KeyEventHandler handler(&messenger,
53+
[&redispatch_scancode](UINT cInputs, LPINPUT pInputs,
54+
int cbSize) -> UINT {
55+
EXPECT_TRUE(cbSize > 0);
56+
redispatch_scancode = pInputs->ki.wScan;
57+
return 1;
58+
});
59+
60+
handler.KeyboardHook(nullptr, 64, kHandledScanCode, WM_KEYDOWN, L'a', false);
61+
EXPECT_EQ(received_scancode, kHandledScanCode);
62+
EXPECT_EQ(redispatch_scancode, 0);
63+
received_scancode = 0;
64+
handler.KeyboardHook(nullptr, 64, kUnhandledScanCode, WM_KEYDOWN, L'b',
65+
false);
66+
EXPECT_EQ(received_scancode, kUnhandledScanCode);
67+
EXPECT_EQ(redispatch_scancode, kUnhandledScanCode);
68+
}
69+
70+
TEST(KeyEventHandlerTest, ExtendedKeysAreSentToRedispatch) {
71+
auto handled_message = CreateResponse(true);
72+
auto unhandled_message = CreateResponse(false);
73+
int received_scancode = 0;
74+
bool is_extended_key = false;
75+
76+
TestBinaryMessenger messenger(
77+
[&received_scancode, &handled_message, &unhandled_message](
78+
const std::string& channel, const uint8_t* message,
79+
size_t message_size, BinaryReply reply) {
80+
if (channel == "flutter/keyevent") {
81+
auto message_doc = JsonMessageCodec::GetInstance().DecodeMessage(
82+
message, message_size);
83+
received_scancode = (*message_doc)[kScanCodeKey].GetInt();
84+
if (received_scancode == kHandledScanCode) {
85+
reply(handled_message->data(), handled_message->size());
86+
} else {
87+
reply(unhandled_message->data(), unhandled_message->size());
88+
}
89+
}
90+
});
91+
92+
int redispatch_scancode = 0;
93+
KeyEventHandler handler(
94+
&messenger,
95+
[&redispatch_scancode, &is_extended_key](UINT cInputs, LPINPUT pInputs,
96+
int cbSize) -> UINT {
97+
EXPECT_TRUE(cbSize > 0);
98+
redispatch_scancode = pInputs->ki.wScan;
99+
is_extended_key = (pInputs->ki.dwFlags & KEYEVENTF_EXTENDEDKEY) != 0;
100+
return 1;
101+
});
102+
103+
// Extended key flag is passed to redispatched events if set.
104+
handler.KeyboardHook(nullptr, 64, kUnhandledScanCode, WM_KEYDOWN, L'b', true);
105+
EXPECT_EQ(received_scancode, kUnhandledScanCode);
106+
EXPECT_EQ(redispatch_scancode, kUnhandledScanCode);
107+
EXPECT_EQ(is_extended_key, true);
108+
109+
// Extended key flag is not passed to redispatched events if not set.
110+
handler.KeyboardHook(nullptr, 64, kUnhandledScanCode, WM_KEYDOWN, L'b',
111+
false);
112+
EXPECT_EQ(received_scancode, kUnhandledScanCode);
113+
EXPECT_EQ(redispatch_scancode, kUnhandledScanCode);
114+
EXPECT_EQ(is_extended_key, false);
115+
}
116+
117+
} // namespace testing
118+
} // namespace flutter

0 commit comments

Comments
 (0)