Flutter Linux Embedder
fl_keyboard_handler_test.cc
Go to the documentation of this file.
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 
6 
7 #include "flutter/shell/platform/embedder/test_utils/key_codes.g.h"
8 #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
12 #include "flutter/shell/platform/linux/testing/fl_mock_binary_messenger.h"
13 #include "flutter/shell/platform/linux/testing/mock_gtk.h"
14 
15 #include "flutter/shell/platform/linux/testing/linux_test.h"
16 #include "gmock/gmock.h"
17 #include "gtest/gtest.h"
18 
19 static constexpr char kKeyboardChannelName[] = "flutter/keyboard";
20 static constexpr char kGetKeyboardStateMethod[] = "getKeyboardState";
21 
22 using ::flutter::testing::keycodes::kLogicalKeyA;
23 using ::flutter::testing::keycodes::kPhysicalKeyA;
24 
25 constexpr guint16 kKeyCodeKeyA = 0x26u;
26 
27 class FlKeyboardHandlerTest : public flutter::testing::LinuxTest {
28  protected:
29  void SetUp() override {
30  messenger = fl_mock_binary_messenger_new();
31  g_clear_object(&engine);
32  engine =
33  fl_engine_new_with_binary_messenger(FL_BINARY_MESSENGER(messenger));
35  StartEngine();
36  handler = fl_keyboard_handler_new(FL_BINARY_MESSENGER(messenger), manager);
37  }
38 
40  g_clear_object(&handler);
41  g_clear_object(&manager);
42  g_clear_object(&messenger);
43  }
44 
45  FlMockBinaryMessenger* messenger = nullptr;
46  FlKeyboardManager* manager = nullptr;
47  FlKeyboardHandler* handler = nullptr;
48  ::testing::NiceMock<flutter::testing::MockGtk> mock_gtk;
49 };
50 
51 TEST_F(FlKeyboardHandlerTest, KeyboardChannelGetPressedState) {
52  // Send key event to set pressed state.
53  fl_mock_binary_messenger_set_json_message_channel(
54  messenger, "flutter/keyevent",
55  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
56  gpointer user_data) {
57  FlValue* response = fl_value_new_map();
58  fl_value_set_string_take(response, "handled", fl_value_new_bool(FALSE));
59  return response;
60  },
61  nullptr);
62  fl_engine_get_embedder_api(engine)->SendKeyEvent = MOCK_ENGINE_PROC(
63  SendKeyEvent, ([](auto engine, const FlutterKeyEvent* event,
64  FlutterKeyEventCallback callback, void* user_data) {
65  callback(false, user_data);
66  return kSuccess;
67  }));
68  g_autoptr(FlKeyEvent) event = fl_key_event_new(
69  0, TRUE, kKeyCodeKeyA, GDK_KEY_a, static_cast<GdkModifierType>(0), 0);
71  manager, event, nullptr,
72  [](GObject* object, GAsyncResult* result, gpointer user_data) {
73  g_autoptr(FlKeyEvent) redispatched_event = nullptr;
75  FL_KEYBOARD_MANAGER(object), result, &redispatched_event, nullptr));
76  g_main_loop_quit(static_cast<GMainLoop*>(user_data));
77  },
78  loop);
79  g_main_loop_run(loop);
80 
81  gboolean called = FALSE;
82  fl_mock_binary_messenger_invoke_standard_method(
83  messenger, kKeyboardChannelName, kGetKeyboardStateMethod, nullptr,
84  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
85  gpointer user_data) {
86  gboolean* called = static_cast<gboolean*>(user_data);
87  *called = TRUE;
88 
89  EXPECT_TRUE(FL_IS_METHOD_SUCCESS_RESPONSE(response));
90 
91  g_autoptr(FlValue) expected_result = fl_value_new_map();
92  fl_value_set_take(expected_result, fl_value_new_int(kPhysicalKeyA),
93  fl_value_new_int(kLogicalKeyA));
95  FL_METHOD_SUCCESS_RESPONSE(response)),
96  expected_result));
97  },
98  &called);
99 
100  EXPECT_TRUE(called);
101 }
FlMockBinaryMessenger * messenger
::testing::NiceMock< flutter::testing::MockGtk > mock_gtk
const char * message
g_autoptr(FlEngine) engine
const char FlTextDirection FlAssertiveness gpointer user_data
return TRUE
FlutterEngineProcTable * fl_engine_get_embedder_api(FlEngine *self)
Definition: fl_engine.cc:920
FlEngine * fl_engine_new_with_binary_messenger(FlBinaryMessenger *binary_messenger)
Definition: fl_engine.cc:734
FlKeyEvent * fl_key_event_new(guint32 time, gboolean is_press, guint16 keycode, guint keyval, GdkModifierType state, guint8 group)
Definition: fl_key_event.cc:34
FlKeyboardHandler * fl_keyboard_handler_new(FlBinaryMessenger *messenger, FlKeyboardManager *keyboard_manager)
TEST_F(FlKeyboardHandlerTest, KeyboardChannelGetPressedState)
static constexpr char kKeyboardChannelName[]
constexpr guint16 kKeyCodeKeyA
static constexpr char kGetKeyboardStateMethod[]
FlKeyboardManager * fl_keyboard_manager_new(FlEngine *engine)
void fl_keyboard_manager_handle_event(FlKeyboardManager *self, FlKeyEvent *event, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
gboolean fl_keyboard_manager_handle_event_finish(FlKeyboardManager *self, GAsyncResult *result, FlKeyEvent **redispatched_event, GError **error)
G_MODULE_EXPORT FlValue * fl_method_success_response_get_result(FlMethodSuccessResponse *self)
G_MODULE_EXPORT void fl_value_set_string_take(FlValue *self, const gchar *key, FlValue *value)
Definition: fl_value.cc:650
G_MODULE_EXPORT FlValue * fl_value_new_bool(bool value)
Definition: fl_value.cc:255
G_MODULE_EXPORT void fl_value_set_take(FlValue *self, FlValue *key, FlValue *value)
Definition: fl_value.cc:618
G_MODULE_EXPORT bool fl_value_equal(FlValue *a, FlValue *b)
Definition: fl_value.cc:471
G_MODULE_EXPORT FlValue * fl_value_new_int(int64_t value)
Definition: fl_value.cc:262
G_MODULE_EXPORT FlValue * fl_value_new_map()
Definition: fl_value.cc:366
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition: fl_value.h:42