cast_window_manager_aura_test.cc 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. // Copyright 2017 The Chromium 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 "chromecast/graphics/cast_window_manager_aura.h"
  5. #include <memory>
  6. #include "ui/aura/client/focus_client.h"
  7. #include "ui/aura/test/aura_test_base.h"
  8. #include "ui/aura/test/test_window_delegate.h"
  9. #include "ui/aura/window.h"
  10. #include "ui/events/test/event_generator.h"
  11. #include "ui/views/test/views_test_base.h"
  12. namespace chromecast {
  13. namespace test {
  14. namespace {
  15. class CastTestWindowDelegate : public aura::test::TestWindowDelegate {
  16. public:
  17. CastTestWindowDelegate() : key_code_(ui::VKEY_UNKNOWN) {}
  18. CastTestWindowDelegate(const CastTestWindowDelegate&) = delete;
  19. CastTestWindowDelegate& operator=(const CastTestWindowDelegate&) = delete;
  20. ~CastTestWindowDelegate() override {}
  21. // Overridden from TestWindowDelegate:
  22. void OnKeyEvent(ui::KeyEvent* event) override {
  23. key_code_ = event->key_code();
  24. }
  25. ui::KeyboardCode key_code() { return key_code_; }
  26. private:
  27. ui::KeyboardCode key_code_;
  28. };
  29. class TestWindow {
  30. public:
  31. explicit TestWindow(int id) : window_(&delegate_) {
  32. window_.Init(ui::LAYER_NOT_DRAWN);
  33. window_.SetId(id);
  34. window_.SetBounds(gfx::Rect(0, 0, 1280, 720));
  35. }
  36. TestWindow(const TestWindow&) = delete;
  37. TestWindow& operator=(const TestWindow&) = delete;
  38. aura::Window* window() { return &window_; }
  39. private:
  40. CastTestWindowDelegate delegate_;
  41. aura::Window window_;
  42. };
  43. } // namespace
  44. // ViewsTestBase needed so that views/widget initialization is setup correctly
  45. // for test runs.
  46. using CastWindowManagerAuraTest = views::ViewsTestBase;
  47. TEST_F(CastWindowManagerAuraTest, InitialWindowId) {
  48. CastTestWindowDelegate window_delegate;
  49. aura::Window window(&window_delegate);
  50. window.Init(ui::LAYER_NOT_DRAWN);
  51. // We have chosen WindowId::BOTTOM to match the initial window ID of an Aura
  52. // window so that z-ordering works correctly.
  53. EXPECT_EQ(window.GetId(), CastWindowManager::WindowId::BOTTOM);
  54. }
  55. TEST_F(CastWindowManagerAuraTest, WindowInput) {
  56. std::unique_ptr<CastWindowManagerAura> window_manager =
  57. std::make_unique<CastWindowManagerAura>(true /* enable input */);
  58. CastTestWindowDelegate window_delegate;
  59. aura::Window window(&window_delegate);
  60. window.Init(ui::LAYER_NOT_DRAWN);
  61. window.SetName("event window");
  62. window_manager->AddWindow(&window);
  63. window.SetBounds(gfx::Rect(0, 0, 1280, 720));
  64. window.Show();
  65. EXPECT_FALSE(window.IsRootWindow());
  66. EXPECT_TRUE(window.GetHost());
  67. // Confirm that the Aura focus client tracks window focus correctly.
  68. aura::client::FocusClient* focus_client =
  69. aura::client::GetFocusClient(&window);
  70. EXPECT_TRUE(focus_client);
  71. EXPECT_FALSE(focus_client->GetFocusedWindow());
  72. window.Focus();
  73. EXPECT_EQ(&window, focus_client->GetFocusedWindow());
  74. // Confirm that a keyboard event is delivered to the window.
  75. ui::test::EventGenerator event_generator(window.GetRootWindow());
  76. event_generator.PressKey(ui::VKEY_0, ui::EF_NONE);
  77. EXPECT_EQ(ui::VKEY_0, window_delegate.key_code());
  78. }
  79. TEST_F(CastWindowManagerAuraTest, WindowInputDisabled) {
  80. std::unique_ptr<CastWindowManagerAura> window_manager =
  81. std::make_unique<CastWindowManagerAura>(false /* enable input */);
  82. CastTestWindowDelegate window_delegate;
  83. aura::Window window(&window_delegate);
  84. window.Init(ui::LAYER_NOT_DRAWN);
  85. window.SetName("event window");
  86. window_manager->AddWindow(&window);
  87. window.SetBounds(gfx::Rect(0, 0, 1280, 720));
  88. window.Show();
  89. EXPECT_FALSE(window.IsRootWindow());
  90. EXPECT_TRUE(window.GetHost());
  91. // Confirm that the Aura focus client tracks window focus correctly.
  92. aura::client::FocusClient* focus_client =
  93. aura::client::GetFocusClient(&window);
  94. EXPECT_TRUE(focus_client);
  95. EXPECT_FALSE(focus_client->GetFocusedWindow());
  96. window.Focus();
  97. EXPECT_EQ(&window, focus_client->GetFocusedWindow());
  98. // Confirm that a key event is *not* delivered to the window when input is
  99. // disabled.
  100. ui::test::EventGenerator event_generator(window.GetRootWindow());
  101. event_generator.PressKey(ui::VKEY_0, ui::EF_NONE);
  102. EXPECT_EQ(ui::VKEY_UNKNOWN, window_delegate.key_code());
  103. }
  104. void VerifyWindowOrder(aura::Window* root_window) {
  105. for (size_t i = 0; i < root_window->children().size() - 1; ++i)
  106. EXPECT_LE(root_window->children()[i]->GetId(),
  107. root_window->children()[i + 1]->GetId());
  108. }
  109. TEST_F(CastWindowManagerAuraTest, CheckProperWindowOrdering) {
  110. std::unique_ptr<CastWindowManagerAura> window_manager =
  111. std::make_unique<CastWindowManagerAura>(false /* enable input */);
  112. TestWindow window1(1);
  113. TestWindow window3(3);
  114. window_manager->AddWindow(window1.window());
  115. window_manager->AddWindow(window3.window());
  116. window1.window()->Show();
  117. window3.window()->Show();
  118. // Verify update for top window.
  119. VerifyWindowOrder(window_manager->GetRootWindow());
  120. TestWindow window0(0);
  121. window_manager->AddWindow(window0.window());
  122. window0.window()->Show();
  123. // Verify update for bottom window.
  124. VerifyWindowOrder(window_manager->GetRootWindow());
  125. TestWindow window2(2);
  126. window_manager->AddWindow(window2.window());
  127. window2.window()->Show();
  128. // Verify update for middle window.
  129. VerifyWindowOrder(window_manager->GetRootWindow());
  130. TestWindow window4(4);
  131. TestWindow window5(5);
  132. TestWindow window6(6);
  133. window_manager->AddWindow(window6.window());
  134. window_manager->AddWindow(window4.window());
  135. window_manager->AddWindow(window5.window());
  136. window5.window()->Show();
  137. // Verify update with hidden windows.
  138. VerifyWindowOrder(window_manager->GetRootWindow());
  139. TestWindow window7(2);
  140. window_manager->AddWindow(window7.window());
  141. window7.window()->Show();
  142. // Verify update with same window ID.
  143. VerifyWindowOrder(window_manager->GetRootWindow());
  144. EXPECT_EQ(window7.window(), window_manager->GetRootWindow()->children()[3]);
  145. window2.window()->Hide();
  146. window2.window()->Show();
  147. // Verify update ordering with same window ID.
  148. EXPECT_EQ(window2.window(), window_manager->GetRootWindow()->children()[3]);
  149. }
  150. } // namespace test
  151. } // namespace chromecast