| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/display/display_change_observer_chromeos.h" | 5 #include "ash/display/display_change_observer_chromeos.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 #include "ui/display/chromeos/display_configurator.h" | 9 #include "ui/display/chromeos/display_configurator.h" |
| 10 #include "ui/display/chromeos/test/test_display_snapshot.h" | 10 #include "ui/display/fake_display_snapshot.h" |
| 11 #include "ui/display/manager/managed_display_info.h" | 11 #include "ui/display/manager/managed_display_info.h" |
| 12 #include "ui/display/types/display_mode.h" | 12 #include "ui/display/types/display_mode.h" |
| 13 | 13 |
| 14 using ui::DisplayConfigurator; | 14 using ui::DisplayConfigurator; |
| 15 | 15 |
| 16 typedef testing::Test DisplayChangeObserverTest; | |
| 17 | |
| 18 namespace ash { | 16 namespace ash { |
| 19 | 17 |
| 20 TEST_F(DisplayChangeObserverTest, GetExternalManagedDisplayModeList) { | 18 namespace { |
| 21 std::vector<std::unique_ptr<const ui::DisplayMode>> modes; | |
| 22 modes.push_back( | |
| 23 base::MakeUnique<ui::DisplayMode>(gfx::Size(1920, 1200), false, 60)); | |
| 24 | 19 |
| 25 // All non-interlaced (as would be seen with different refresh rates). | 20 float ComputeDeviceScaleFactor(float diagonal_inch, |
| 26 modes.push_back( | 21 const gfx::Rect& resolution) { |
| 27 base::MakeUnique<ui::DisplayMode>(gfx::Size(1920, 1080), false, 80)); | 22 // We assume that displays have square pixel. |
| 28 modes.push_back( | 23 float diagonal_pixel = std::sqrt(std::pow(resolution.width(), 2) + |
| 29 base::MakeUnique<ui::DisplayMode>(gfx::Size(1920, 1080), false, 70)); | 24 std::pow(resolution.height(), 2)); |
| 30 modes.push_back( | 25 float dpi = diagonal_pixel / diagonal_inch; |
| 31 base::MakeUnique<ui::DisplayMode>(gfx::Size(1920, 1080), false, 60)); | 26 return DisplayChangeObserver::FindDeviceScaleFactor(dpi); |
| 27 } |
| 32 | 28 |
| 33 // Interlaced vs non-interlaced. | 29 std::unique_ptr<ui::DisplayMode> MakeDisplayMode(int width, |
| 34 modes.push_back( | 30 int height, |
| 35 base::MakeUnique<ui::DisplayMode>(gfx::Size(1280, 720), true, 60)); | 31 bool is_interlaced, |
| 36 modes.push_back( | 32 float refresh_rate) { |
| 37 base::MakeUnique<ui::DisplayMode>(gfx::Size(1280, 720), false, 60)); | 33 return base::MakeUnique<ui::DisplayMode>(gfx::Size(width, height), |
| 34 is_interlaced, refresh_rate); |
| 35 } |
| 38 | 36 |
| 39 // Interlaced only. | 37 } // namespace |
| 40 modes.push_back( | |
| 41 base::MakeUnique<ui::DisplayMode>(gfx::Size(1024, 768), true, 70)); | |
| 42 modes.push_back( | |
| 43 base::MakeUnique<ui::DisplayMode>(gfx::Size(1024, 768), true, 60)); | |
| 44 | 38 |
| 45 // Mixed. | 39 TEST(DisplayChangeObserverTest, GetExternalManagedDisplayModeList) { |
| 46 modes.push_back( | 40 std::unique_ptr<ui::DisplaySnapshot> display_snapshot = |
| 47 base::MakeUnique<ui::DisplayMode>(gfx::Size(1024, 600), true, 60)); | 41 display::FakeDisplaySnapshot::Builder() |
| 48 modes.push_back( | 42 .SetId(123) |
| 49 base::MakeUnique<ui::DisplayMode>(gfx::Size(1024, 600), false, 70)); | 43 .SetNativeMode(MakeDisplayMode(1920, 1200, false, 60)) |
| 50 modes.push_back( | 44 // All non-interlaced (as would be seen with different refresh rates). |
| 51 base::MakeUnique<ui::DisplayMode>(gfx::Size(1024, 600), false, 60)); | 45 .AddMode(MakeDisplayMode(1920, 1080, false, 80)) |
| 52 | 46 .AddMode(MakeDisplayMode(1920, 1080, false, 70)) |
| 53 // Just one interlaced mode. | 47 .AddMode(MakeDisplayMode(1920, 1080, false, 60)) |
| 54 modes.push_back( | 48 // Interlaced vs non-interlaced. |
| 55 base::MakeUnique<ui::DisplayMode>(gfx::Size(640, 480), true, 60)); | 49 .AddMode(MakeDisplayMode(1280, 720, true, 60)) |
| 56 | 50 .AddMode(MakeDisplayMode(1280, 720, false, 60)) |
| 57 ui::TestDisplaySnapshot display_snapshot; | 51 // Interlaced only. |
| 58 display_snapshot.set_modes(std::move(modes)); | 52 .AddMode(MakeDisplayMode(1024, 768, true, 70)) |
| 53 .AddMode(MakeDisplayMode(1024, 768, true, 60)) |
| 54 // Mixed. |
| 55 .AddMode(MakeDisplayMode(1024, 600, true, 60)) |
| 56 .AddMode(MakeDisplayMode(1024, 600, false, 70)) |
| 57 .AddMode(MakeDisplayMode(1024, 600, false, 60)) |
| 58 // Just one interlaced mode. |
| 59 .AddMode(MakeDisplayMode(640, 480, true, 60)) |
| 60 .Build(); |
| 59 | 61 |
| 60 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = | 62 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = |
| 61 DisplayChangeObserver::GetExternalManagedDisplayModeList( | 63 DisplayChangeObserver::GetExternalManagedDisplayModeList( |
| 62 display_snapshot); | 64 *display_snapshot); |
| 63 ASSERT_EQ(6u, display_modes.size()); | 65 ASSERT_EQ(6u, display_modes.size()); |
| 64 EXPECT_EQ("640x480", display_modes[0]->size().ToString()); | 66 EXPECT_EQ("640x480", display_modes[0]->size().ToString()); |
| 65 EXPECT_TRUE(display_modes[0]->is_interlaced()); | 67 EXPECT_TRUE(display_modes[0]->is_interlaced()); |
| 66 EXPECT_EQ(display_modes[0]->refresh_rate(), 60); | 68 EXPECT_EQ(display_modes[0]->refresh_rate(), 60); |
| 67 | 69 |
| 68 EXPECT_EQ("1024x600", display_modes[1]->size().ToString()); | 70 EXPECT_EQ("1024x600", display_modes[1]->size().ToString()); |
| 69 EXPECT_FALSE(display_modes[1]->is_interlaced()); | 71 EXPECT_FALSE(display_modes[1]->is_interlaced()); |
| 70 EXPECT_EQ(display_modes[1]->refresh_rate(), 70); | 72 EXPECT_EQ(display_modes[1]->refresh_rate(), 70); |
| 71 | 73 |
| 72 EXPECT_EQ("1024x768", display_modes[2]->size().ToString()); | 74 EXPECT_EQ("1024x768", display_modes[2]->size().ToString()); |
| 73 EXPECT_TRUE(display_modes[2]->is_interlaced()); | 75 EXPECT_TRUE(display_modes[2]->is_interlaced()); |
| 74 EXPECT_EQ(display_modes[2]->refresh_rate(), 70); | 76 EXPECT_EQ(display_modes[2]->refresh_rate(), 70); |
| 75 | 77 |
| 76 EXPECT_EQ("1280x720", display_modes[3]->size().ToString()); | 78 EXPECT_EQ("1280x720", display_modes[3]->size().ToString()); |
| 77 EXPECT_FALSE(display_modes[3]->is_interlaced()); | 79 EXPECT_FALSE(display_modes[3]->is_interlaced()); |
| 78 EXPECT_EQ(display_modes[3]->refresh_rate(), 60); | 80 EXPECT_EQ(display_modes[3]->refresh_rate(), 60); |
| 79 | 81 |
| 80 EXPECT_EQ("1920x1080", display_modes[4]->size().ToString()); | 82 EXPECT_EQ("1920x1080", display_modes[4]->size().ToString()); |
| 81 EXPECT_FALSE(display_modes[4]->is_interlaced()); | 83 EXPECT_FALSE(display_modes[4]->is_interlaced()); |
| 82 EXPECT_EQ(display_modes[4]->refresh_rate(), 80); | 84 EXPECT_EQ(display_modes[4]->refresh_rate(), 80); |
| 83 | 85 |
| 84 EXPECT_EQ("1920x1200", display_modes[5]->size().ToString()); | 86 EXPECT_EQ("1920x1200", display_modes[5]->size().ToString()); |
| 85 EXPECT_FALSE(display_modes[5]->is_interlaced()); | 87 EXPECT_FALSE(display_modes[5]->is_interlaced()); |
| 86 EXPECT_EQ(display_modes[5]->refresh_rate(), 60); | 88 EXPECT_EQ(display_modes[5]->refresh_rate(), 60); |
| 89 } |
| 87 | 90 |
| 88 // Outputs without any modes shouldn't cause a crash. | 91 TEST(DisplayChangeObserverTest, GetEmptyExternalManagedDisplayModeList) { |
| 89 modes.clear(); | 92 display::FakeDisplaySnapshot display_snapshot( |
| 90 display_snapshot.set_modes(std::move(modes)); | 93 123, gfx::Point(), gfx::Size(), ui::DISPLAY_CONNECTION_TYPE_UNKNOWN, |
| 94 false, false, false, std::string(), 0, |
| 95 std::vector<std::unique_ptr<const ui::DisplayMode>>(), nullptr, nullptr); |
| 91 | 96 |
| 92 display_modes = DisplayChangeObserver::GetExternalManagedDisplayModeList( | 97 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = |
| 93 display_snapshot); | 98 DisplayChangeObserver::GetExternalManagedDisplayModeList( |
| 99 display_snapshot); |
| 94 EXPECT_EQ(0u, display_modes.size()); | 100 EXPECT_EQ(0u, display_modes.size()); |
| 95 } | 101 } |
| 96 | 102 |
| 97 TEST_F(DisplayChangeObserverTest, GetInternalManagedDisplayModeList) { | 103 TEST(DisplayChangeObserverTest, GetInternalManagedDisplayModeList) { |
| 98 std::vector<std::unique_ptr<const ui::DisplayMode>> modes; | 104 std::unique_ptr<ui::DisplaySnapshot> display_snapshot = |
| 99 // Data picked from peppy. | 105 display::FakeDisplaySnapshot::Builder() |
| 100 modes.push_back( | 106 .SetId(123) |
| 101 base::MakeUnique<ui::DisplayMode>(gfx::Size(1366, 768), false, 60)); | 107 .SetNativeMode(MakeDisplayMode(1366, 768, false, 60)) |
| 102 modes.push_back( | 108 .AddMode(MakeDisplayMode(1024, 768, false, 60)) |
| 103 base::MakeUnique<ui::DisplayMode>(gfx::Size(1024, 768), false, 60)); | 109 .AddMode(MakeDisplayMode(800, 600, false, 60)) |
| 104 modes.push_back( | 110 .AddMode(MakeDisplayMode(600, 600, false, 56.2)) |
| 105 base::MakeUnique<ui::DisplayMode>(gfx::Size(800, 600), false, 60)); | 111 .AddMode(MakeDisplayMode(640, 480, false, 59.9)) |
| 106 modes.push_back( | 112 .Build(); |
| 107 base::MakeUnique<ui::DisplayMode>(gfx::Size(600, 600), false, 56.2)); | |
| 108 modes.push_back( | |
| 109 base::MakeUnique<ui::DisplayMode>(gfx::Size(640, 480), false, 59.9)); | |
| 110 | |
| 111 ui::TestDisplaySnapshot display_snapshot; | |
| 112 display_snapshot.set_native_mode(modes[0].get()); | |
| 113 display_snapshot.set_modes(std::move(modes)); | |
| 114 | 113 |
| 115 display::ManagedDisplayInfo info(1, "", false); | 114 display::ManagedDisplayInfo info(1, "", false); |
| 116 info.SetBounds(gfx::Rect(0, 0, 1366, 768)); | 115 info.SetBounds(gfx::Rect(0, 0, 1366, 768)); |
| 117 | 116 |
| 118 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = | 117 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = |
| 119 DisplayChangeObserver::GetInternalManagedDisplayModeList( | 118 DisplayChangeObserver::GetInternalManagedDisplayModeList( |
| 120 info, display_snapshot); | 119 info, *display_snapshot); |
| 121 ASSERT_EQ(5u, display_modes.size()); | 120 ASSERT_EQ(5u, display_modes.size()); |
| 122 EXPECT_EQ("1366x768", display_modes[0]->size().ToString()); | 121 EXPECT_EQ("1366x768", display_modes[0]->size().ToString()); |
| 123 EXPECT_FALSE(display_modes[0]->native()); | 122 EXPECT_FALSE(display_modes[0]->native()); |
| 124 EXPECT_NEAR(display_modes[0]->ui_scale(), 0.5, 0.01); | 123 EXPECT_NEAR(display_modes[0]->ui_scale(), 0.5, 0.01); |
| 125 EXPECT_EQ(display_modes[0]->refresh_rate(), 60); | 124 EXPECT_EQ(display_modes[0]->refresh_rate(), 60); |
| 126 | 125 |
| 127 EXPECT_EQ("1366x768", display_modes[1]->size().ToString()); | 126 EXPECT_EQ("1366x768", display_modes[1]->size().ToString()); |
| 128 EXPECT_FALSE(display_modes[1]->native()); | 127 EXPECT_FALSE(display_modes[1]->native()); |
| 129 EXPECT_NEAR(display_modes[1]->ui_scale(), 0.6, 0.01); | 128 EXPECT_NEAR(display_modes[1]->ui_scale(), 0.6, 0.01); |
| 130 EXPECT_EQ(display_modes[1]->refresh_rate(), 60); | 129 EXPECT_EQ(display_modes[1]->refresh_rate(), 60); |
| 131 | 130 |
| 132 EXPECT_EQ("1366x768", display_modes[2]->size().ToString()); | 131 EXPECT_EQ("1366x768", display_modes[2]->size().ToString()); |
| 133 EXPECT_FALSE(display_modes[2]->native()); | 132 EXPECT_FALSE(display_modes[2]->native()); |
| 134 EXPECT_NEAR(display_modes[2]->ui_scale(), 0.75, 0.01); | 133 EXPECT_NEAR(display_modes[2]->ui_scale(), 0.75, 0.01); |
| 135 EXPECT_EQ(display_modes[2]->refresh_rate(), 60); | 134 EXPECT_EQ(display_modes[2]->refresh_rate(), 60); |
| 136 | 135 |
| 137 EXPECT_EQ("1366x768", display_modes[3]->size().ToString()); | 136 EXPECT_EQ("1366x768", display_modes[3]->size().ToString()); |
| 138 EXPECT_TRUE(display_modes[3]->native()); | 137 EXPECT_TRUE(display_modes[3]->native()); |
| 139 EXPECT_NEAR(display_modes[3]->ui_scale(), 1.0, 0.01); | 138 EXPECT_NEAR(display_modes[3]->ui_scale(), 1.0, 0.01); |
| 140 EXPECT_EQ(display_modes[3]->refresh_rate(), 60); | 139 EXPECT_EQ(display_modes[3]->refresh_rate(), 60); |
| 141 | 140 |
| 142 EXPECT_EQ("1366x768", display_modes[4]->size().ToString()); | 141 EXPECT_EQ("1366x768", display_modes[4]->size().ToString()); |
| 143 EXPECT_FALSE(display_modes[4]->native()); | 142 EXPECT_FALSE(display_modes[4]->native()); |
| 144 EXPECT_NEAR(display_modes[4]->ui_scale(), 1.125, 0.01); | 143 EXPECT_NEAR(display_modes[4]->ui_scale(), 1.125, 0.01); |
| 145 EXPECT_EQ(display_modes[4]->refresh_rate(), 60); | 144 EXPECT_EQ(display_modes[4]->refresh_rate(), 60); |
| 146 } | 145 } |
| 147 | 146 |
| 148 TEST_F(DisplayChangeObserverTest, GetInternalHiDPIManagedDisplayModeList) { | 147 TEST(DisplayChangeObserverTest, GetInternalHiDPIManagedDisplayModeList) { |
| 149 std::vector<std::unique_ptr<const ui::DisplayMode>> modes; | |
| 150 // Data picked from peppy. | 148 // Data picked from peppy. |
| 151 modes.push_back( | 149 std::unique_ptr<ui::DisplaySnapshot> display_snapshot = |
| 152 base::MakeUnique<ui::DisplayMode>(gfx::Size(2560, 1700), false, 60)); | 150 display::FakeDisplaySnapshot::Builder() |
| 153 modes.push_back( | 151 .SetId(123) |
| 154 base::MakeUnique<ui::DisplayMode>(gfx::Size(2048, 1536), false, 60)); | 152 .SetNativeMode(MakeDisplayMode(2560, 1700, false, 60)) |
| 155 modes.push_back( | 153 .AddMode(MakeDisplayMode(2048, 1536, false, 60)) |
| 156 base::MakeUnique<ui::DisplayMode>(gfx::Size(1920, 1440), false, 60)); | 154 .AddMode(MakeDisplayMode(1920, 1440, false, 60)) |
| 157 | 155 .Build(); |
| 158 ui::TestDisplaySnapshot display_snapshot; | |
| 159 display_snapshot.set_native_mode(modes[0].get()); | |
| 160 display_snapshot.set_modes(std::move(modes)); | |
| 161 | 156 |
| 162 display::ManagedDisplayInfo info(1, "", false); | 157 display::ManagedDisplayInfo info(1, "", false); |
| 163 info.SetBounds(gfx::Rect(0, 0, 2560, 1700)); | 158 info.SetBounds(gfx::Rect(0, 0, 2560, 1700)); |
| 164 info.set_device_scale_factor(2.0f); | 159 info.set_device_scale_factor(2.0f); |
| 165 | 160 |
| 166 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = | 161 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = |
| 167 DisplayChangeObserver::GetInternalManagedDisplayModeList( | 162 DisplayChangeObserver::GetInternalManagedDisplayModeList( |
| 168 info, display_snapshot); | 163 info, *display_snapshot); |
| 169 ASSERT_EQ(8u, display_modes.size()); | 164 ASSERT_EQ(8u, display_modes.size()); |
| 170 EXPECT_EQ("2560x1700", display_modes[0]->size().ToString()); | 165 EXPECT_EQ("2560x1700", display_modes[0]->size().ToString()); |
| 171 EXPECT_FALSE(display_modes[0]->native()); | 166 EXPECT_FALSE(display_modes[0]->native()); |
| 172 EXPECT_NEAR(display_modes[0]->ui_scale(), 0.5, 0.01); | 167 EXPECT_NEAR(display_modes[0]->ui_scale(), 0.5, 0.01); |
| 173 EXPECT_EQ(display_modes[0]->refresh_rate(), 60); | 168 EXPECT_EQ(display_modes[0]->refresh_rate(), 60); |
| 174 | 169 |
| 175 EXPECT_EQ("2560x1700", display_modes[1]->size().ToString()); | 170 EXPECT_EQ("2560x1700", display_modes[1]->size().ToString()); |
| 176 EXPECT_FALSE(display_modes[1]->native()); | 171 EXPECT_FALSE(display_modes[1]->native()); |
| 177 EXPECT_NEAR(display_modes[1]->ui_scale(), 0.625, 0.01); | 172 EXPECT_NEAR(display_modes[1]->ui_scale(), 0.625, 0.01); |
| 178 EXPECT_EQ(display_modes[1]->refresh_rate(), 60); | 173 EXPECT_EQ(display_modes[1]->refresh_rate(), 60); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 201 EXPECT_FALSE(display_modes[6]->native()); | 196 EXPECT_FALSE(display_modes[6]->native()); |
| 202 EXPECT_NEAR(display_modes[6]->ui_scale(), 1.5, 0.01); | 197 EXPECT_NEAR(display_modes[6]->ui_scale(), 1.5, 0.01); |
| 203 EXPECT_EQ(display_modes[6]->refresh_rate(), 60); | 198 EXPECT_EQ(display_modes[6]->refresh_rate(), 60); |
| 204 | 199 |
| 205 EXPECT_EQ("2560x1700", display_modes[7]->size().ToString()); | 200 EXPECT_EQ("2560x1700", display_modes[7]->size().ToString()); |
| 206 EXPECT_TRUE(display_modes[7]->native()); | 201 EXPECT_TRUE(display_modes[7]->native()); |
| 207 EXPECT_NEAR(display_modes[7]->ui_scale(), 2.0, 0.01); | 202 EXPECT_NEAR(display_modes[7]->ui_scale(), 2.0, 0.01); |
| 208 EXPECT_EQ(display_modes[7]->refresh_rate(), 60); | 203 EXPECT_EQ(display_modes[7]->refresh_rate(), 60); |
| 209 } | 204 } |
| 210 | 205 |
| 211 TEST_F(DisplayChangeObserverTest, GetInternalManagedDisplayModeList1_25) { | 206 TEST(DisplayChangeObserverTest, GetInternalManagedDisplayModeList1_25) { |
| 212 std::vector<std::unique_ptr<const ui::DisplayMode>> modes; | |
| 213 // Data picked from peppy. | 207 // Data picked from peppy. |
| 214 modes.push_back( | 208 std::unique_ptr<ui::DisplaySnapshot> display_snapshot = |
| 215 base::MakeUnique<ui::DisplayMode>(gfx::Size(1920, 1080), false, 60)); | 209 display::FakeDisplaySnapshot::Builder() |
| 216 | 210 .SetId(123) |
| 217 ui::TestDisplaySnapshot display_snapshot; | 211 .SetNativeMode(MakeDisplayMode(1920, 1080, false, 60)) |
| 218 display_snapshot.set_native_mode(modes[0].get()); | 212 .Build(); |
| 219 display_snapshot.set_modes(std::move(modes)); | |
| 220 | 213 |
| 221 display::ManagedDisplayInfo info(1, "", false); | 214 display::ManagedDisplayInfo info(1, "", false); |
| 222 info.SetBounds(gfx::Rect(0, 0, 1920, 1080)); | 215 info.SetBounds(gfx::Rect(0, 0, 1920, 1080)); |
| 223 info.set_device_scale_factor(1.25); | 216 info.set_device_scale_factor(1.25); |
| 224 | 217 |
| 225 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = | 218 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = |
| 226 DisplayChangeObserver::GetInternalManagedDisplayModeList( | 219 DisplayChangeObserver::GetInternalManagedDisplayModeList( |
| 227 info, display_snapshot); | 220 info, *display_snapshot); |
| 228 ASSERT_EQ(5u, display_modes.size()); | 221 ASSERT_EQ(5u, display_modes.size()); |
| 229 EXPECT_EQ("1920x1080", display_modes[0]->size().ToString()); | 222 EXPECT_EQ("1920x1080", display_modes[0]->size().ToString()); |
| 230 EXPECT_FALSE(display_modes[0]->native()); | 223 EXPECT_FALSE(display_modes[0]->native()); |
| 231 EXPECT_NEAR(display_modes[0]->ui_scale(), 0.5, 0.01); | 224 EXPECT_NEAR(display_modes[0]->ui_scale(), 0.5, 0.01); |
| 232 EXPECT_EQ(display_modes[0]->refresh_rate(), 60); | 225 EXPECT_EQ(display_modes[0]->refresh_rate(), 60); |
| 233 | 226 |
| 234 EXPECT_EQ("1920x1080", display_modes[1]->size().ToString()); | 227 EXPECT_EQ("1920x1080", display_modes[1]->size().ToString()); |
| 235 EXPECT_FALSE(display_modes[1]->native()); | 228 EXPECT_FALSE(display_modes[1]->native()); |
| 236 EXPECT_NEAR(display_modes[1]->ui_scale(), 0.625, 0.01); | 229 EXPECT_NEAR(display_modes[1]->ui_scale(), 0.625, 0.01); |
| 237 EXPECT_EQ(display_modes[1]->refresh_rate(), 60); | 230 EXPECT_EQ(display_modes[1]->refresh_rate(), 60); |
| 238 | 231 |
| 239 EXPECT_EQ("1920x1080", display_modes[2]->size().ToString()); | 232 EXPECT_EQ("1920x1080", display_modes[2]->size().ToString()); |
| 240 EXPECT_FALSE(display_modes[2]->native()); | 233 EXPECT_FALSE(display_modes[2]->native()); |
| 241 EXPECT_NEAR(display_modes[2]->ui_scale(), 0.8, 0.01); | 234 EXPECT_NEAR(display_modes[2]->ui_scale(), 0.8, 0.01); |
| 242 EXPECT_EQ(display_modes[2]->refresh_rate(), 60); | 235 EXPECT_EQ(display_modes[2]->refresh_rate(), 60); |
| 243 | 236 |
| 244 EXPECT_EQ("1920x1080", display_modes[3]->size().ToString()); | 237 EXPECT_EQ("1920x1080", display_modes[3]->size().ToString()); |
| 245 EXPECT_TRUE(display_modes[3]->native()); | 238 EXPECT_TRUE(display_modes[3]->native()); |
| 246 EXPECT_NEAR(display_modes[3]->ui_scale(), 1.0, 0.01); | 239 EXPECT_NEAR(display_modes[3]->ui_scale(), 1.0, 0.01); |
| 247 EXPECT_EQ(display_modes[3]->refresh_rate(), 60); | 240 EXPECT_EQ(display_modes[3]->refresh_rate(), 60); |
| 248 | 241 |
| 249 EXPECT_EQ("1920x1080", display_modes[4]->size().ToString()); | 242 EXPECT_EQ("1920x1080", display_modes[4]->size().ToString()); |
| 250 EXPECT_FALSE(display_modes[4]->native()); | 243 EXPECT_FALSE(display_modes[4]->native()); |
| 251 EXPECT_NEAR(display_modes[4]->ui_scale(), 1.25, 0.01); | 244 EXPECT_NEAR(display_modes[4]->ui_scale(), 1.25, 0.01); |
| 252 EXPECT_EQ(display_modes[4]->refresh_rate(), 60); | 245 EXPECT_EQ(display_modes[4]->refresh_rate(), 60); |
| 253 } | 246 } |
| 254 | 247 |
| 255 TEST_F(DisplayChangeObserverTest, GetExternalManagedDisplayModeList4K) { | 248 TEST(DisplayChangeObserverTest, GetExternalManagedDisplayModeList4K) { |
| 256 std::vector<std::unique_ptr<const ui::DisplayMode>> modes; | 249 std::unique_ptr<ui::DisplaySnapshot> display_snapshot = |
| 257 modes.push_back( | 250 display::FakeDisplaySnapshot::Builder() |
| 258 base::MakeUnique<ui::DisplayMode>(gfx::Size(3840, 2160), false, 30)); | 251 .SetId(123) |
| 259 modes.push_back( | 252 .SetNativeMode(MakeDisplayMode(3840, 2160, false, 30)) |
| 260 base::MakeUnique<ui::DisplayMode>(gfx::Size(1920, 1200), false, 60)); | 253 .AddMode(MakeDisplayMode(1920, 1200, false, 60)) |
| 261 | 254 // All non-interlaced (as would be seen with different refresh rates). |
| 262 // All non-interlaced (as would be seen with different refresh rates). | 255 .AddMode(MakeDisplayMode(1920, 1080, false, 80)) |
| 263 modes.push_back( | 256 .AddMode(MakeDisplayMode(1920, 1080, false, 70)) |
| 264 base::MakeUnique<ui::DisplayMode>(gfx::Size(1920, 1080), false, 80)); | 257 .AddMode(MakeDisplayMode(1920, 1080, false, 60)) |
| 265 modes.push_back( | 258 // Interlaced vs non-interlaced. |
| 266 base::MakeUnique<ui::DisplayMode>(gfx::Size(1920, 1080), false, 70)); | 259 .AddMode(MakeDisplayMode(1280, 720, true, 60)) |
| 267 modes.push_back( | 260 .AddMode(MakeDisplayMode(1280, 720, false, 60)) |
| 268 base::MakeUnique<ui::DisplayMode>(gfx::Size(1920, 1080), false, 60)); | 261 // Interlaced only. |
| 269 | 262 .AddMode(MakeDisplayMode(1024, 768, true, 70)) |
| 270 // Interlaced vs non-interlaced. | 263 .AddMode(MakeDisplayMode(1024, 768, true, 60)) |
| 271 modes.push_back( | 264 // Mixed. |
| 272 base::MakeUnique<ui::DisplayMode>(gfx::Size(1280, 720), true, 60)); | 265 .AddMode(MakeDisplayMode(1024, 600, true, 60)) |
| 273 modes.push_back( | 266 .AddMode(MakeDisplayMode(1024, 600, false, 70)) |
| 274 base::MakeUnique<ui::DisplayMode>(gfx::Size(1280, 720), false, 60)); | 267 .AddMode(MakeDisplayMode(1024, 600, false, 60)) |
| 275 | 268 // Just one interlaced mode. |
| 276 // Interlaced only. | 269 .AddMode(MakeDisplayMode(640, 480, true, 60)) |
| 277 modes.push_back( | 270 .Build(); |
| 278 base::MakeUnique<ui::DisplayMode>(gfx::Size(1024, 768), true, 70)); | |
| 279 modes.push_back( | |
| 280 base::MakeUnique<ui::DisplayMode>(gfx::Size(1024, 768), true, 60)); | |
| 281 | |
| 282 // Mixed. | |
| 283 modes.push_back( | |
| 284 base::MakeUnique<ui::DisplayMode>(gfx::Size(1024, 600), true, 60)); | |
| 285 modes.push_back( | |
| 286 base::MakeUnique<ui::DisplayMode>(gfx::Size(1024, 600), false, 70)); | |
| 287 modes.push_back( | |
| 288 base::MakeUnique<ui::DisplayMode>(gfx::Size(1024, 600), false, 60)); | |
| 289 | |
| 290 // Just one interlaced mode. | |
| 291 modes.push_back( | |
| 292 base::MakeUnique<ui::DisplayMode>(gfx::Size(640, 480), true, 60)); | |
| 293 | |
| 294 ui::TestDisplaySnapshot display_snapshot; | |
| 295 display_snapshot.set_native_mode(modes[0].get()); | |
| 296 display_snapshot.set_modes(std::move(modes)); | |
| 297 | 271 |
| 298 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = | 272 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = |
| 299 DisplayChangeObserver::GetExternalManagedDisplayModeList( | 273 DisplayChangeObserver::GetExternalManagedDisplayModeList( |
| 300 display_snapshot); | 274 *display_snapshot); |
| 301 display::ManagedDisplayInfo info(1, "", false); | 275 display::ManagedDisplayInfo info(1, "", false); |
| 302 info.SetManagedDisplayModes(display_modes); // Sort as external display. | 276 info.SetManagedDisplayModes(display_modes); // Sort as external display. |
| 303 display_modes = info.display_modes(); | 277 display_modes = info.display_modes(); |
| 304 | 278 |
| 305 ASSERT_EQ(9u, display_modes.size()); | 279 ASSERT_EQ(9u, display_modes.size()); |
| 306 EXPECT_EQ("640x480", display_modes[0]->size().ToString()); | 280 EXPECT_EQ("640x480", display_modes[0]->size().ToString()); |
| 307 EXPECT_TRUE(display_modes[0]->is_interlaced()); | 281 EXPECT_TRUE(display_modes[0]->is_interlaced()); |
| 308 EXPECT_EQ(display_modes[0]->refresh_rate(), 60); | 282 EXPECT_EQ(display_modes[0]->refresh_rate(), 60); |
| 309 | 283 |
| 310 EXPECT_EQ("1024x600", display_modes[1]->size().ToString()); | 284 EXPECT_EQ("1024x600", display_modes[1]->size().ToString()); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 336 EXPECT_EQ("3840x2160", display_modes[7]->size().ToString()); | 310 EXPECT_EQ("3840x2160", display_modes[7]->size().ToString()); |
| 337 EXPECT_FALSE(display_modes[7]->is_interlaced()); | 311 EXPECT_FALSE(display_modes[7]->is_interlaced()); |
| 338 EXPECT_FALSE(display_modes[7]->native()); | 312 EXPECT_FALSE(display_modes[7]->native()); |
| 339 EXPECT_EQ(display_modes[7]->refresh_rate(), 30); | 313 EXPECT_EQ(display_modes[7]->refresh_rate(), 30); |
| 340 EXPECT_EQ(display_modes[7]->device_scale_factor(), 1.25); | 314 EXPECT_EQ(display_modes[7]->device_scale_factor(), 1.25); |
| 341 | 315 |
| 342 EXPECT_EQ("3840x2160", display_modes[8]->size().ToString()); | 316 EXPECT_EQ("3840x2160", display_modes[8]->size().ToString()); |
| 343 EXPECT_FALSE(display_modes[8]->is_interlaced()); | 317 EXPECT_FALSE(display_modes[8]->is_interlaced()); |
| 344 EXPECT_TRUE(display_modes[8]->native()); | 318 EXPECT_TRUE(display_modes[8]->native()); |
| 345 EXPECT_EQ(display_modes[8]->refresh_rate(), 30); | 319 EXPECT_EQ(display_modes[8]->refresh_rate(), 30); |
| 346 | |
| 347 // Outputs without any modes shouldn't cause a crash. | |
| 348 modes.clear(); | |
| 349 display_snapshot.set_native_mode(NULL); | |
| 350 display_snapshot.set_modes(std::move(modes)); | |
| 351 | |
| 352 display_modes = DisplayChangeObserver::GetExternalManagedDisplayModeList( | |
| 353 display_snapshot); | |
| 354 EXPECT_EQ(0u, display_modes.size()); | |
| 355 } | 320 } |
| 356 | 321 |
| 357 namespace { | 322 TEST(DisplayChangeObserverTest, FindDeviceScaleFactor) { |
| 358 | |
| 359 float ComputeDeviceScaleFactor(float diagonal_inch, | |
| 360 const gfx::Rect& resolution) { | |
| 361 // We assume that displays have square pixel. | |
| 362 float diagonal_pixel = std::sqrt(std::pow(resolution.width(), 2) + | |
| 363 std::pow(resolution.height(), 2)); | |
| 364 float dpi = diagonal_pixel / diagonal_inch; | |
| 365 return DisplayChangeObserver::FindDeviceScaleFactor(dpi); | |
| 366 } | |
| 367 | |
| 368 } // namespace | |
| 369 | |
| 370 TEST_F(DisplayChangeObserverTest, FindDeviceScaleFactor) { | |
| 371 EXPECT_EQ(1.0f, ComputeDeviceScaleFactor(19.5f, gfx::Rect(1600, 900))); | 323 EXPECT_EQ(1.0f, ComputeDeviceScaleFactor(19.5f, gfx::Rect(1600, 900))); |
| 372 | 324 |
| 373 // 21.5" 1920x1080 | 325 // 21.5" 1920x1080 |
| 374 EXPECT_EQ(1.0f, ComputeDeviceScaleFactor(21.5f, gfx::Rect(1920, 1080))); | 326 EXPECT_EQ(1.0f, ComputeDeviceScaleFactor(21.5f, gfx::Rect(1920, 1080))); |
| 375 | 327 |
| 376 // 12.1" 1280x800 | 328 // 12.1" 1280x800 |
| 377 EXPECT_EQ(1.0f, ComputeDeviceScaleFactor(12.1f, gfx::Rect(1280, 800))); | 329 EXPECT_EQ(1.0f, ComputeDeviceScaleFactor(12.1f, gfx::Rect(1280, 800))); |
| 378 | 330 |
| 379 // 11.6" 1920x1080 | 331 // 11.6" 1920x1080 |
| 380 EXPECT_EQ(1.25f, ComputeDeviceScaleFactor(11.6f, gfx::Rect(1920, 1080))); | 332 EXPECT_EQ(1.25f, ComputeDeviceScaleFactor(11.6f, gfx::Rect(1920, 1080))); |
| 381 | 333 |
| 382 // 13.3" 1920x1080 | 334 // 13.3" 1920x1080 |
| 383 EXPECT_EQ(1.25f, ComputeDeviceScaleFactor(13.3f, gfx::Rect(1920, 1080))); | 335 EXPECT_EQ(1.25f, ComputeDeviceScaleFactor(13.3f, gfx::Rect(1920, 1080))); |
| 384 | 336 |
| 385 // 14" 1920x1080 | 337 // 14" 1920x1080 |
| 386 EXPECT_EQ(1.25f, ComputeDeviceScaleFactor(14.0f, gfx::Rect(1920, 1080))); | 338 EXPECT_EQ(1.25f, ComputeDeviceScaleFactor(14.0f, gfx::Rect(1920, 1080))); |
| 387 | 339 |
| 388 // 12.85" 2560x1700 | 340 // 12.85" 2560x1700 |
| 389 EXPECT_EQ(2.0f, ComputeDeviceScaleFactor(12.85f, gfx::Rect(2560, 1700))); | 341 EXPECT_EQ(2.0f, ComputeDeviceScaleFactor(12.85f, gfx::Rect(2560, 1700))); |
| 390 | 342 |
| 391 // Erroneous values should still work. | 343 // Erroneous values should still work. |
| 392 EXPECT_EQ(1.0f, DisplayChangeObserver::FindDeviceScaleFactor(-100.0f)); | 344 EXPECT_EQ(1.0f, DisplayChangeObserver::FindDeviceScaleFactor(-100.0f)); |
| 393 EXPECT_EQ(1.0f, DisplayChangeObserver::FindDeviceScaleFactor(0.0f)); | 345 EXPECT_EQ(1.0f, DisplayChangeObserver::FindDeviceScaleFactor(0.0f)); |
| 394 EXPECT_EQ(2.0f, DisplayChangeObserver::FindDeviceScaleFactor(10000.0f)); | 346 EXPECT_EQ(2.0f, DisplayChangeObserver::FindDeviceScaleFactor(10000.0f)); |
| 395 } | 347 } |
| 396 | 348 |
| 397 TEST_F(DisplayChangeObserverTest, | 349 TEST(DisplayChangeObserverTest, FindExternalDisplayNativeModeWhenOverwritten) { |
| 398 FindExternalDisplayNativeModeWhenOverwritten) { | 350 std::unique_ptr<ui::DisplaySnapshot> display_snapshot = |
| 399 std::vector<std::unique_ptr<const ui::DisplayMode>> modes; | 351 display::FakeDisplaySnapshot::Builder() |
| 400 modes.push_back( | 352 .SetId(123) |
| 401 base::MakeUnique<ui::DisplayMode>(gfx::Size(1920, 1080), true, 60)); | 353 .SetNativeMode(MakeDisplayMode(1920, 1080, true, 60)) |
| 402 modes.push_back( | 354 .AddMode(MakeDisplayMode(1920, 1080, false, 60)) |
| 403 base::MakeUnique<ui::DisplayMode>(gfx::Size(1920, 1080), false, 60)); | 355 .Build(); |
| 404 | |
| 405 ui::TestDisplaySnapshot display_snapshot; | |
| 406 display_snapshot.set_native_mode(modes[0].get()); | |
| 407 display_snapshot.set_modes(std::move(modes)); | |
| 408 | 356 |
| 409 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = | 357 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = |
| 410 DisplayChangeObserver::GetExternalManagedDisplayModeList( | 358 DisplayChangeObserver::GetExternalManagedDisplayModeList( |
| 411 display_snapshot); | 359 *display_snapshot); |
| 412 ASSERT_EQ(2u, display_modes.size()); | 360 ASSERT_EQ(2u, display_modes.size()); |
| 413 EXPECT_EQ("1920x1080", display_modes[0]->size().ToString()); | 361 EXPECT_EQ("1920x1080", display_modes[0]->size().ToString()); |
| 414 EXPECT_FALSE(display_modes[0]->is_interlaced()); | 362 EXPECT_FALSE(display_modes[0]->is_interlaced()); |
| 415 EXPECT_FALSE(display_modes[0]->native()); | 363 EXPECT_FALSE(display_modes[0]->native()); |
| 416 EXPECT_EQ(display_modes[0]->refresh_rate(), 60); | 364 EXPECT_EQ(display_modes[0]->refresh_rate(), 60); |
| 417 | 365 |
| 418 EXPECT_EQ("1920x1080", display_modes[1]->size().ToString()); | 366 EXPECT_EQ("1920x1080", display_modes[1]->size().ToString()); |
| 419 EXPECT_TRUE(display_modes[1]->is_interlaced()); | 367 EXPECT_TRUE(display_modes[1]->is_interlaced()); |
| 420 EXPECT_TRUE(display_modes[1]->native()); | 368 EXPECT_TRUE(display_modes[1]->native()); |
| 421 EXPECT_EQ(display_modes[1]->refresh_rate(), 60); | 369 EXPECT_EQ(display_modes[1]->refresh_rate(), 60); |
| 422 } | 370 } |
| 423 | 371 |
| 424 } // namespace ash | 372 } // namespace ash |
| OLD | NEW |