mirror_window_controller_unittest.cc 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. // Copyright (c) 2013 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 "ash/display/mirror_window_controller.h"
  5. #include "ash/display/mirror_window_test_api.h"
  6. #include "ash/display/window_tree_host_manager.h"
  7. #include "ash/shell.h"
  8. #include "ash/test/ash_test_base.h"
  9. #include "ash/wm/cursor_manager_test_api.h"
  10. #include "base/command_line.h"
  11. #include "base/run_loop.h"
  12. #include "base/strings/stringprintf.h"
  13. #include "testing/gtest/include/gtest/gtest.h"
  14. #include "ui/aura/env.h"
  15. #include "ui/aura/test/test_window_delegate.h"
  16. #include "ui/aura/test/test_windows.h"
  17. #include "ui/aura/window.h"
  18. #include "ui/aura/window_event_dispatcher.h"
  19. #include "ui/base/hit_test.h"
  20. #include "ui/display/display_switches.h"
  21. #include "ui/display/display_transform.h"
  22. #include "ui/display/manager/display_manager.h"
  23. #include "ui/display/test/display_manager_test_api.h"
  24. #include "ui/display/types/display_constants.h"
  25. #include "ui/events/test/event_generator.h"
  26. #include "ui/gfx/overlay_transform.h"
  27. namespace ash {
  28. namespace {
  29. display::ManagedDisplayInfo CreateDisplayInfo(int64_t id,
  30. const gfx::Rect& bounds,
  31. float scale = 1.f) {
  32. display::ManagedDisplayInfo info(
  33. id, base::StringPrintf("x-%d", static_cast<int>(id)), false);
  34. info.SetBounds(bounds);
  35. info.set_device_scale_factor(scale);
  36. return info;
  37. }
  38. class MirrorOnBootTest : public AshTestBase {
  39. public:
  40. MirrorOnBootTest() = default;
  41. MirrorOnBootTest(const MirrorOnBootTest&) = delete;
  42. MirrorOnBootTest& operator=(const MirrorOnBootTest&) = delete;
  43. ~MirrorOnBootTest() override = default;
  44. void SetUp() override {
  45. base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
  46. ::switches::kHostWindowBounds, "1+1-400x300,1+301-400x300");
  47. base::CommandLine::ForCurrentProcess()->AppendSwitch(
  48. ::switches::kEnableSoftwareMirroring);
  49. AshTestBase::SetUp();
  50. }
  51. };
  52. } // namespace
  53. using MirrorWindowControllerTest = AshTestBase;
  54. // Make sure that the compositor based mirroring can switch
  55. // from/to dock mode.
  56. TEST_F(MirrorWindowControllerTest, DockMode) {
  57. const int64_t internal_id = 1;
  58. const int64_t external_id = 2;
  59. const display::ManagedDisplayInfo internal_display_info =
  60. CreateDisplayInfo(internal_id, gfx::Rect(0, 0, 400, 500));
  61. const display::ManagedDisplayInfo external_display_info =
  62. CreateDisplayInfo(external_id, gfx::Rect(1, 1, 200, 100));
  63. std::vector<display::ManagedDisplayInfo> display_info_list;
  64. // software mirroring.
  65. display_info_list.push_back(internal_display_info);
  66. display_info_list.push_back(external_display_info);
  67. display_manager()->OnNativeDisplaysChanged(display_info_list);
  68. const int64_t internal_display_id =
  69. display::test::DisplayManagerTestApi(display_manager())
  70. .SetFirstDisplayAsInternalDisplay();
  71. EXPECT_EQ(internal_id, internal_display_id);
  72. display_manager()->SetMirrorMode(display::MirrorMode::kNormal, absl::nullopt);
  73. base::RunLoop().RunUntilIdle();
  74. EXPECT_EQ(1U, display_manager()->GetNumDisplays());
  75. EXPECT_TRUE(display_manager()->IsInSoftwareMirrorMode());
  76. EXPECT_EQ(external_id,
  77. display_manager()->GetMirroringDestinationDisplayIdList()[0]);
  78. // dock mode.
  79. display_info_list.clear();
  80. display_info_list.push_back(external_display_info);
  81. display_manager()->OnNativeDisplaysChanged(display_info_list);
  82. EXPECT_EQ(1U, display_manager()->GetNumDisplays());
  83. EXPECT_FALSE(display_manager()->IsInMirrorMode());
  84. // back to software mirroring.
  85. display_info_list.clear();
  86. display_info_list.push_back(internal_display_info);
  87. display_info_list.push_back(external_display_info);
  88. display_manager()->OnNativeDisplaysChanged(display_info_list);
  89. EXPECT_EQ(1U, display_manager()->GetNumDisplays());
  90. EXPECT_TRUE(display_manager()->IsInMirrorMode());
  91. EXPECT_EQ(external_id,
  92. display_manager()->GetMirroringDestinationDisplayIdList()[0]);
  93. }
  94. TEST_F(MirrorOnBootTest, MirrorOnBoot) {
  95. EXPECT_TRUE(display_manager()->IsInMirrorMode());
  96. base::RunLoop().RunUntilIdle();
  97. MirrorWindowTestApi test_api;
  98. EXPECT_EQ(1U, test_api.GetHosts().size());
  99. }
  100. class MirrorWindowControllerRotationAndPanelOrientationTest
  101. : public MirrorWindowControllerTest,
  102. public testing::WithParamInterface<
  103. std::tuple<display::Display::Rotation, display::PanelOrientation>> {};
  104. // Test that the mirror display matches the size and rotation of the source.
  105. TEST_P(MirrorWindowControllerRotationAndPanelOrientationTest, MirrorSize) {
  106. const int64_t primary_id = 1;
  107. const int64_t mirror_id = 2;
  108. const display::Display::Rotation active_rotation = std::get<0>(GetParam());
  109. const display::PanelOrientation panel_orientation = std::get<1>(GetParam());
  110. // Run the test with and without display scaling.
  111. int scale_factors[] = {1, 2};
  112. for (int scale : scale_factors) {
  113. display::ManagedDisplayInfo primary_display_info =
  114. CreateDisplayInfo(primary_id, gfx::Rect(0, 0, 400, 300), scale);
  115. primary_display_info.set_panel_orientation(panel_orientation);
  116. primary_display_info.SetRotation(active_rotation,
  117. display::Display::RotationSource::ACTIVE);
  118. const display::ManagedDisplayInfo mirror_display_info =
  119. CreateDisplayInfo(mirror_id, gfx::Rect(400, 0, 600, 500), scale);
  120. std::vector<display::ManagedDisplayInfo> display_info_list = {
  121. primary_display_info, mirror_display_info};
  122. // Start software mirroring.
  123. display_manager()->OnNativeDisplaysChanged(display_info_list);
  124. display_manager()->SetMirrorMode(display::MirrorMode::kNormal,
  125. absl::nullopt);
  126. base::RunLoop().RunUntilIdle();
  127. EXPECT_EQ(1U, display_manager()->GetNumDisplays());
  128. EXPECT_TRUE(display_manager()->IsInSoftwareMirrorMode());
  129. // Check the size of the mirror window.
  130. const display::Display& primary_display =
  131. display_manager()->GetDisplayForId(primary_id);
  132. aura::Window* root_window = Shell::GetRootWindowForDisplayId(mirror_id);
  133. aura::Window* mirror_window = root_window->children()[0];
  134. EXPECT_EQ(primary_display.GetSizeInPixel(), root_window->bounds().size());
  135. EXPECT_EQ(primary_display.GetSizeInPixel(), mirror_window->bounds().size());
  136. // Mirror should have a display transform hint that matches the active
  137. // rotation (excluding the panel orientation) of the source.
  138. EXPECT_EQ(display::DisplayRotationToOverlayTransform(active_rotation),
  139. root_window->GetHost()->compositor()->display_transform_hint());
  140. }
  141. }
  142. INSTANTIATE_TEST_SUITE_P(
  143. All,
  144. MirrorWindowControllerRotationAndPanelOrientationTest,
  145. testing::Combine(testing::Values(display::Display::ROTATE_0,
  146. display::Display::ROTATE_90,
  147. display::Display::ROTATE_180,
  148. display::Display::ROTATE_270),
  149. testing::Values(display::PanelOrientation::kNormal,
  150. display::PanelOrientation::kBottomUp,
  151. display::PanelOrientation::kLeftUp,
  152. display::PanelOrientation::kRightUp)));
  153. } // namespace ash