Flutter Linux Embedder
fl_window_state_monitor_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 
8 #include "flutter/shell/platform/linux/testing/fl_mock_binary_messenger.h"
9 #include "flutter/shell/platform/linux/testing/mock_gtk.h"
10 
11 #include "flutter/shell/platform/linux/testing/linux_test.h"
12 #include "gtest/gtest.h"
13 
14 class FlWindowStateMonitorTest : public flutter::testing::LinuxTest {
15  protected:
16  void SetUp() override {
17  gtk_init(0, nullptr);
18  messenger = fl_mock_binary_messenger_new();
19  }
20 
22  fl_binary_messenger_shutdown(FL_BINARY_MESSENGER(messenger));
23  g_clear_object(&messenger);
24  }
25 
26  FlMockBinaryMessenger* messenger = nullptr;
27  ::testing::NiceMock<flutter::testing::MockGtk> mock_gtk;
28 };
29 
31  EXPECT_CALL(mock_gtk, gdk_window_get_state)
32  .WillOnce(::testing::Return(static_cast<GdkWindowState>(0)));
33 
34  gboolean called = TRUE;
35  fl_mock_binary_messenger_set_string_message_channel(
36  messenger, "flutter/lifecycle",
37  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
38  gpointer user_data) {
39  gboolean* called = static_cast<gboolean*>(user_data);
40  *called = TRUE;
41  EXPECT_STREQ(fl_value_get_string(message), "AppLifecycleState.resumed");
42  return fl_value_new_string("");
43  },
44  &called);
45 
46  GtkWindow* window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
47  gtk_widget_show(GTK_WIDGET(window));
48  g_autoptr(FlWindowStateMonitor) monitor =
49  fl_window_state_monitor_new(FL_BINARY_MESSENGER(messenger), window);
50 
51  GdkEvent event = {
52  .window_state = {.new_window_state = GDK_WINDOW_STATE_FOCUSED}};
53  gboolean handled;
54  g_signal_emit_by_name(window, "window-state-event", &event, &handled);
55  EXPECT_TRUE(called);
56 }
57 
59  EXPECT_CALL(mock_gtk, gdk_window_get_state)
60  .WillOnce(::testing::Return(GDK_WINDOW_STATE_FOCUSED));
61  gboolean called = TRUE;
62  fl_mock_binary_messenger_set_string_message_channel(
63  messenger, "flutter/lifecycle",
64  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
65  gpointer user_data) {
66  gboolean* called = static_cast<gboolean*>(user_data);
67  *called = TRUE;
68  EXPECT_STREQ(fl_value_get_string(message),
69  "AppLifecycleState.inactive");
70  return fl_value_new_string("");
71  },
72  &called);
73 
74  GtkWindow* window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
75  gtk_widget_show(GTK_WIDGET(window));
76  g_autoptr(FlWindowStateMonitor) monitor =
77  fl_window_state_monitor_new(FL_BINARY_MESSENGER(messenger), window);
78 
79  GdkEvent event = {
80  .window_state = {.new_window_state = static_cast<GdkWindowState>(0)}};
81  gboolean handled;
82  g_signal_emit_by_name(window, "window-state-event", &event, &handled);
83  EXPECT_TRUE(called);
84 }
85 
86 TEST_F(FlWindowStateMonitorTest, EnterIconified) {
87  EXPECT_CALL(mock_gtk, gdk_window_get_state)
88  .WillOnce(::testing::Return(static_cast<GdkWindowState>(0)));
89  gboolean called = TRUE;
90  fl_mock_binary_messenger_set_string_message_channel(
91  messenger, "flutter/lifecycle",
92  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
93  gpointer user_data) {
94  gboolean* called = static_cast<gboolean*>(user_data);
95  *called = TRUE;
96  EXPECT_STREQ(fl_value_get_string(message), "AppLifecycleState.hidden");
97  return fl_value_new_string("");
98  },
99  &called);
100 
101  GtkWindow* window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
102  gtk_widget_show(GTK_WIDGET(window));
103  g_autoptr(FlWindowStateMonitor) monitor =
104  fl_window_state_monitor_new(FL_BINARY_MESSENGER(messenger), window);
105 
106  GdkEvent event = {
107  .window_state = {.new_window_state = GDK_WINDOW_STATE_ICONIFIED}};
108  gboolean handled;
109  g_signal_emit_by_name(window, "window-state-event", &event, &handled);
110  EXPECT_TRUE(called);
111 }
112 
114  EXPECT_CALL(mock_gtk, gdk_window_get_state)
115  .WillOnce(::testing::Return(GDK_WINDOW_STATE_ICONIFIED));
116  gboolean called = TRUE;
117  fl_mock_binary_messenger_set_string_message_channel(
118  messenger, "flutter/lifecycle",
119  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
120  gpointer user_data) {
121  gboolean* called = static_cast<gboolean*>(user_data);
122  *called = TRUE;
123  EXPECT_STREQ(fl_value_get_string(message),
124  "AppLifecycleState.inactive");
125  return fl_value_new_string("");
126  },
127  &called);
128 
129  GtkWindow* window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
130  gtk_widget_show(GTK_WIDGET(window));
131  g_autoptr(FlWindowStateMonitor) monitor =
132  fl_window_state_monitor_new(FL_BINARY_MESSENGER(messenger), window);
133 
134  GdkEvent event = {
135  .window_state = {.new_window_state = static_cast<GdkWindowState>(0)}};
136  gboolean handled;
137  g_signal_emit_by_name(window, "window-state-event", &event, &handled);
138  EXPECT_TRUE(called);
139 }
140 
141 TEST_F(FlWindowStateMonitorTest, LeaveIconifiedFocused) {
142  EXPECT_CALL(mock_gtk, gdk_window_get_state)
143  .WillOnce(::testing::Return(GDK_WINDOW_STATE_ICONIFIED));
144  gboolean called = TRUE;
145  fl_mock_binary_messenger_set_string_message_channel(
146  messenger, "flutter/lifecycle",
147  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
148  gpointer user_data) {
149  gboolean* called = static_cast<gboolean*>(user_data);
150  *called = TRUE;
151  EXPECT_STREQ(fl_value_get_string(message), "AppLifecycleState.resumed");
152  return fl_value_new_string("");
153  },
154  &called);
155 
156  GtkWindow* window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
157  gtk_widget_show(GTK_WIDGET(window));
158  g_autoptr(FlWindowStateMonitor) monitor =
159  fl_window_state_monitor_new(FL_BINARY_MESSENGER(messenger), window);
160 
161  GdkEvent event = {
162  .window_state = {.new_window_state = static_cast<GdkWindowState>(
163  GDK_WINDOW_STATE_FOCUSED)}};
164  gboolean handled;
165  g_signal_emit_by_name(window, "window-state-event", &event, &handled);
166  EXPECT_TRUE(called);
167 }
168 
170  EXPECT_CALL(mock_gtk, gdk_window_get_state)
171  .WillOnce(::testing::Return(static_cast<GdkWindowState>(0)));
172  gboolean called = TRUE;
173  fl_mock_binary_messenger_set_string_message_channel(
174  messenger, "flutter/lifecycle",
175  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
176  gpointer user_data) {
177  gboolean* called = static_cast<gboolean*>(user_data);
178  *called = TRUE;
179  EXPECT_STREQ(fl_value_get_string(message), "AppLifecycleState.hidden");
180  return fl_value_new_string("");
181  },
182  &called);
183 
184  GtkWindow* window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
185  gtk_widget_show(GTK_WIDGET(window));
186  g_autoptr(FlWindowStateMonitor) monitor =
187  fl_window_state_monitor_new(FL_BINARY_MESSENGER(messenger), window);
188 
189  GdkEvent event = {
190  .window_state = {.new_window_state = GDK_WINDOW_STATE_WITHDRAWN}};
191  gboolean handled;
192  g_signal_emit_by_name(window, "window-state-event", &event, &handled);
193  EXPECT_TRUE(called);
194 }
195 
197  EXPECT_CALL(mock_gtk, gdk_window_get_state)
198  .WillOnce(::testing::Return(GDK_WINDOW_STATE_WITHDRAWN));
199  gboolean called = TRUE;
200  fl_mock_binary_messenger_set_string_message_channel(
201  messenger, "flutter/lifecycle",
202  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
203  gpointer user_data) {
204  gboolean* called = static_cast<gboolean*>(user_data);
205  *called = TRUE;
206  EXPECT_STREQ(fl_value_get_string(message),
207  "AppLifecycleState.inactive");
208  return fl_value_new_string("");
209  },
210  &called);
211 
212  GtkWindow* window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
213  gtk_widget_show(GTK_WIDGET(window));
214  g_autoptr(FlWindowStateMonitor) monitor =
215  fl_window_state_monitor_new(FL_BINARY_MESSENGER(messenger), window);
216 
217  GdkEvent event = {
218  .window_state = {.new_window_state = static_cast<GdkWindowState>(0)}};
219  gboolean handled;
220  g_signal_emit_by_name(window, "window-state-event", &event, &handled);
221  EXPECT_TRUE(called);
222 }
223 
224 TEST_F(FlWindowStateMonitorTest, LeaveWithdrawnFocused) {
225  EXPECT_CALL(mock_gtk, gdk_window_get_state)
226  .WillOnce(::testing::Return(GDK_WINDOW_STATE_WITHDRAWN));
227  gboolean called = TRUE;
228  fl_mock_binary_messenger_set_string_message_channel(
229  messenger, "flutter/lifecycle",
230  [](FlMockBinaryMessenger* messenger, GTask* task, FlValue* message,
231  gpointer user_data) {
232  gboolean* called = static_cast<gboolean*>(user_data);
233  *called = TRUE;
234  EXPECT_STREQ(fl_value_get_string(message), "AppLifecycleState.resumed");
235  return fl_value_new_string("");
236  },
237  &called);
238 
239  GtkWindow* window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
240  gtk_widget_show(GTK_WIDGET(window));
241  g_autoptr(FlWindowStateMonitor) monitor =
242  fl_window_state_monitor_new(FL_BINARY_MESSENGER(messenger), window);
243 
244  GdkEvent event = {
245  .window_state = {.new_window_state = static_cast<GdkWindowState>(
246  GDK_WINDOW_STATE_FOCUSED)}};
247  gboolean handled;
248  g_signal_emit_by_name(window, "window-state-event", &event, &handled);
249  EXPECT_TRUE(called);
250 }
::testing::NiceMock< flutter::testing::MockGtk > mock_gtk
const char * message
g_autoptr(FlEngine) engine
const char FlTextDirection FlAssertiveness gpointer user_data
void fl_binary_messenger_shutdown(FlBinaryMessenger *self)
return TRUE
G_MODULE_EXPORT FlValue * fl_value_new_string(const gchar *value)
Definition: fl_value.cc:276
G_MODULE_EXPORT const gchar * fl_value_get_string(FlValue *self)
Definition: fl_value.cc:682
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition: fl_value.h:42
FlWindowStateMonitor * fl_window_state_monitor_new(FlBinaryMessenger *messenger, GtkWindow *window)
TEST_F(FlWindowStateMonitorTest, GainFocus)