1 // Copyright (c) 2016 The Chromium Embedded Framework Authors. All rights
2 // reserved. Use of this source code is governed by a BSD-style license that
3 // can be found in the LICENSE file.
4
5 #include "include/base/cef_callback.h"
6 #include "include/views/cef_box_layout.h"
7 #include "include/views/cef_layout.h"
8 #include "include/views/cef_panel.h"
9 #include "include/wrapper/cef_closure_task.h"
10 #include "tests/ceftests/image_util.h"
11 #include "tests/ceftests/thread_helper.h"
12 #include "tests/ceftests/views/test_window_delegate.h"
13 #include "tests/gtest/include/gtest/gtest.h"
14
15 #define WINDOW_TEST_ASYNC(name) UI_THREAD_TEST_ASYNC(ViewsWindowTest, name)
16
17 #if !defined(OS_WIN)
18 #define VK_MENU 0x12 // ALT key.
19 #endif
20
21 namespace {
22
23 // Window state change delay in MS.
24 const int kStateDelayMS = 200;
25
26 const int kWSize = TestWindowDelegate::kWSize;
27
28 // Test that |expected| and |actual| are within |allowed_deviance| of each
29 // other.
ExpectCloseRects(const CefRect & expected,const CefRect & actual,int allowed_deviance)30 void ExpectCloseRects(const CefRect& expected,
31 const CefRect& actual,
32 int allowed_deviance) {
33 EXPECT_LE(abs(expected.x - actual.x), allowed_deviance);
34 EXPECT_LE(abs(expected.y - actual.y), allowed_deviance);
35 EXPECT_LE(abs(expected.width - actual.width), allowed_deviance);
36 EXPECT_LE(abs(expected.height - actual.height), allowed_deviance);
37 }
38
WindowCreateImpl(CefRefPtr<CefWaitableEvent> event)39 void WindowCreateImpl(CefRefPtr<CefWaitableEvent> event) {
40 auto config = std::make_unique<TestWindowDelegate::Config>();
41 TestWindowDelegate::RunTest(event, std::move(config));
42 }
43
WindowCreateFramelessImpl(CefRefPtr<CefWaitableEvent> event)44 void WindowCreateFramelessImpl(CefRefPtr<CefWaitableEvent> event) {
45 auto config = std::make_unique<TestWindowDelegate::Config>();
46 config->frameless = true;
47 TestWindowDelegate::RunTest(event, std::move(config));
48 }
49
RunWindowShow(CefRefPtr<CefWindow> window)50 void RunWindowShow(CefRefPtr<CefWindow> window) {
51 EXPECT_FALSE(window->IsVisible());
52 EXPECT_FALSE(window->IsDrawn());
53 window->Show();
54 EXPECT_TRUE(window->IsVisible());
55 EXPECT_TRUE(window->IsDrawn());
56 }
57
WindowCreateWithOriginImpl(CefRefPtr<CefWaitableEvent> event)58 void WindowCreateWithOriginImpl(CefRefPtr<CefWaitableEvent> event) {
59 auto config = std::make_unique<TestWindowDelegate::Config>();
60 config->window_origin = {100, 200};
61 config->on_window_created = base::BindOnce(RunWindowShow);
62 TestWindowDelegate::RunTest(event, std::move(config));
63 }
64
RunWindowShowHide(CefRefPtr<CefWindow> window)65 void RunWindowShowHide(CefRefPtr<CefWindow> window) {
66 RunWindowShow(window);
67 window->Hide();
68 EXPECT_FALSE(window->IsVisible());
69 EXPECT_FALSE(window->IsDrawn());
70 }
71
WindowShowHideImpl(CefRefPtr<CefWaitableEvent> event)72 void WindowShowHideImpl(CefRefPtr<CefWaitableEvent> event) {
73 auto config = std::make_unique<TestWindowDelegate::Config>();
74 config->on_window_created = base::BindOnce(RunWindowShowHide);
75 TestWindowDelegate::RunTest(event, std::move(config));
76 }
77
WindowShowHideFramelessImpl(CefRefPtr<CefWaitableEvent> event)78 void WindowShowHideFramelessImpl(CefRefPtr<CefWaitableEvent> event) {
79 auto config = std::make_unique<TestWindowDelegate::Config>();
80 config->on_window_created = base::BindOnce(RunWindowShowHide);
81 config->frameless = true;
82 TestWindowDelegate::RunTest(event, std::move(config));
83 }
84
85 const int kWPanel1ID = 1;
86 const int kWPanel2ID = 2;
87
CreateBoxLayout(CefRefPtr<CefWindow> parent)88 void CreateBoxLayout(CefRefPtr<CefWindow> parent) {
89 CefRefPtr<CefPanel> panel_child1 = CefPanel::CreatePanel(nullptr);
90 panel_child1->SetID(kWPanel1ID);
91 panel_child1->SetBackgroundColor(CefColorSetARGB(255, 0, 0, 255));
92 EXPECT_TRUE(panel_child1->IsVisible());
93 EXPECT_FALSE(panel_child1->IsDrawn());
94
95 CefRefPtr<CefPanel> panel_child2 = CefPanel::CreatePanel(nullptr);
96 panel_child2->SetID(kWPanel2ID);
97 panel_child2->SetBackgroundColor(CefColorSetARGB(255, 0, 255, 0));
98 EXPECT_TRUE(panel_child2->IsVisible());
99 EXPECT_FALSE(panel_child2->IsDrawn());
100
101 // Set to BoxLayout. Default layout is vertical with children stretched along
102 // the horizontal axis.
103 CefBoxLayoutSettings settings;
104 parent->SetToBoxLayout(settings);
105
106 parent->AddChildView(panel_child1);
107 parent->AddChildView(panel_child2);
108
109 // IsDrawn() returns true because the Panels now have a RootView from the
110 // Window.
111 EXPECT_TRUE(panel_child1->IsDrawn());
112 EXPECT_TRUE(panel_child1->IsDrawn());
113
114 // Stretch children equally along the vertical axis using flex.
115 CefRefPtr<CefBoxLayout> layout = parent->GetLayout()->AsBoxLayout();
116 layout->SetFlexForView(panel_child1, 1);
117 layout->SetFlexForView(panel_child2, 1);
118
119 // Force layout.
120 parent->Layout();
121
122 // The children should each take up 50% of the client area.
123 ExpectCloseRects(CefRect(0, 0, kWSize, kWSize / 2), panel_child1->GetBounds(),
124 1);
125 ExpectCloseRects(CefRect(0, kWSize / 2, kWSize, kWSize / 2),
126 panel_child2->GetBounds(), 1);
127 }
128
RunWindowLayoutAndCoords(CefRefPtr<CefWindow> window)129 void RunWindowLayoutAndCoords(CefRefPtr<CefWindow> window) {
130 CreateBoxLayout(window);
131
132 CefRefPtr<CefView> view1 = window->GetViewForID(kWPanel1ID);
133 EXPECT_TRUE(view1.get());
134 CefRefPtr<CefView> view2 = window->GetViewForID(kWPanel2ID);
135 EXPECT_TRUE(view2.get());
136
137 window->Show();
138
139 CefRect client_bounds_in_screen = window->GetClientAreaBoundsInScreen();
140 CefPoint point;
141
142 // Test view to screen coordinate conversions.
143 point = CefPoint(0, 0);
144 EXPECT_TRUE(view1->ConvertPointToScreen(point));
145 EXPECT_EQ(CefPoint(client_bounds_in_screen.x, client_bounds_in_screen.y),
146 point);
147 point = CefPoint(0, 0);
148 EXPECT_TRUE(view2->ConvertPointToScreen(point));
149 EXPECT_EQ(CefPoint(client_bounds_in_screen.x,
150 client_bounds_in_screen.y + kWSize / 2),
151 point);
152
153 // Test view from screen coordinate conversions.
154 point = CefPoint(client_bounds_in_screen.x, client_bounds_in_screen.y);
155 EXPECT_TRUE(view1->ConvertPointFromScreen(point));
156 EXPECT_EQ(CefPoint(0, 0), point);
157 point = CefPoint(client_bounds_in_screen.x,
158 client_bounds_in_screen.y + kWSize / 2);
159 EXPECT_TRUE(view2->ConvertPointFromScreen(point));
160 EXPECT_EQ(CefPoint(0, 0), point);
161
162 // Test view to window coordinate conversions.
163 point = CefPoint(0, 0);
164 EXPECT_TRUE(view1->ConvertPointToWindow(point));
165 EXPECT_EQ(CefPoint(0, 0), point);
166 point = CefPoint(0, 0);
167 EXPECT_TRUE(view2->ConvertPointToWindow(point));
168 EXPECT_EQ(CefPoint(0, kWSize / 2), point);
169
170 // Test view from window coordinate conversions.
171 point = CefPoint(0, 0);
172 EXPECT_TRUE(view1->ConvertPointFromWindow(point));
173 EXPECT_EQ(CefPoint(0, 0), point);
174 point = CefPoint(0, kWSize / 2);
175 EXPECT_TRUE(view2->ConvertPointFromWindow(point));
176 EXPECT_EQ(CefPoint(0, 0), point);
177
178 // Test view to view coordinate conversions.
179 point = CefPoint(0, 0);
180 EXPECT_TRUE(view1->ConvertPointToView(view2, point));
181 EXPECT_EQ(CefPoint(0, -kWSize / 2), point);
182 point = CefPoint(0, 0);
183 EXPECT_TRUE(view2->ConvertPointToView(view1, point));
184 EXPECT_EQ(CefPoint(0, kWSize / 2), point);
185
186 // Test view from view coordinate conversions.
187 point = CefPoint(0, -kWSize / 2);
188 EXPECT_TRUE(view1->ConvertPointFromView(view2, point));
189 EXPECT_EQ(CefPoint(0, 0), point);
190 point = CefPoint(0, kWSize / 2);
191 EXPECT_TRUE(view2->ConvertPointFromView(view1, point));
192 EXPECT_EQ(CefPoint(0, 0), point);
193
194 CefRefPtr<CefDisplay> display = window->GetDisplay();
195 EXPECT_TRUE(display.get());
196
197 // We don't know what the pixel values will be, but they should be reversable.
198 point = CefPoint(client_bounds_in_screen.x, client_bounds_in_screen.y);
199 display->ConvertPointToPixels(point);
200 display->ConvertPointFromPixels(point);
201 EXPECT_EQ(CefPoint(client_bounds_in_screen.x, client_bounds_in_screen.y),
202 point);
203 }
204
WindowLayoutAndCoordsImpl(CefRefPtr<CefWaitableEvent> event)205 void WindowLayoutAndCoordsImpl(CefRefPtr<CefWaitableEvent> event) {
206 auto config = std::make_unique<TestWindowDelegate::Config>();
207 config->on_window_created = base::BindOnce(RunWindowLayoutAndCoords);
208 TestWindowDelegate::RunTest(event, std::move(config));
209 }
210
WindowLayoutAndCoordsFramelessImpl(CefRefPtr<CefWaitableEvent> event)211 void WindowLayoutAndCoordsFramelessImpl(CefRefPtr<CefWaitableEvent> event) {
212 auto config = std::make_unique<TestWindowDelegate::Config>();
213 config->on_window_created = base::BindOnce(RunWindowLayoutAndCoords);
214 config->frameless = true;
215 TestWindowDelegate::RunTest(event, std::move(config));
216 }
217
VerifyRestore(CefRefPtr<CefWindow> window)218 void VerifyRestore(CefRefPtr<CefWindow> window) {
219 EXPECT_FALSE(window->IsMinimized());
220 EXPECT_FALSE(window->IsMaximized());
221 EXPECT_FALSE(window->IsFullscreen());
222 EXPECT_TRUE(window->IsVisible());
223 EXPECT_TRUE(window->IsDrawn());
224
225 // End the test by closing the Window.
226 window->Close();
227 }
228
VerifyMaximize(CefRefPtr<CefWindow> window)229 void VerifyMaximize(CefRefPtr<CefWindow> window) {
230 EXPECT_FALSE(window->IsMinimized());
231 EXPECT_TRUE(window->IsMaximized());
232 EXPECT_FALSE(window->IsFullscreen());
233 EXPECT_TRUE(window->IsVisible());
234 EXPECT_TRUE(window->IsDrawn());
235
236 window->Restore();
237 CefPostDelayedTask(TID_UI, base::BindOnce(VerifyRestore, window),
238 kStateDelayMS);
239 }
240
RunWindowMaximize(CefRefPtr<CefWindow> window)241 void RunWindowMaximize(CefRefPtr<CefWindow> window) {
242 CreateBoxLayout(window);
243 window->Show();
244 EXPECT_FALSE(window->IsMinimized());
245 EXPECT_FALSE(window->IsMaximized());
246 EXPECT_FALSE(window->IsFullscreen());
247 EXPECT_TRUE(window->IsVisible());
248 EXPECT_TRUE(window->IsDrawn());
249
250 window->Maximize();
251 CefPostDelayedTask(TID_UI, base::BindOnce(VerifyMaximize, window),
252 kStateDelayMS);
253 }
254
WindowMaximizeImpl(CefRefPtr<CefWaitableEvent> event)255 void WindowMaximizeImpl(CefRefPtr<CefWaitableEvent> event) {
256 auto config = std::make_unique<TestWindowDelegate::Config>();
257 config->on_window_created = base::BindOnce(RunWindowMaximize);
258 config->close_window = false;
259 TestWindowDelegate::RunTest(event, std::move(config));
260 }
261
WindowMaximizeFramelessImpl(CefRefPtr<CefWaitableEvent> event)262 void WindowMaximizeFramelessImpl(CefRefPtr<CefWaitableEvent> event) {
263 auto config = std::make_unique<TestWindowDelegate::Config>();
264 config->on_window_created = base::BindOnce(RunWindowMaximize);
265 config->frameless = true;
266 config->close_window = false;
267 TestWindowDelegate::RunTest(event, std::move(config));
268 }
269
VerifyMinimize(CefRefPtr<CefWindow> window)270 void VerifyMinimize(CefRefPtr<CefWindow> window) {
271 EXPECT_TRUE(window->IsMinimized());
272 EXPECT_FALSE(window->IsMaximized());
273 EXPECT_FALSE(window->IsFullscreen());
274
275 // This result is a bit unexpected, but I guess the platform considers a
276 // window to be visible even when it's minimized.
277 EXPECT_TRUE(window->IsVisible());
278 EXPECT_TRUE(window->IsDrawn());
279
280 window->Restore();
281 CefPostDelayedTask(TID_UI, base::BindOnce(VerifyRestore, window),
282 kStateDelayMS);
283 }
284
RunWindowMinimize(CefRefPtr<CefWindow> window)285 void RunWindowMinimize(CefRefPtr<CefWindow> window) {
286 CreateBoxLayout(window);
287 window->Show();
288 EXPECT_FALSE(window->IsMinimized());
289 EXPECT_FALSE(window->IsMaximized());
290 EXPECT_FALSE(window->IsFullscreen());
291 EXPECT_TRUE(window->IsVisible());
292 EXPECT_TRUE(window->IsDrawn());
293
294 window->Minimize();
295 CefPostDelayedTask(TID_UI, base::BindOnce(VerifyMinimize, window),
296 kStateDelayMS);
297 }
298
WindowMinimizeImpl(CefRefPtr<CefWaitableEvent> event)299 void WindowMinimizeImpl(CefRefPtr<CefWaitableEvent> event) {
300 auto config = std::make_unique<TestWindowDelegate::Config>();
301 config->on_window_created = base::BindOnce(RunWindowMinimize);
302 config->close_window = false;
303 TestWindowDelegate::RunTest(event, std::move(config));
304 }
305
WindowMinimizeFramelessImpl(CefRefPtr<CefWaitableEvent> event)306 void WindowMinimizeFramelessImpl(CefRefPtr<CefWaitableEvent> event) {
307 auto config = std::make_unique<TestWindowDelegate::Config>();
308 config->on_window_created = base::BindOnce(RunWindowMinimize);
309 config->frameless = true;
310 config->close_window = false;
311 TestWindowDelegate::RunTest(event, std::move(config));
312 }
313
VerifyFullscreenExit(CefRefPtr<CefWindow> window)314 void VerifyFullscreenExit(CefRefPtr<CefWindow> window) {
315 EXPECT_FALSE(window->IsMinimized());
316 EXPECT_FALSE(window->IsMaximized());
317 EXPECT_FALSE(window->IsFullscreen());
318 EXPECT_TRUE(window->IsVisible());
319 EXPECT_TRUE(window->IsDrawn());
320
321 // End the test by closing the Window.
322 window->Close();
323 }
324
VerifyFullscreen(CefRefPtr<CefWindow> window)325 void VerifyFullscreen(CefRefPtr<CefWindow> window) {
326 EXPECT_FALSE(window->IsMinimized());
327 EXPECT_FALSE(window->IsMaximized());
328 EXPECT_TRUE(window->IsFullscreen());
329 EXPECT_TRUE(window->IsVisible());
330 EXPECT_TRUE(window->IsDrawn());
331
332 window->SetFullscreen(false);
333 CefPostDelayedTask(TID_UI, base::BindOnce(VerifyFullscreenExit, window),
334 kStateDelayMS);
335 }
336
RunWindowFullscreen(CefRefPtr<CefWindow> window)337 void RunWindowFullscreen(CefRefPtr<CefWindow> window) {
338 CreateBoxLayout(window);
339 window->Show();
340 EXPECT_FALSE(window->IsMinimized());
341 EXPECT_FALSE(window->IsMaximized());
342 EXPECT_FALSE(window->IsFullscreen());
343 EXPECT_TRUE(window->IsVisible());
344 EXPECT_TRUE(window->IsDrawn());
345
346 window->SetFullscreen(true);
347 CefPostDelayedTask(TID_UI, base::BindOnce(VerifyFullscreen, window),
348 kStateDelayMS);
349 }
350
WindowFullscreenImpl(CefRefPtr<CefWaitableEvent> event)351 void WindowFullscreenImpl(CefRefPtr<CefWaitableEvent> event) {
352 auto config = std::make_unique<TestWindowDelegate::Config>();
353 config->on_window_created = base::BindOnce(RunWindowFullscreen);
354 config->close_window = false;
355 TestWindowDelegate::RunTest(event, std::move(config));
356 }
357
WindowFullscreenFramelessImpl(CefRefPtr<CefWaitableEvent> event)358 void WindowFullscreenFramelessImpl(CefRefPtr<CefWaitableEvent> event) {
359 auto config = std::make_unique<TestWindowDelegate::Config>();
360 config->on_window_created = base::BindOnce(RunWindowFullscreen);
361 config->frameless = true;
362 config->close_window = false;
363 TestWindowDelegate::RunTest(event, std::move(config));
364 }
365
RunWindowIcon(CefRefPtr<CefWindow> window)366 void RunWindowIcon(CefRefPtr<CefWindow> window) {
367 CefRefPtr<CefImage> image = CefImage::CreateImage();
368 image_util::LoadIconImage(image, 1.0);
369 image_util::LoadIconImage(image, 2.0);
370
371 EXPECT_FALSE(window->GetWindowIcon().get());
372 window->SetWindowIcon(image);
373 EXPECT_TRUE(image->IsSame(window->GetWindowIcon()));
374
375 EXPECT_FALSE(window->GetWindowAppIcon().get());
376 window->SetWindowAppIcon(image);
377 EXPECT_TRUE(image->IsSame(window->GetWindowAppIcon()));
378
379 window->Show();
380 }
381
WindowIconImpl(CefRefPtr<CefWaitableEvent> event)382 void WindowIconImpl(CefRefPtr<CefWaitableEvent> event) {
383 auto config = std::make_unique<TestWindowDelegate::Config>();
384 config->on_window_created = base::BindOnce(RunWindowIcon);
385 TestWindowDelegate::RunTest(event, std::move(config));
386 }
387
WindowIconFramelessImpl(CefRefPtr<CefWaitableEvent> event)388 void WindowIconFramelessImpl(CefRefPtr<CefWaitableEvent> event) {
389 auto config = std::make_unique<TestWindowDelegate::Config>();
390 config->on_window_created = base::BindOnce(RunWindowIcon);
391 config->frameless = true;
392 TestWindowDelegate::RunTest(event, std::move(config));
393 }
394
395 const int kChar = 'A';
396 const int kCloseWindowId = 2;
397 bool got_accelerator;
398 int got_key_event_alt_count;
399 bool got_key_event_char;
400
TriggerAccelerator(CefRefPtr<CefWindow> window)401 void TriggerAccelerator(CefRefPtr<CefWindow> window) {
402 window->SendKeyPress(kChar, EVENTFLAG_ALT_DOWN);
403 }
404
OnKeyEvent(CefRefPtr<CefWindow> window,const CefKeyEvent & event)405 bool OnKeyEvent(CefRefPtr<CefWindow> window, const CefKeyEvent& event) {
406 if (event.type != KEYEVENT_RAWKEYDOWN)
407 return false;
408
409 if (event.windows_key_code == VK_MENU) {
410 // First we get the ALT key press in all cases.
411 EXPECT_FALSE(got_key_event_char);
412 if (got_key_event_alt_count == 0)
413 EXPECT_FALSE(got_accelerator);
414 else
415 EXPECT_TRUE(got_accelerator);
416
417 EXPECT_EQ(EVENTFLAG_ALT_DOWN, static_cast<int>(event.modifiers));
418 got_key_event_alt_count++;
419 } else if (event.windows_key_code == kChar) {
420 // Then we get the char key press with the ALT modifier if the accelerator
421 // isn't registered.
422 EXPECT_TRUE(got_accelerator);
423 EXPECT_EQ(got_key_event_alt_count, 2);
424 EXPECT_FALSE(got_key_event_char);
425
426 EXPECT_EQ(EVENTFLAG_ALT_DOWN, static_cast<int>(event.modifiers));
427 got_key_event_char = true;
428
429 // Call this method just to make sure it doesn't crash.
430 window->RemoveAllAccelerators();
431
432 // End the test by closing the Window.
433 window->Close();
434
435 return true;
436 }
437
438 return false;
439 }
440
OnAccelerator(CefRefPtr<CefWindow> window,int command_id)441 bool OnAccelerator(CefRefPtr<CefWindow> window, int command_id) {
442 EXPECT_FALSE(got_accelerator);
443 EXPECT_EQ(got_key_event_alt_count, 1);
444 EXPECT_FALSE(got_key_event_char);
445
446 EXPECT_EQ(kCloseWindowId, command_id);
447 got_accelerator = true;
448
449 // Remove the accelerator.
450 window->RemoveAccelerator(kCloseWindowId);
451
452 // Now send the event without the accelerator registered. Should result in a
453 // call to OnKeyEvent.
454 TriggerAccelerator(window);
455
456 return true;
457 }
458
RunWindowAccelerator(CefRefPtr<CefWindow> window)459 void RunWindowAccelerator(CefRefPtr<CefWindow> window) {
460 window->SetAccelerator(kCloseWindowId, kChar, false, false, true);
461 window->Show();
462
463 CefPostDelayedTask(TID_UI, base::BindOnce(TriggerAccelerator, window),
464 kStateDelayMS);
465 }
466
VerifyWindowAccelerator(CefRefPtr<CefWindow> window)467 void VerifyWindowAccelerator(CefRefPtr<CefWindow> window) {
468 EXPECT_TRUE(got_accelerator);
469 EXPECT_EQ(got_key_event_alt_count, 2);
470 EXPECT_TRUE(got_key_event_char);
471 }
472
473 // Expected order of events:
474 // 1. OnKeyEvent for ALT key press.
475 // 2. OnAccelerator for ALT+Char key press (with accelerator registered).
476 // 3. OnKeyEvent for ALT key press.
477 // 4. OnKeyEvent for ALT+Char key press (without accelerator registered).
WindowAcceleratorImpl(CefRefPtr<CefWaitableEvent> event)478 void WindowAcceleratorImpl(CefRefPtr<CefWaitableEvent> event) {
479 got_accelerator = false;
480 got_key_event_alt_count = 0;
481 got_key_event_char = false;
482
483 auto config = std::make_unique<TestWindowDelegate::Config>();
484 config->on_window_created = base::BindOnce(RunWindowAccelerator);
485 config->on_window_destroyed = base::BindOnce(VerifyWindowAccelerator);
486 config->on_accelerator = base::BindRepeating(OnAccelerator);
487 config->on_key_event = base::BindRepeating(OnKeyEvent);
488 config->close_window = false;
489 TestWindowDelegate::RunTest(event, std::move(config));
490 }
491
492 } // namespace
493
494 // Test window functionality. This is primarily to exercise exposed CEF APIs
495 // and is not intended to comprehensively test window-related behavior (which
496 // we presume that Chromium is testing).
497 WINDOW_TEST_ASYNC(WindowCreate)
498 WINDOW_TEST_ASYNC(WindowCreateFrameless)
499 WINDOW_TEST_ASYNC(WindowCreateWithOrigin)
500 WINDOW_TEST_ASYNC(WindowShowHide)
501 WINDOW_TEST_ASYNC(WindowShowHideFrameless)
502 WINDOW_TEST_ASYNC(WindowLayoutAndCoords)
503 WINDOW_TEST_ASYNC(WindowLayoutAndCoordsFrameless)
504 WINDOW_TEST_ASYNC(WindowMaximize)
505 WINDOW_TEST_ASYNC(WindowMaximizeFrameless)
506 WINDOW_TEST_ASYNC(WindowMinimize)
507 WINDOW_TEST_ASYNC(WindowMinimizeFrameless)
508 WINDOW_TEST_ASYNC(WindowFullscreen)
509 WINDOW_TEST_ASYNC(WindowFullscreenFrameless)
510 WINDOW_TEST_ASYNC(WindowIcon)
511 WINDOW_TEST_ASYNC(WindowIconFrameless)
512 WINDOW_TEST_ASYNC(WindowAccelerator)
513