Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(122)

Side by Side Diff: ui/display/chromeos/display_configurator_unittest.cc

Issue 2407153008: Delete TestDisplaySnapshot and update tests. (Closed)
Patch Set: Rebase and cleanup. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "ui/display/chromeos/display_configurator.h" 5 #include "ui/display/chromeos/display_configurator.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include "base/macros.h" 10 #include "base/macros.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/memory/scoped_vector.h" 12 #include "base/memory/scoped_vector.h"
13 #include "base/message_loop/message_loop.h" 13 #include "base/message_loop/message_loop.h"
14 #include "base/run_loop.h" 14 #include "base/run_loop.h"
15 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "ui/display/chromeos/test/action_logger_util.h" 16 #include "ui/display/chromeos/test/action_logger_util.h"
17 #include "ui/display/chromeos/test/test_display_snapshot.h"
18 #include "ui/display/chromeos/test/test_native_display_delegate.h" 17 #include "ui/display/chromeos/test/test_native_display_delegate.h"
18 #include "ui/display/fake_display_snapshot.h"
19 #include "ui/display/util/display_util.h" 19 #include "ui/display/util/display_util.h"
20 20
21 namespace ui { 21 namespace ui {
22 namespace test { 22 namespace test {
23 23
24 namespace { 24 namespace {
25 25
26 int64_t kDisplayIds[3] = {123, 456, 789};
27
28 std::unique_ptr<ui::DisplayMode> MakeDisplayMode(int width,
29 int height,
30 bool is_interlaced,
31 float refresh_rate) {
32 return base::MakeUnique<ui::DisplayMode>(gfx::Size(width, height),
33 is_interlaced, refresh_rate);
34 }
35
26 class TestObserver : public DisplayConfigurator::Observer { 36 class TestObserver : public DisplayConfigurator::Observer {
27 public: 37 public:
28 explicit TestObserver(DisplayConfigurator* configurator) 38 explicit TestObserver(DisplayConfigurator* configurator)
29 : configurator_(configurator) { 39 : configurator_(configurator) {
30 Reset(); 40 Reset();
31 configurator_->AddObserver(this); 41 configurator_->AddObserver(this);
32 } 42 }
33 ~TestObserver() override { configurator_->RemoveObserver(this); } 43 ~TestObserver() override { configurator_->RemoveObserver(this); }
34 44
35 int num_changes() const { return num_changes_; } 45 int num_changes() const { return num_changes_; }
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 void SetUp() override { 152 void SetUp() override {
143 log_.reset(new ActionLogger()); 153 log_.reset(new ActionLogger());
144 154
145 native_display_delegate_ = new TestNativeDisplayDelegate(log_.get()); 155 native_display_delegate_ = new TestNativeDisplayDelegate(log_.get());
146 configurator_.SetDelegateForTesting( 156 configurator_.SetDelegateForTesting(
147 std::unique_ptr<NativeDisplayDelegate>(native_display_delegate_)); 157 std::unique_ptr<NativeDisplayDelegate>(native_display_delegate_));
148 158
149 configurator_.set_state_controller(&state_controller_); 159 configurator_.set_state_controller(&state_controller_);
150 configurator_.set_mirroring_controller(&mirroring_controller_); 160 configurator_.set_mirroring_controller(&mirroring_controller_);
151 161
152 std::vector<std::unique_ptr<const DisplayMode>> modes; 162 outputs_[0] = display::FakeDisplaySnapshot::Builder()
153 modes.push_back(small_mode_.Clone()); 163 .SetId(kDisplayIds[0])
164 .SetNativeMode(small_mode_.Clone())
165 .SetCurrentMode(small_mode_.Clone())
166 .SetType(DISPLAY_CONNECTION_TYPE_INTERNAL)
167 .SetIsAspectPerservingScaling(true)
168 .Build();
154 169
155 TestDisplaySnapshot* o = &outputs_[0]; 170 outputs_[1] = display::FakeDisplaySnapshot::Builder()
156 o->set_current_mode(modes.front().get()); 171 .SetId(kDisplayIds[1])
157 o->set_native_mode(modes.front().get()); 172 .SetNativeMode(big_mode_.Clone())
158 o->set_modes(std::move(modes)); 173 .SetCurrentMode(big_mode_.Clone())
159 o->set_type(DISPLAY_CONNECTION_TYPE_INTERNAL); 174 .AddMode(small_mode_.Clone())
160 o->set_is_aspect_preserving_scaling(true); 175 .SetType(DISPLAY_CONNECTION_TYPE_HDMI)
161 o->set_display_id(123); 176 .SetIsAspectPerservingScaling(true)
177 .Build();
162 178
163 modes.clear(); 179 outputs_[2] = display::FakeDisplaySnapshot::Builder()
164 modes.push_back(small_mode_.Clone()); 180 .SetId(kDisplayIds[2])
165 modes.push_back(big_mode_.Clone()); 181 .SetNativeMode(small_mode_.Clone())
166 o = &outputs_[1]; 182 .SetCurrentMode(small_mode_.Clone())
167 o->set_current_mode(modes.back().get()); 183 .SetType(DISPLAY_CONNECTION_TYPE_HDMI)
168 o->set_native_mode(modes.back().get()); 184 .SetIsAspectPerservingScaling(true)
169 o->set_modes(std::move(modes)); 185 .Build();
170 o->set_type(DISPLAY_CONNECTION_TYPE_HDMI);
171 o->set_is_aspect_preserving_scaling(true);
172 o->set_display_id(456);
173
174 modes.clear();
175 modes.push_back(small_mode_.Clone());
176 o = &outputs_[2];
177 o->set_current_mode(modes.back().get());
178 o->set_native_mode(modes.back().get());
179 o->set_modes(std::move(modes));
180 o->set_type(DISPLAY_CONNECTION_TYPE_HDMI);
181 o->set_is_aspect_preserving_scaling(true);
182 o->set_display_id(789);
183 186
184 UpdateOutputs(2, false); 187 UpdateOutputs(2, false);
185 } 188 }
186 189
187 void OnConfiguredCallback(bool status) { 190 void OnConfiguredCallback(bool status) {
188 callback_result_ = (status ? CALLBACK_SUCCESS : CALLBACK_FAILURE); 191 callback_result_ = (status ? CALLBACK_SUCCESS : CALLBACK_FAILURE);
189 } 192 }
190 193
191 void OnDisplayControlUpdated(bool status) { 194 void OnDisplayControlUpdated(bool status) {
192 display_control_result_ = (status ? CALLBACK_SUCCESS : CALLBACK_FAILURE); 195 display_control_result_ = (status ? CALLBACK_SUCCESS : CALLBACK_FAILURE);
(...skipping 17 matching lines...) Expand all
210 protected: 213 protected:
211 // Configures |native_display_delegate_| to return the first |num_outputs| 214 // Configures |native_display_delegate_| to return the first |num_outputs|
212 // entries from 215 // entries from
213 // |outputs_|. If |send_events| is true, also sends screen-change and 216 // |outputs_|. If |send_events| is true, also sends screen-change and
214 // output-change events to |configurator_| and triggers the configure 217 // output-change events to |configurator_| and triggers the configure
215 // timeout if one was scheduled. 218 // timeout if one was scheduled.
216 void UpdateOutputs(size_t num_outputs, bool send_events) { 219 void UpdateOutputs(size_t num_outputs, bool send_events) {
217 ASSERT_LE(num_outputs, arraysize(outputs_)); 220 ASSERT_LE(num_outputs, arraysize(outputs_));
218 std::vector<DisplaySnapshot*> outputs; 221 std::vector<DisplaySnapshot*> outputs;
219 for (size_t i = 0; i < num_outputs; ++i) 222 for (size_t i = 0; i < num_outputs; ++i)
220 outputs.push_back(&outputs_[i]); 223 outputs.push_back(outputs_[i].get());
221 native_display_delegate_->set_outputs(outputs); 224 native_display_delegate_->set_outputs(outputs);
222 225
223 if (send_events) { 226 if (send_events) {
224 configurator_.OnConfigurationChanged(); 227 configurator_.OnConfigurationChanged();
225 EXPECT_TRUE(test_api_.TriggerConfigureTimeout()); 228 EXPECT_TRUE(test_api_.TriggerConfigureTimeout());
226 } 229 }
227 } 230 }
228 231
229 void Init(bool panel_fitting_enabled) { 232 void Init(bool panel_fitting_enabled) {
230 configurator_.Init(nullptr, panel_fitting_enabled); 233 configurator_.Init(nullptr, panel_fitting_enabled);
231 } 234 }
232 235
233 // Initializes |configurator_| with a single internal display. 236 // Initializes |configurator_| with a single internal display.
234 void InitWithSingleOutput() { 237 void InitWithSingleOutput() {
235 UpdateOutputs(1, false); 238 UpdateOutputs(1, false);
236 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 239 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
237 configurator_.Init(nullptr, false); 240 configurator_.Init(nullptr, false);
238 241
239 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 242 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
240 configurator_.ForceInitialConfigure(0); 243 configurator_.ForceInitialConfigure(0);
241 EXPECT_EQ(JoinActions(kInitXRandR, kGrab, 244 EXPECT_EQ(
242 GetFramebufferAction(small_mode_.size(), &outputs_[0], 245 JoinActions(
243 NULL).c_str(), 246 kInitXRandR, kGrab,
244 GetCrtcAction(outputs_[0], &small_mode_, 247 GetFramebufferAction(small_mode_.size(), outputs_[0].get(), nullptr)
245 gfx::Point(0, 0)).c_str(), 248 .c_str(),
246 kForceDPMS, kUngrab, NULL), 249 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
247 log_->GetActionsAndClear()); 250 kForceDPMS, kUngrab, nullptr),
251 log_->GetActionsAndClear());
248 } 252 }
249 253
250 CallbackResult PopCallbackResult() { 254 CallbackResult PopCallbackResult() {
251 CallbackResult result = callback_result_; 255 CallbackResult result = callback_result_;
252 callback_result_ = CALLBACK_NOT_CALLED; 256 callback_result_ = CALLBACK_NOT_CALLED;
253 return result; 257 return result;
254 } 258 }
255 259
256 CallbackResult PopDisplayControlResult() { 260 CallbackResult PopDisplayControlResult() {
257 CallbackResult result = display_control_result_; 261 CallbackResult result = display_control_result_;
258 display_control_result_ = CALLBACK_NOT_CALLED; 262 display_control_result_ = CALLBACK_NOT_CALLED;
259 return result; 263 return result;
260 } 264 }
261 265
262 base::MessageLoop message_loop_; 266 base::MessageLoop message_loop_;
263 TestStateController state_controller_; 267 TestStateController state_controller_;
264 TestMirroringController mirroring_controller_; 268 TestMirroringController mirroring_controller_;
265 DisplayConfigurator configurator_; 269 DisplayConfigurator configurator_;
266 TestObserver observer_; 270 TestObserver observer_;
267 std::unique_ptr<ActionLogger> log_; 271 std::unique_ptr<ActionLogger> log_;
268 TestNativeDisplayDelegate* native_display_delegate_; // not owned 272 TestNativeDisplayDelegate* native_display_delegate_; // not owned
269 DisplayConfigurator::TestApi test_api_; 273 DisplayConfigurator::TestApi test_api_;
270 274
271 bool enable_content_protection_status_; 275 bool enable_content_protection_status_;
272 int enable_content_protection_call_count_; 276 int enable_content_protection_call_count_;
273 DisplayConfigurator::QueryProtectionResponse 277 DisplayConfigurator::QueryProtectionResponse
274 query_content_protection_response_; 278 query_content_protection_response_;
275 int query_content_protection_call_count_; 279 int query_content_protection_call_count_;
276 280
277 TestDisplaySnapshot outputs_[3]; 281 std::unique_ptr<DisplaySnapshot> outputs_[3];
278 282
279 CallbackResult callback_result_; 283 CallbackResult callback_result_;
280 CallbackResult display_control_result_; 284 CallbackResult display_control_result_;
281 285
282 private: 286 private:
283 DISALLOW_COPY_AND_ASSIGN(DisplayConfiguratorTest); 287 DISALLOW_COPY_AND_ASSIGN(DisplayConfiguratorTest);
284 }; 288 };
285 289
286 } // namespace 290 } // namespace
287 291
288 TEST_F(DisplayConfiguratorTest, FindDisplayModeMatchingSize) { 292 TEST_F(DisplayConfiguratorTest, FindDisplayModeMatchingSize) {
289 std::vector<const DisplayMode*> modes; 293 std::unique_ptr<ui::DisplaySnapshot> output =
294 display::FakeDisplaySnapshot::Builder()
295 .SetId(kDisplayIds[0])
296 .AddMode(MakeDisplayMode(1920, 1200, false, 60.0))
297 .SetNativeMode(MakeDisplayMode(1920, 1200, false, 50.0))
298 // Different rates.
299 .AddMode(MakeDisplayMode(1920, 1080, false, 30.0))
300 .AddMode(MakeDisplayMode(1920, 1080, false, 50.0))
301 .AddMode(MakeDisplayMode(1920, 1080, false, 40.0))
302 .AddMode(MakeDisplayMode(1920, 1080, false, 0.0))
303 // Interlaced vs non-interlaced.
304 .AddMode(MakeDisplayMode(1280, 720, true, 60.0))
305 .AddMode(MakeDisplayMode(1280, 720, false, 40.0))
306 // Interlaced only.
307 .AddMode(MakeDisplayMode(1024, 768, true, 0.0))
308 .AddMode(MakeDisplayMode(1024, 768, true, 40.0))
309 .AddMode(MakeDisplayMode(1024, 768, true, 60.0))
310 // Mixed.
311 .AddMode(MakeDisplayMode(1024, 600, true, 60.0))
312 .AddMode(MakeDisplayMode(1024, 600, false, 40.0))
313 .AddMode(MakeDisplayMode(1024, 600, false, 50.0))
314 // Just one interlaced mode.
315 .AddMode(MakeDisplayMode(640, 480, true, 60.0))
316 // Refresh rate not available.
317 .AddMode(MakeDisplayMode(320, 200, false, 0.0))
318 .Build();
290 319
291 // Fields are width, height, interlaced, refresh rate. 320 const std::vector<std::unique_ptr<const DisplayMode>>& modes =
292 modes.push_back(new DisplayMode(gfx::Size(1920, 1200), false, 60.0)); 321 output->modes();
293 DisplayMode* native_mode =
294 new DisplayMode(gfx::Size(1920, 1200), false, 50.0);
295 modes.push_back(native_mode);
296 // Different rates.
297 modes.push_back(new DisplayMode(gfx::Size(1920, 1080), false, 30.0));
298 modes.push_back(new DisplayMode(gfx::Size(1920, 1080), false, 50.0));
299 modes.push_back(new DisplayMode(gfx::Size(1920, 1080), false, 40.0));
300 modes.push_back(new DisplayMode(gfx::Size(1920, 1080), false, 0.0));
301 // Interlaced vs non-interlaced.
302 modes.push_back(new DisplayMode(gfx::Size(1280, 720), true, 60.0));
303 modes.push_back(new DisplayMode(gfx::Size(1280, 720), false, 40.0));
304 // Interlaced only.
305 modes.push_back(new DisplayMode(gfx::Size(1024, 768), true, 0.0));
306 modes.push_back(new DisplayMode(gfx::Size(1024, 768), true, 40.0));
307 modes.push_back(new DisplayMode(gfx::Size(1024, 768), true, 60.0));
308 // Mixed.
309 modes.push_back(new DisplayMode(gfx::Size(1024, 600), true, 60.0));
310 modes.push_back(new DisplayMode(gfx::Size(1024, 600), false, 40.0));
311 modes.push_back(new DisplayMode(gfx::Size(1024, 600), false, 50.0));
312 // Just one interlaced mode.
313 modes.push_back(new DisplayMode(gfx::Size(640, 480), true, 60.0));
314 // Refresh rate not available.
315 modes.push_back(new DisplayMode(gfx::Size(320, 200), false, 0.0));
316
317 TestDisplaySnapshot output;
318 std::vector<std::unique_ptr<const DisplayMode>> tmp_modes;
319 for (const DisplayMode* mode : modes)
320 tmp_modes.push_back(base::WrapUnique(mode));
321 output.set_modes(std::move(tmp_modes));
322 output.set_native_mode(native_mode);
323 322
324 // Should pick native over highest refresh rate. 323 // Should pick native over highest refresh rate.
325 EXPECT_EQ(modes[1], 324 EXPECT_EQ(modes[1].get(), DisplayConfigurator::FindDisplayModeMatchingSize(
326 DisplayConfigurator::FindDisplayModeMatchingSize( 325 *output, gfx::Size(1920, 1200)));
327 output, gfx::Size(1920, 1200)));
328 326
329 // Should pick highest refresh rate. 327 // Should pick highest refresh rate.
330 EXPECT_EQ(modes[3], 328 EXPECT_EQ(modes[3].get(), DisplayConfigurator::FindDisplayModeMatchingSize(
331 DisplayConfigurator::FindDisplayModeMatchingSize( 329 *output, gfx::Size(1920, 1080)));
332 output, gfx::Size(1920, 1080)));
333 330
334 // Should pick non-interlaced mode. 331 // Should pick non-interlaced mode.
335 EXPECT_EQ(modes[7], 332 EXPECT_EQ(modes[7].get(), DisplayConfigurator::FindDisplayModeMatchingSize(
336 DisplayConfigurator::FindDisplayModeMatchingSize( 333 *output, gfx::Size(1280, 720)));
337 output, gfx::Size(1280, 720)));
338 334
339 // Interlaced only. Should pick one with the highest refresh rate in 335 // Interlaced only. Should pick one with the highest refresh rate in
340 // interlaced mode. 336 // interlaced mode.
341 EXPECT_EQ(modes[10], 337 EXPECT_EQ(modes[10].get(), DisplayConfigurator::FindDisplayModeMatchingSize(
342 DisplayConfigurator::FindDisplayModeMatchingSize( 338 *output, gfx::Size(1024, 768)));
343 output, gfx::Size(1024, 768)));
344 339
345 // Mixed: Should pick one with the highest refresh rate in 340 // Mixed: Should pick one with the highest refresh rate in
346 // interlaced mode. 341 // interlaced mode.
347 EXPECT_EQ(modes[13], 342 EXPECT_EQ(modes[13].get(), DisplayConfigurator::FindDisplayModeMatchingSize(
348 DisplayConfigurator::FindDisplayModeMatchingSize( 343 *output, gfx::Size(1024, 600)));
349 output, gfx::Size(1024, 600)));
350 344
351 // Just one interlaced mode. 345 // Just one interlaced mode.
352 EXPECT_EQ(modes[14], 346 EXPECT_EQ(modes[14].get(), DisplayConfigurator::FindDisplayModeMatchingSize(
353 DisplayConfigurator::FindDisplayModeMatchingSize( 347 *output, gfx::Size(640, 480)));
354 output, gfx::Size(640, 480)));
355 348
356 // Refresh rate not available. 349 // Refresh rate not available.
357 EXPECT_EQ(modes[15], 350 EXPECT_EQ(modes[15].get(), DisplayConfigurator::FindDisplayModeMatchingSize(
358 DisplayConfigurator::FindDisplayModeMatchingSize( 351 *output, gfx::Size(320, 200)));
359 output, gfx::Size(320, 200)));
360 352
361 // No mode found. 353 // No mode found.
362 EXPECT_EQ(NULL, 354 EXPECT_EQ(nullptr, DisplayConfigurator::FindDisplayModeMatchingSize(
363 DisplayConfigurator::FindDisplayModeMatchingSize( 355 *output, gfx::Size(1440, 900)));
364 output, gfx::Size(1440, 900)));
365 } 356 }
366 357
367 TEST_F(DisplayConfiguratorTest, EnableVirtualDisplay) { 358 TEST_F(DisplayConfiguratorTest, EnableVirtualDisplay) {
368 InitWithSingleOutput(); 359 InitWithSingleOutput();
369 360
370 observer_.Reset(); 361 observer_.Reset();
371 const DisplayConfigurator::DisplayStateList& cached = 362 const DisplayConfigurator::DisplayStateList& cached =
372 configurator_.cached_displays(); 363 configurator_.cached_displays();
373 ASSERT_EQ(static_cast<size_t>(1u), cached.size()); 364 ASSERT_EQ(static_cast<size_t>(1u), cached.size());
374 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size()); 365 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size());
375 366
376 // Add virtual display. 367 // Add virtual display.
377 int64_t virtual_display_id = 368 int64_t virtual_display_id =
378 configurator_.AddVirtualDisplay(big_mode_.size()); 369 configurator_.AddVirtualDisplay(big_mode_.size());
379 EXPECT_EQ(display::GenerateDisplayID(0x8000, 0x0, 1), virtual_display_id); 370 EXPECT_EQ(display::GenerateDisplayID(0x8000, 0x0, 1), virtual_display_id);
380 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled()); 371 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
381 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED, 372 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED,
382 configurator_.display_state()); 373 configurator_.display_state());
383 374
384 // Virtual should not trigger addition of added crtc but does change FB 375 // Virtual should not trigger addition of added crtc but does change FB
385 // height. 376 // height.
386 const int kVirtualHeight = small_mode_.size().height() + 377 const int kVirtualHeight = small_mode_.size().height() +
387 DisplayConfigurator::kVerticalGap + 378 DisplayConfigurator::kVerticalGap +
388 big_mode_.size().height(); 379 big_mode_.size().height();
389 EXPECT_EQ( 380 EXPECT_EQ(
390 JoinActions( 381 JoinActions(
391 kGrab, GetFramebufferAction( 382 kGrab, GetFramebufferAction(
392 gfx::Size(big_mode_.size().width(), kVirtualHeight), 383 gfx::Size(big_mode_.size().width(), kVirtualHeight),
393 &outputs_[0], nullptr) 384 outputs_[0].get(), nullptr)
394 .c_str(), 385 .c_str(),
395 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 386 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
396 kUngrab, nullptr), 387 kUngrab, nullptr),
397 log_->GetActionsAndClear()); 388 log_->GetActionsAndClear());
398 EXPECT_EQ(1, observer_.num_changes()); 389 EXPECT_EQ(1, observer_.num_changes());
399 ASSERT_EQ(static_cast<size_t>(2u), cached.size()); 390 ASSERT_EQ(static_cast<size_t>(2u), cached.size());
400 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size()); 391 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size());
401 EXPECT_EQ(big_mode_.size(), cached[1]->current_mode()->size()); 392 EXPECT_EQ(big_mode_.size(), cached[1]->current_mode()->size());
402 EXPECT_EQ(virtual_display_id, cached[1]->display_id()); 393 EXPECT_EQ(virtual_display_id, cached[1]->display_id());
403 394
404 // Remove virtual display. 395 // Remove virtual display.
405 observer_.Reset(); 396 observer_.Reset();
406 EXPECT_TRUE(configurator_.RemoveVirtualDisplay(virtual_display_id)); 397 EXPECT_TRUE(configurator_.RemoveVirtualDisplay(virtual_display_id));
407 EXPECT_EQ( 398 EXPECT_EQ(
408 JoinActions( 399 JoinActions(
409 kGrab, GetFramebufferAction(small_mode_.size(), &outputs_[0], nullptr) 400 kGrab,
410 .c_str(), 401 GetFramebufferAction(small_mode_.size(), outputs_[0].get(), nullptr)
411 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 402 .c_str(),
403 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
412 kUngrab, nullptr), 404 kUngrab, nullptr),
413 log_->GetActionsAndClear()); 405 log_->GetActionsAndClear());
414 EXPECT_EQ(1, observer_.num_changes()); 406 EXPECT_EQ(1, observer_.num_changes());
415 ASSERT_EQ(static_cast<size_t>(1u), cached.size()); 407 ASSERT_EQ(static_cast<size_t>(1u), cached.size());
416 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size()); 408 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size());
417 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, configurator_.display_state()); 409 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, configurator_.display_state());
418 } 410 }
419 411
420 TEST_F(DisplayConfiguratorTest, EnableTwoVirtualDisplays) { 412 TEST_F(DisplayConfiguratorTest, EnableTwoVirtualDisplays) {
421 InitWithSingleOutput(); 413 InitWithSingleOutput();
(...skipping 14 matching lines...) Expand all
436 428
437 // Virtual should not trigger addition of added crtc but does change FB 429 // Virtual should not trigger addition of added crtc but does change FB
438 // height. 430 // height.
439 const int kSingleVirtualHeight = small_mode_.size().height() + 431 const int kSingleVirtualHeight = small_mode_.size().height() +
440 DisplayConfigurator::kVerticalGap + 432 DisplayConfigurator::kVerticalGap +
441 big_mode_.size().height(); 433 big_mode_.size().height();
442 EXPECT_EQ( 434 EXPECT_EQ(
443 JoinActions( 435 JoinActions(
444 kGrab, GetFramebufferAction( 436 kGrab, GetFramebufferAction(
445 gfx::Size(big_mode_.size().width(), kSingleVirtualHeight), 437 gfx::Size(big_mode_.size().width(), kSingleVirtualHeight),
446 &outputs_[0], nullptr) 438 outputs_[0].get(), nullptr)
447 .c_str(), 439 .c_str(),
448 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 440 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
449 kUngrab, nullptr), 441 kUngrab, nullptr),
450 log_->GetActionsAndClear()); 442 log_->GetActionsAndClear());
451 EXPECT_EQ(1, observer_.num_changes()); 443 EXPECT_EQ(1, observer_.num_changes());
452 ASSERT_EQ(static_cast<size_t>(2), cached.size()); 444 ASSERT_EQ(static_cast<size_t>(2), cached.size());
453 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size()); 445 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size());
454 EXPECT_EQ(big_mode_.size(), cached[1]->current_mode()->size()); 446 EXPECT_EQ(big_mode_.size(), cached[1]->current_mode()->size());
455 EXPECT_EQ(virtual_display_id_1, cached[1]->display_id()); 447 EXPECT_EQ(virtual_display_id_1, cached[1]->display_id());
456 448
457 // Add 2nd virtual display 449 // Add 2nd virtual display
458 int64_t virtual_display_id_2 = 450 int64_t virtual_display_id_2 =
459 configurator_.AddVirtualDisplay(big_mode_.size()); 451 configurator_.AddVirtualDisplay(big_mode_.size());
460 EXPECT_EQ(display::GenerateDisplayID(0x8000, 0x0, 2), virtual_display_id_2); 452 EXPECT_EQ(display::GenerateDisplayID(0x8000, 0x0, 2), virtual_display_id_2);
461 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled()); 453 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
462 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED, 454 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED,
463 configurator_.display_state()); 455 configurator_.display_state());
464 456
465 const int kDualVirtualHeight = 457 const int kDualVirtualHeight =
466 small_mode_.size().height() + 458 small_mode_.size().height() +
467 (DisplayConfigurator::kVerticalGap + big_mode_.size().height()) * 2; 459 (DisplayConfigurator::kVerticalGap + big_mode_.size().height()) * 2;
468 EXPECT_EQ( 460 EXPECT_EQ(
469 JoinActions( 461 JoinActions(
470 kGrab, GetFramebufferAction( 462 kGrab, GetFramebufferAction(
471 gfx::Size(big_mode_.size().width(), kDualVirtualHeight), 463 gfx::Size(big_mode_.size().width(), kDualVirtualHeight),
472 &outputs_[0], nullptr) 464 outputs_[0].get(), nullptr)
473 .c_str(), 465 .c_str(),
474 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 466 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
475 kUngrab, nullptr), 467 kUngrab, nullptr),
476 log_->GetActionsAndClear()); 468 log_->GetActionsAndClear());
477 EXPECT_EQ(2, observer_.num_changes()); 469 EXPECT_EQ(2, observer_.num_changes());
478 ASSERT_EQ(static_cast<size_t>(3u), cached.size()); 470 ASSERT_EQ(static_cast<size_t>(3u), cached.size());
479 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size()); 471 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size());
480 EXPECT_EQ(big_mode_.size(), cached[1]->current_mode()->size()); 472 EXPECT_EQ(big_mode_.size(), cached[1]->current_mode()->size());
481 EXPECT_EQ(big_mode_.size(), cached[2]->current_mode()->size()); 473 EXPECT_EQ(big_mode_.size(), cached[2]->current_mode()->size());
482 EXPECT_EQ(virtual_display_id_1, cached[1]->display_id()); 474 EXPECT_EQ(virtual_display_id_1, cached[1]->display_id());
483 EXPECT_EQ(virtual_display_id_2, cached[2]->display_id()); 475 EXPECT_EQ(virtual_display_id_2, cached[2]->display_id());
484 476
485 // Remove 1st virtual display. 477 // Remove 1st virtual display.
486 observer_.Reset(); 478 observer_.Reset();
487 EXPECT_TRUE(configurator_.RemoveVirtualDisplay(virtual_display_id_1)); 479 EXPECT_TRUE(configurator_.RemoveVirtualDisplay(virtual_display_id_1));
488 EXPECT_EQ( 480 EXPECT_EQ(
489 JoinActions( 481 JoinActions(
490 kGrab, GetFramebufferAction( 482 kGrab, GetFramebufferAction(
491 gfx::Size(big_mode_.size().width(), kSingleVirtualHeight), 483 gfx::Size(big_mode_.size().width(), kSingleVirtualHeight),
492 &outputs_[0], nullptr) 484 outputs_[0].get(), nullptr)
493 .c_str(), 485 .c_str(),
494 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 486 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
495 kUngrab, nullptr), 487 kUngrab, nullptr),
496 log_->GetActionsAndClear()); 488 log_->GetActionsAndClear());
497 EXPECT_EQ(1, observer_.num_changes()); 489 EXPECT_EQ(1, observer_.num_changes());
498 ASSERT_EQ(static_cast<size_t>(2u), cached.size()); 490 ASSERT_EQ(static_cast<size_t>(2u), cached.size());
499 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size()); 491 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size());
500 EXPECT_EQ(big_mode_.size(), cached[1]->current_mode()->size()); 492 EXPECT_EQ(big_mode_.size(), cached[1]->current_mode()->size());
501 EXPECT_EQ(virtual_display_id_2, cached[1]->display_id()); 493 EXPECT_EQ(virtual_display_id_2, cached[1]->display_id());
502 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED, 494 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED,
503 configurator_.display_state()); 495 configurator_.display_state());
504 496
505 // Remove 2nd virtual display. 497 // Remove 2nd virtual display.
506 observer_.Reset(); 498 observer_.Reset();
507 EXPECT_TRUE(configurator_.RemoveVirtualDisplay(virtual_display_id_2)); 499 EXPECT_TRUE(configurator_.RemoveVirtualDisplay(virtual_display_id_2));
508 EXPECT_EQ( 500 EXPECT_EQ(
509 JoinActions( 501 JoinActions(
510 kGrab, GetFramebufferAction(small_mode_.size(), &outputs_[0], nullptr) 502 kGrab,
511 .c_str(), 503 GetFramebufferAction(small_mode_.size(), outputs_[0].get(), nullptr)
512 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 504 .c_str(),
505 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
513 kUngrab, nullptr), 506 kUngrab, nullptr),
514 log_->GetActionsAndClear()); 507 log_->GetActionsAndClear());
515 EXPECT_EQ(1, observer_.num_changes()); 508 EXPECT_EQ(1, observer_.num_changes());
516 ASSERT_EQ(static_cast<size_t>(1), cached.size()); 509 ASSERT_EQ(static_cast<size_t>(1), cached.size());
517 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size()); 510 EXPECT_EQ(small_mode_.size(), cached[0]->current_mode()->size());
518 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, configurator_.display_state()); 511 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, configurator_.display_state());
519 } 512 }
520 513
521 TEST_F(DisplayConfiguratorTest, ConnectSecondOutput) { 514 TEST_F(DisplayConfiguratorTest, ConnectSecondOutput) {
522 InitWithSingleOutput(); 515 InitWithSingleOutput();
523 516
524 // Connect a second output and check that the configurator enters 517 // Connect a second output and check that the configurator enters
525 // extended mode. 518 // extended mode.
526 observer_.Reset(); 519 observer_.Reset();
527 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED); 520 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED);
528 UpdateOutputs(2, true); 521 UpdateOutputs(2, true);
529 const int kDualHeight = small_mode_.size().height() + 522 const int kDualHeight = small_mode_.size().height() +
530 DisplayConfigurator::kVerticalGap + 523 DisplayConfigurator::kVerticalGap +
531 big_mode_.size().height(); 524 big_mode_.size().height();
532 EXPECT_EQ( 525 EXPECT_EQ(
533 JoinActions( 526 JoinActions(
534 kGrab, 527 kGrab,
535 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight), 528 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight),
536 &outputs_[0], 529 outputs_[0].get(), outputs_[1].get())
537 &outputs_[1]).c_str(),
538 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
539 GetCrtcAction(outputs_[1],
540 &big_mode_,
541 gfx::Point(0,
542 small_mode_.size().height() +
543 DisplayConfigurator::kVerticalGap))
544 .c_str(), 530 .c_str(),
545 kUngrab, 531 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
546 NULL), 532 GetCrtcAction(*outputs_[1], &big_mode_,
533 gfx::Point(0, small_mode_.size().height() +
534 DisplayConfigurator::kVerticalGap))
535 .c_str(),
536 kUngrab, nullptr),
547 log_->GetActionsAndClear()); 537 log_->GetActionsAndClear());
548 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled()); 538 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
549 EXPECT_EQ(1, observer_.num_changes()); 539 EXPECT_EQ(1, observer_.num_changes());
550 540
551 observer_.Reset(); 541 observer_.Reset();
552 configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR); 542 configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR);
553 EXPECT_EQ( 543 EXPECT_EQ(
554 JoinActions( 544 JoinActions(
555 kGrab, 545 kGrab, GetFramebufferAction(small_mode_.size(), outputs_[0].get(),
556 GetFramebufferAction(small_mode_.size(), &outputs_[0], &outputs_[1]) 546 outputs_[1].get())
557 .c_str(), 547 .c_str(),
558 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 548 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
559 GetCrtcAction(outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(), 549 GetCrtcAction(*outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(),
560 kUngrab, 550 kUngrab, nullptr),
561 NULL),
562 log_->GetActionsAndClear()); 551 log_->GetActionsAndClear());
563 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled()); 552 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
564 EXPECT_EQ(1, observer_.num_changes()); 553 EXPECT_EQ(1, observer_.num_changes());
565 554
566 // Disconnect the second output. 555 // Disconnect the second output.
567 observer_.Reset(); 556 observer_.Reset();
568 UpdateOutputs(1, true); 557 UpdateOutputs(1, true);
569 EXPECT_EQ( 558 EXPECT_EQ(
570 JoinActions( 559 JoinActions(
571 kGrab, 560 kGrab,
572 GetFramebufferAction(small_mode_.size(), &outputs_[0], NULL).c_str(), 561 GetFramebufferAction(small_mode_.size(), outputs_[0].get(), nullptr)
573 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 562 .c_str(),
574 kUngrab, 563 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
575 NULL), 564 kUngrab, nullptr),
576 log_->GetActionsAndClear()); 565 log_->GetActionsAndClear());
577 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled()); 566 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
578 EXPECT_EQ(1, observer_.num_changes()); 567 EXPECT_EQ(1, observer_.num_changes());
579 568
580 // Get rid of shared modes to force software mirroring. 569 // Get rid of shared modes to force software mirroring.
581 std::vector<std::unique_ptr<const DisplayMode>> modes; 570 outputs_[1] = display::FakeDisplaySnapshot::Builder()
582 modes.push_back(big_mode_.Clone()); 571 .SetId(kDisplayIds[1])
583 outputs_[1].set_current_mode(modes.front().get()); 572 .SetNativeMode(big_mode_.Clone())
584 outputs_[1].set_native_mode(modes.front().get()); 573 .SetCurrentMode(big_mode_.Clone())
585 outputs_[1].set_modes(std::move(modes)); 574 .SetType(DISPLAY_CONNECTION_TYPE_HDMI)
575 .SetIsAspectPerservingScaling(true)
576 .Build();
577
586 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED); 578 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED);
587 UpdateOutputs(2, true); 579 UpdateOutputs(2, true);
588 EXPECT_EQ( 580 EXPECT_EQ(
589 JoinActions( 581 JoinActions(
590 kGrab, 582 kGrab,
591 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight), 583 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight),
592 &outputs_[0], 584 outputs_[0].get(), outputs_[1].get())
593 &outputs_[1]).c_str(),
594 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
595 GetCrtcAction(outputs_[1],
596 &big_mode_,
597 gfx::Point(0,
598 small_mode_.size().height() +
599 DisplayConfigurator::kVerticalGap))
600 .c_str(), 585 .c_str(),
601 kUngrab, 586 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
602 NULL), 587 GetCrtcAction(*outputs_[1], &big_mode_,
588 gfx::Point(0, small_mode_.size().height() +
589 DisplayConfigurator::kVerticalGap))
590 .c_str(),
591 kUngrab, nullptr),
603 log_->GetActionsAndClear()); 592 log_->GetActionsAndClear());
604 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled()); 593 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
605 const gfx::Size framebuffer_size = configurator_.framebuffer_size(); 594 const gfx::Size framebuffer_size = configurator_.framebuffer_size();
606 DCHECK(!framebuffer_size.IsEmpty()); 595 DCHECK(!framebuffer_size.IsEmpty());
607 596
608 observer_.Reset(); 597 observer_.Reset();
609 configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR); 598 configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR);
610 EXPECT_EQ(JoinActions(kGrab, kUngrab, NULL), log_->GetActionsAndClear()); 599 EXPECT_EQ(JoinActions(kGrab, kUngrab, nullptr), log_->GetActionsAndClear());
611 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED, 600 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED,
612 configurator_.display_state()); 601 configurator_.display_state());
613 EXPECT_TRUE(mirroring_controller_.SoftwareMirroringEnabled()); 602 EXPECT_TRUE(mirroring_controller_.SoftwareMirroringEnabled());
614 EXPECT_EQ(framebuffer_size.ToString(), 603 EXPECT_EQ(framebuffer_size.ToString(),
615 configurator_.framebuffer_size().ToString()); 604 configurator_.framebuffer_size().ToString());
616 605
617 EXPECT_EQ(1, observer_.num_changes()); 606 EXPECT_EQ(1, observer_.num_changes());
618 607
619 // Setting MULTIPLE_DISPLAY_STATE_DUAL_MIRROR should try to reconfigure. 608 // Setting MULTIPLE_DISPLAY_STATE_DUAL_MIRROR should try to reconfigure.
620 observer_.Reset(); 609 observer_.Reset();
621 configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED); 610 configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED);
622 EXPECT_EQ(JoinActions(NULL), log_->GetActionsAndClear()); 611 EXPECT_EQ(JoinActions(nullptr), log_->GetActionsAndClear());
623 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled()); 612 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
624 EXPECT_EQ(1, observer_.num_changes()); 613 EXPECT_EQ(1, observer_.num_changes());
625 614
626 // Set back to software mirror mode. 615 // Set back to software mirror mode.
627 observer_.Reset(); 616 observer_.Reset();
628 configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR); 617 configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR);
629 EXPECT_EQ(JoinActions(kGrab, kUngrab, NULL), log_->GetActionsAndClear()); 618 EXPECT_EQ(JoinActions(kGrab, kUngrab, nullptr), log_->GetActionsAndClear());
630 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED, 619 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED,
631 configurator_.display_state()); 620 configurator_.display_state());
632 EXPECT_TRUE(mirroring_controller_.SoftwareMirroringEnabled()); 621 EXPECT_TRUE(mirroring_controller_.SoftwareMirroringEnabled());
633 EXPECT_EQ(1, observer_.num_changes()); 622 EXPECT_EQ(1, observer_.num_changes());
634 623
635 // Disconnect the second output. 624 // Disconnect the second output.
636 observer_.Reset(); 625 observer_.Reset();
637 UpdateOutputs(1, true); 626 UpdateOutputs(1, true);
638 EXPECT_EQ( 627 EXPECT_EQ(
639 JoinActions( 628 JoinActions(
640 kGrab, 629 kGrab,
641 GetFramebufferAction(small_mode_.size(), &outputs_[0], NULL).c_str(), 630 GetFramebufferAction(small_mode_.size(), outputs_[0].get(), nullptr)
642 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 631 .c_str(),
643 kUngrab, 632 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
644 NULL), 633 kUngrab, nullptr),
645 log_->GetActionsAndClear()); 634 log_->GetActionsAndClear());
646 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled()); 635 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
647 EXPECT_EQ(1, observer_.num_changes()); 636 EXPECT_EQ(1, observer_.num_changes());
648 } 637 }
649 638
650 TEST_F(DisplayConfiguratorTest, SetDisplayPower) { 639 TEST_F(DisplayConfiguratorTest, SetDisplayPower) {
651 InitWithSingleOutput(); 640 InitWithSingleOutput();
652 641
653 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR); 642 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR);
654 observer_.Reset(); 643 observer_.Reset();
655 UpdateOutputs(2, true); 644 UpdateOutputs(2, true);
656 EXPECT_EQ( 645 EXPECT_EQ(
657 JoinActions( 646 JoinActions(
658 kGrab, 647 kGrab, GetFramebufferAction(small_mode_.size(), outputs_[0].get(),
659 GetFramebufferAction(small_mode_.size(), &outputs_[0], &outputs_[1]) 648 outputs_[1].get())
660 .c_str(), 649 .c_str(),
661 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 650 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
662 GetCrtcAction(outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(), 651 GetCrtcAction(*outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(),
663 kUngrab, 652 kUngrab, nullptr),
664 NULL),
665 log_->GetActionsAndClear()); 653 log_->GetActionsAndClear());
666 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled()); 654 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
667 EXPECT_EQ(1, observer_.num_changes()); 655 EXPECT_EQ(1, observer_.num_changes());
668 656
669 // Turning off the internal display should switch the external display to 657 // Turning off the internal display should switch the external display to
670 // its native mode. 658 // its native mode.
671 observer_.Reset(); 659 observer_.Reset();
672 configurator_.SetDisplayPower( 660 configurator_.SetDisplayPower(
673 chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON, 661 chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON,
674 DisplayConfigurator::kSetDisplayPowerNoFlags, 662 DisplayConfigurator::kSetDisplayPowerNoFlags,
675 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 663 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
676 base::Unretained(this))); 664 base::Unretained(this)));
677 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 665 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
678 EXPECT_EQ( 666 EXPECT_EQ(
679 JoinActions( 667 JoinActions(
680 kGrab, 668 kGrab, GetFramebufferAction(big_mode_.size(), outputs_[0].get(),
681 GetFramebufferAction(big_mode_.size(), &outputs_[0], &outputs_[1]) 669 outputs_[1].get())
682 .c_str(), 670 .c_str(),
683 GetCrtcAction(outputs_[0], NULL, gfx::Point(0, 0)).c_str(), 671 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
684 GetCrtcAction(outputs_[1], &big_mode_, gfx::Point(0, 0)).c_str(), 672 GetCrtcAction(*outputs_[1], &big_mode_, gfx::Point(0, 0)).c_str(),
685 kForceDPMS, 673 kForceDPMS, kUngrab, nullptr),
686 kUngrab,
687 NULL),
688 log_->GetActionsAndClear()); 674 log_->GetActionsAndClear());
689 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, configurator_.display_state()); 675 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, configurator_.display_state());
690 EXPECT_EQ(1, observer_.num_changes()); 676 EXPECT_EQ(1, observer_.num_changes());
691 677
692 // When all displays are turned off, the framebuffer should switch back 678 // When all displays are turned off, the framebuffer should switch back
693 // to the mirrored size. 679 // to the mirrored size.
694 observer_.Reset(); 680 observer_.Reset();
695 configurator_.SetDisplayPower( 681 configurator_.SetDisplayPower(
696 chromeos::DISPLAY_POWER_ALL_OFF, 682 chromeos::DISPLAY_POWER_ALL_OFF,
697 DisplayConfigurator::kSetDisplayPowerNoFlags, 683 DisplayConfigurator::kSetDisplayPowerNoFlags,
698 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 684 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
699 base::Unretained(this))); 685 base::Unretained(this)));
700 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 686 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
701 EXPECT_EQ( 687 EXPECT_EQ(
702 JoinActions(kGrab, 688 JoinActions(
703 GetFramebufferAction( 689 kGrab, GetFramebufferAction(small_mode_.size(), outputs_[0].get(),
704 small_mode_.size(), &outputs_[0], &outputs_[1]).c_str(), 690 outputs_[1].get())
705 GetCrtcAction(outputs_[0], NULL, gfx::Point(0, 0)).c_str(), 691 .c_str(),
706 GetCrtcAction(outputs_[1], NULL, gfx::Point(0, 0)).c_str(), 692 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
707 kUngrab, 693 GetCrtcAction(*outputs_[1], nullptr, gfx::Point(0, 0)).c_str(),
708 NULL), 694 kUngrab, nullptr),
709 log_->GetActionsAndClear()); 695 log_->GetActionsAndClear());
710 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR, configurator_.display_state()); 696 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR, configurator_.display_state());
711 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled()); 697 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
712 EXPECT_EQ(1, observer_.num_changes()); 698 EXPECT_EQ(1, observer_.num_changes());
713 699
714 // Turn all displays on and check that mirroring is still used. 700 // Turn all displays on and check that mirroring is still used.
715 observer_.Reset(); 701 observer_.Reset();
716 configurator_.SetDisplayPower( 702 configurator_.SetDisplayPower(
717 chromeos::DISPLAY_POWER_ALL_ON, 703 chromeos::DISPLAY_POWER_ALL_ON,
718 DisplayConfigurator::kSetDisplayPowerNoFlags, 704 DisplayConfigurator::kSetDisplayPowerNoFlags,
719 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 705 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
720 base::Unretained(this))); 706 base::Unretained(this)));
721 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 707 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
722 EXPECT_EQ( 708 EXPECT_EQ(
723 JoinActions( 709 JoinActions(
724 kGrab, 710 kGrab, GetFramebufferAction(small_mode_.size(), outputs_[0].get(),
725 GetFramebufferAction(small_mode_.size(), &outputs_[0], &outputs_[1]) 711 outputs_[1].get())
726 .c_str(), 712 .c_str(),
727 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 713 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
728 GetCrtcAction(outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(), 714 GetCrtcAction(*outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(),
729 kForceDPMS, 715 kForceDPMS, kUngrab, nullptr),
730 kUngrab,
731 NULL),
732 log_->GetActionsAndClear()); 716 log_->GetActionsAndClear());
733 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR, configurator_.display_state()); 717 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR, configurator_.display_state());
734 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled()); 718 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
735 EXPECT_EQ(1, observer_.num_changes()); 719 EXPECT_EQ(1, observer_.num_changes());
736 720
737 // Get rid of shared modes to force software mirroring. 721 // Get rid of shared modes to force software mirroring.
738 std::vector<std::unique_ptr<const DisplayMode>> modes; 722 outputs_[1] = display::FakeDisplaySnapshot::Builder()
739 modes.push_back(big_mode_.Clone()); 723 .SetId(kDisplayIds[1])
740 outputs_[1].set_current_mode(modes.front().get()); 724 .SetNativeMode(big_mode_.Clone())
741 outputs_[1].set_native_mode(modes.front().get()); 725 .SetCurrentMode(big_mode_.Clone())
742 outputs_[1].set_modes(std::move(modes)); 726 .SetType(DISPLAY_CONNECTION_TYPE_HDMI)
727 .SetIsAspectPerservingScaling(true)
728 .Build();
729
743 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR); 730 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR);
744 observer_.Reset(); 731 observer_.Reset();
745 UpdateOutputs(2, true); 732 UpdateOutputs(2, true);
746 const int kDualHeight = small_mode_.size().height() + 733 const int kDualHeight = small_mode_.size().height() +
747 DisplayConfigurator::kVerticalGap + 734 DisplayConfigurator::kVerticalGap +
748 big_mode_.size().height(); 735 big_mode_.size().height();
749 EXPECT_EQ( 736 EXPECT_EQ(
750 JoinActions( 737 JoinActions(
751 kGrab, 738 kGrab,
752 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight), 739 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight),
753 &outputs_[0], 740 outputs_[0].get(), outputs_[1].get())
754 &outputs_[1]).c_str(),
755 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
756 GetCrtcAction(outputs_[1],
757 &big_mode_,
758 gfx::Point(0,
759 small_mode_.size().height() +
760 DisplayConfigurator::kVerticalGap))
761 .c_str(), 741 .c_str(),
762 kUngrab, 742 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
763 NULL), 743 GetCrtcAction(*outputs_[1], &big_mode_,
744 gfx::Point(0, small_mode_.size().height() +
745 DisplayConfigurator::kVerticalGap))
746 .c_str(),
747 kUngrab, nullptr),
764 log_->GetActionsAndClear()); 748 log_->GetActionsAndClear());
765 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED, 749 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED,
766 configurator_.display_state()); 750 configurator_.display_state());
767 EXPECT_TRUE(mirroring_controller_.SoftwareMirroringEnabled()); 751 EXPECT_TRUE(mirroring_controller_.SoftwareMirroringEnabled());
768 EXPECT_EQ(1, observer_.num_changes()); 752 EXPECT_EQ(1, observer_.num_changes());
769 753
770 // Turning off the internal display should switch the external display to 754 // Turning off the internal display should switch the external display to
771 // its native mode. 755 // its native mode.
772 observer_.Reset(); 756 observer_.Reset();
773 configurator_.SetDisplayPower( 757 configurator_.SetDisplayPower(
774 chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON, 758 chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON,
775 DisplayConfigurator::kSetDisplayPowerNoFlags, 759 DisplayConfigurator::kSetDisplayPowerNoFlags,
776 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 760 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
777 base::Unretained(this))); 761 base::Unretained(this)));
778 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 762 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
779 EXPECT_EQ( 763 EXPECT_EQ(
780 JoinActions( 764 JoinActions(
781 kGrab, 765 kGrab, GetFramebufferAction(big_mode_.size(), outputs_[0].get(),
782 GetFramebufferAction(big_mode_.size(), &outputs_[0], &outputs_[1]) 766 outputs_[1].get())
783 .c_str(), 767 .c_str(),
784 GetCrtcAction(outputs_[0], NULL, gfx::Point(0, 0)).c_str(), 768 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
785 GetCrtcAction(outputs_[1], &big_mode_, gfx::Point(0, 0)).c_str(), 769 GetCrtcAction(*outputs_[1], &big_mode_, gfx::Point(0, 0)).c_str(),
786 kForceDPMS, 770 kForceDPMS, kUngrab, nullptr),
787 kUngrab,
788 NULL),
789 log_->GetActionsAndClear()); 771 log_->GetActionsAndClear());
790 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, configurator_.display_state()); 772 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, configurator_.display_state());
791 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled()); 773 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
792 EXPECT_EQ(1, observer_.num_changes()); 774 EXPECT_EQ(1, observer_.num_changes());
793 775
794 // When all displays are turned off, the framebuffer should switch back 776 // When all displays are turned off, the framebuffer should switch back
795 // to the extended + software mirroring. 777 // to the extended + software mirroring.
796 observer_.Reset(); 778 observer_.Reset();
797 configurator_.SetDisplayPower( 779 configurator_.SetDisplayPower(
798 chromeos::DISPLAY_POWER_ALL_OFF, 780 chromeos::DISPLAY_POWER_ALL_OFF,
799 DisplayConfigurator::kSetDisplayPowerNoFlags, 781 DisplayConfigurator::kSetDisplayPowerNoFlags,
800 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 782 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
801 base::Unretained(this))); 783 base::Unretained(this)));
802 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 784 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
803 EXPECT_EQ( 785 EXPECT_EQ(
804 JoinActions( 786 JoinActions(
805 kGrab, 787 kGrab,
806 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight), 788 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight),
807 &outputs_[0], 789 outputs_[0].get(), outputs_[1].get())
808 &outputs_[1]).c_str(),
809 GetCrtcAction(outputs_[0], NULL, gfx::Point(0, 0)).c_str(),
810 GetCrtcAction(outputs_[1],
811 NULL,
812 gfx::Point(0,
813 small_mode_.size().height() +
814 DisplayConfigurator::kVerticalGap))
815 .c_str(), 790 .c_str(),
816 kUngrab, 791 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
817 NULL), 792 GetCrtcAction(*outputs_[1], nullptr,
793 gfx::Point(0, small_mode_.size().height() +
794 DisplayConfigurator::kVerticalGap))
795 .c_str(),
796 kUngrab, nullptr),
818 log_->GetActionsAndClear()); 797 log_->GetActionsAndClear());
819 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED, 798 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED,
820 configurator_.display_state()); 799 configurator_.display_state());
821 EXPECT_TRUE(mirroring_controller_.SoftwareMirroringEnabled()); 800 EXPECT_TRUE(mirroring_controller_.SoftwareMirroringEnabled());
822 EXPECT_EQ(1, observer_.num_changes()); 801 EXPECT_EQ(1, observer_.num_changes());
823 802
824 // Turn all displays on and check that mirroring is still used. 803 // Turn all displays on and check that mirroring is still used.
825 observer_.Reset(); 804 observer_.Reset();
826 configurator_.SetDisplayPower( 805 configurator_.SetDisplayPower(
827 chromeos::DISPLAY_POWER_ALL_ON, 806 chromeos::DISPLAY_POWER_ALL_ON,
828 DisplayConfigurator::kSetDisplayPowerNoFlags, 807 DisplayConfigurator::kSetDisplayPowerNoFlags,
829 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 808 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
830 base::Unretained(this))); 809 base::Unretained(this)));
831 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 810 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
832 EXPECT_EQ( 811 EXPECT_EQ(
833 JoinActions( 812 JoinActions(
834 kGrab, 813 kGrab,
835 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight), 814 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight),
836 &outputs_[0], 815 outputs_[0].get(), outputs_[1].get())
837 &outputs_[1]).c_str(),
838 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
839 GetCrtcAction(outputs_[1],
840 &big_mode_,
841 gfx::Point(0,
842 small_mode_.size().height() +
843 DisplayConfigurator::kVerticalGap))
844 .c_str(), 816 .c_str(),
845 kForceDPMS, 817 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
846 kUngrab, 818 GetCrtcAction(*outputs_[1], &big_mode_,
847 NULL), 819 gfx::Point(0, small_mode_.size().height() +
820 DisplayConfigurator::kVerticalGap))
821 .c_str(),
822 kForceDPMS, kUngrab, nullptr),
848 log_->GetActionsAndClear()); 823 log_->GetActionsAndClear());
849 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED, 824 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED,
850 configurator_.display_state()); 825 configurator_.display_state());
851 EXPECT_TRUE(mirroring_controller_.SoftwareMirroringEnabled()); 826 EXPECT_TRUE(mirroring_controller_.SoftwareMirroringEnabled());
852 EXPECT_EQ(1, observer_.num_changes()); 827 EXPECT_EQ(1, observer_.num_changes());
853 } 828 }
854 829
855 TEST_F(DisplayConfiguratorTest, SuspendAndResume) { 830 TEST_F(DisplayConfiguratorTest, SuspendAndResume) {
856 InitWithSingleOutput(); 831 InitWithSingleOutput();
857 832
858 // No preparation is needed before suspending when the display is already 833 // No preparation is needed before suspending when the display is already
859 // on. The configurator should still reprobe on resume in case a display 834 // on. The configurator should still reprobe on resume in case a display
860 // was connected while suspended. 835 // was connected while suspended.
861 const gfx::Size framebuffer_size = configurator_.framebuffer_size(); 836 const gfx::Size framebuffer_size = configurator_.framebuffer_size();
862 DCHECK(!framebuffer_size.IsEmpty()); 837 DCHECK(!framebuffer_size.IsEmpty());
863 configurator_.SuspendDisplays(base::Bind( 838 configurator_.SuspendDisplays(base::Bind(
864 &DisplayConfiguratorTest::OnConfiguredCallback, base::Unretained(this))); 839 &DisplayConfiguratorTest::OnConfiguredCallback, base::Unretained(this)));
865 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 840 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
866 EXPECT_EQ(framebuffer_size.ToString(), 841 EXPECT_EQ(framebuffer_size.ToString(),
867 configurator_.framebuffer_size().ToString()); 842 configurator_.framebuffer_size().ToString());
868 EXPECT_EQ( 843 EXPECT_EQ(JoinActions(
869 JoinActions( 844 kGrab, GetFramebufferAction(small_mode_.size(),
870 kGrab, 845 outputs_[0].get(), nullptr)
871 GetFramebufferAction(small_mode_.size(), &outputs_[0], NULL).c_str(), 846 .c_str(),
872 GetCrtcAction(outputs_[0], NULL, gfx::Point(0, 0)).c_str(), 847 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
873 kUngrab, 848 kUngrab, kSync, nullptr),
874 kSync, 849 log_->GetActionsAndClear());
875 NULL),
876 log_->GetActionsAndClear());
877 configurator_.ResumeDisplays(); 850 configurator_.ResumeDisplays();
878 EXPECT_EQ( 851 EXPECT_EQ(
879 JoinActions( 852 JoinActions(
880 kGrab, 853 kGrab,
881 GetFramebufferAction(small_mode_.size(), &outputs_[0], NULL).c_str(), 854 GetFramebufferAction(small_mode_.size(), outputs_[0].get(), nullptr)
882 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 855 .c_str(),
883 kForceDPMS, 856 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
884 kUngrab, 857 kForceDPMS, kUngrab, nullptr),
885 NULL),
886 log_->GetActionsAndClear()); 858 log_->GetActionsAndClear());
887 859
888 // Now turn the display off before suspending and check that the 860 // Now turn the display off before suspending and check that the
889 // configurator turns it back on and syncs with the server. 861 // configurator turns it back on and syncs with the server.
890 configurator_.SetDisplayPower( 862 configurator_.SetDisplayPower(
891 chromeos::DISPLAY_POWER_ALL_OFF, 863 chromeos::DISPLAY_POWER_ALL_OFF,
892 DisplayConfigurator::kSetDisplayPowerNoFlags, 864 DisplayConfigurator::kSetDisplayPowerNoFlags,
893 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 865 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
894 base::Unretained(this))); 866 base::Unretained(this)));
895 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 867 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
896 EXPECT_EQ( 868 EXPECT_EQ(JoinActions(
897 JoinActions( 869 kGrab, GetFramebufferAction(small_mode_.size(),
898 kGrab, 870 outputs_[0].get(), nullptr)
899 GetFramebufferAction(small_mode_.size(), &outputs_[0], NULL).c_str(), 871 .c_str(),
900 GetCrtcAction(outputs_[0], NULL, gfx::Point(0, 0)).c_str(), 872 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
901 kUngrab, 873 kUngrab, nullptr),
902 NULL), 874 log_->GetActionsAndClear());
903 log_->GetActionsAndClear());
904 875
905 configurator_.SuspendDisplays(base::Bind( 876 configurator_.SuspendDisplays(base::Bind(
906 &DisplayConfiguratorTest::OnConfiguredCallback, base::Unretained(this))); 877 &DisplayConfiguratorTest::OnConfiguredCallback, base::Unretained(this)));
907 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 878 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
908 EXPECT_EQ(kSync, log_->GetActionsAndClear()); 879 EXPECT_EQ(kSync, log_->GetActionsAndClear());
909 880
910 configurator_.ResumeDisplays(); 881 configurator_.ResumeDisplays();
911 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 882 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
912 883
913 configurator_.SetDisplayPower( 884 configurator_.SetDisplayPower(
914 chromeos::DISPLAY_POWER_ALL_ON, 885 chromeos::DISPLAY_POWER_ALL_ON,
915 DisplayConfigurator::kSetDisplayPowerNoFlags, 886 DisplayConfigurator::kSetDisplayPowerNoFlags,
916 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 887 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
917 base::Unretained(this))); 888 base::Unretained(this)));
918 EXPECT_EQ( 889 EXPECT_EQ(
919 JoinActions( 890 JoinActions(
920 kGrab, 891 kGrab,
921 GetFramebufferAction(small_mode_.size(), &outputs_[0], NULL).c_str(), 892 GetFramebufferAction(small_mode_.size(), outputs_[0].get(), nullptr)
922 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 893 .c_str(),
923 kForceDPMS, 894 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
924 kUngrab, 895 kForceDPMS, kUngrab, nullptr),
925 NULL),
926 log_->GetActionsAndClear()); 896 log_->GetActionsAndClear());
927 897
928 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR); 898 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR);
929 UpdateOutputs(2, true); 899 UpdateOutputs(2, true);
930 EXPECT_EQ( 900 EXPECT_EQ(
931 JoinActions( 901 JoinActions(
932 kGrab, 902 kGrab, GetFramebufferAction(small_mode_.size(), outputs_[0].get(),
933 GetFramebufferAction(small_mode_.size(), &outputs_[0], &outputs_[1]) 903 outputs_[1].get())
934 .c_str(), 904 .c_str(),
935 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 905 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
936 GetCrtcAction(outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(), 906 GetCrtcAction(*outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(),
937 kUngrab, 907 kUngrab, nullptr),
938 NULL),
939 log_->GetActionsAndClear()); 908 log_->GetActionsAndClear());
940 909
941 configurator_.SetDisplayPower( 910 configurator_.SetDisplayPower(
942 chromeos::DISPLAY_POWER_ALL_OFF, 911 chromeos::DISPLAY_POWER_ALL_OFF,
943 DisplayConfigurator::kSetDisplayPowerNoFlags, 912 DisplayConfigurator::kSetDisplayPowerNoFlags,
944 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 913 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
945 base::Unretained(this))); 914 base::Unretained(this)));
946 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 915 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
947 EXPECT_EQ( 916 EXPECT_EQ(
948 JoinActions( 917 JoinActions(
949 kGrab, 918 kGrab, GetFramebufferAction(small_mode_.size(), outputs_[0].get(),
950 GetFramebufferAction(small_mode_.size(), &outputs_[0], &outputs_[1]) 919 outputs_[1].get())
951 .c_str(), 920 .c_str(),
952 GetCrtcAction(outputs_[0], NULL, gfx::Point(0, 0)).c_str(), 921 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
953 GetCrtcAction(outputs_[1], NULL, gfx::Point(0, 0)).c_str(), 922 GetCrtcAction(*outputs_[1], nullptr, gfx::Point(0, 0)).c_str(),
954 kUngrab, 923 kUngrab, nullptr),
955 NULL),
956 log_->GetActionsAndClear()); 924 log_->GetActionsAndClear());
957 925
958 configurator_.SuspendDisplays(base::Bind( 926 configurator_.SuspendDisplays(base::Bind(
959 &DisplayConfiguratorTest::OnConfiguredCallback, base::Unretained(this))); 927 &DisplayConfiguratorTest::OnConfiguredCallback, base::Unretained(this)));
960 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 928 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
961 EXPECT_EQ(kSync, log_->GetActionsAndClear()); 929 EXPECT_EQ(kSync, log_->GetActionsAndClear());
962 930
963 // If a display is disconnected while suspended, the configurator should 931 // If a display is disconnected while suspended, the configurator should
964 // pick up the change and only turn on the internal display. 932 // pick up the change and only turn on the internal display.
965 UpdateOutputs(1, false); 933 UpdateOutputs(1, false);
966 configurator_.ResumeDisplays(); 934 configurator_.ResumeDisplays();
967 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 935 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
968 936
969 configurator_.SetDisplayPower( 937 configurator_.SetDisplayPower(
970 chromeos::DISPLAY_POWER_ALL_ON, 938 chromeos::DISPLAY_POWER_ALL_ON,
971 DisplayConfigurator::kSetDisplayPowerNoFlags, 939 DisplayConfigurator::kSetDisplayPowerNoFlags,
972 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 940 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
973 base::Unretained(this))); 941 base::Unretained(this)));
974 EXPECT_EQ( 942 EXPECT_EQ(
975 JoinActions( 943 JoinActions(
976 kGrab, 944 kGrab,
977 GetFramebufferAction(small_mode_.size(), &outputs_[0], NULL).c_str(), 945 GetFramebufferAction(small_mode_.size(), outputs_[0].get(), nullptr)
978 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 946 .c_str(),
979 kForceDPMS, 947 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
980 kUngrab, 948 kForceDPMS, kUngrab, nullptr),
981 NULL),
982 log_->GetActionsAndClear()); 949 log_->GetActionsAndClear());
983 } 950 }
984 951
985 TEST_F(DisplayConfiguratorTest, Headless) { 952 TEST_F(DisplayConfiguratorTest, Headless) {
986 UpdateOutputs(0, false); 953 UpdateOutputs(0, false);
987 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 954 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
988 Init(false); 955 Init(false);
989 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 956 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
990 configurator_.ForceInitialConfigure(0); 957 configurator_.ForceInitialConfigure(0);
991 EXPECT_EQ(JoinActions(kInitXRandR, kGrab, kForceDPMS, kUngrab, NULL), 958 EXPECT_EQ(JoinActions(kInitXRandR, kGrab, kForceDPMS, kUngrab, nullptr),
992 log_->GetActionsAndClear()); 959 log_->GetActionsAndClear());
993 960
994 // Not much should happen when the display power state is changed while 961 // Not much should happen when the display power state is changed while
995 // no displays are connected. 962 // no displays are connected.
996 configurator_.SetDisplayPower( 963 configurator_.SetDisplayPower(
997 chromeos::DISPLAY_POWER_ALL_OFF, 964 chromeos::DISPLAY_POWER_ALL_OFF,
998 DisplayConfigurator::kSetDisplayPowerNoFlags, 965 DisplayConfigurator::kSetDisplayPowerNoFlags,
999 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 966 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
1000 base::Unretained(this))); 967 base::Unretained(this)));
1001 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 968 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
1002 EXPECT_EQ(JoinActions(kGrab, kUngrab, NULL), log_->GetActionsAndClear()); 969 EXPECT_EQ(JoinActions(kGrab, kUngrab, nullptr), log_->GetActionsAndClear());
1003 configurator_.SetDisplayPower( 970 configurator_.SetDisplayPower(
1004 chromeos::DISPLAY_POWER_ALL_ON, 971 chromeos::DISPLAY_POWER_ALL_ON,
1005 DisplayConfigurator::kSetDisplayPowerNoFlags, 972 DisplayConfigurator::kSetDisplayPowerNoFlags,
1006 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 973 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
1007 base::Unretained(this))); 974 base::Unretained(this)));
1008 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 975 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
1009 EXPECT_EQ(JoinActions(kGrab, kForceDPMS, kUngrab, NULL), 976 EXPECT_EQ(JoinActions(kGrab, kForceDPMS, kUngrab, nullptr),
1010 log_->GetActionsAndClear()); 977 log_->GetActionsAndClear());
1011 978
1012 // Connect an external display and check that it's configured correctly. 979 // Connect an external display and check that it's configured correctly.
1013 std::vector<std::unique_ptr<const DisplayMode>> modes; 980 outputs_[0] = display::FakeDisplaySnapshot::Builder()
1014 for (const std::unique_ptr<const DisplayMode>& mode : outputs_[1].modes()) { 981 .SetId(kDisplayIds[0])
1015 modes.push_back(mode->Clone()); 982 .SetNativeMode(big_mode_.Clone())
1016 if (mode.get() == outputs_[1].current_mode()) 983 .SetCurrentMode(big_mode_.Clone())
1017 outputs_[0].set_current_mode(modes.back().get()); 984 .AddMode(small_mode_.Clone())
1018 if (mode.get() == outputs_[1].native_mode()) 985 .SetType(DISPLAY_CONNECTION_TYPE_INTERNAL)
1019 outputs_[0].set_native_mode(modes.back().get()); 986 .SetIsAspectPerservingScaling(true)
1020 } 987 .Build();
1021 outputs_[0].set_modes(std::move(modes));
1022 outputs_[0].set_type(outputs_[1].type());
1023 988
1024 UpdateOutputs(1, true); 989 UpdateOutputs(1, true);
1025 EXPECT_EQ( 990 EXPECT_EQ(
1026 JoinActions( 991 JoinActions(
1027 kGrab, 992 kGrab,
1028 GetFramebufferAction(big_mode_.size(), &outputs_[0], NULL).c_str(), 993 GetFramebufferAction(big_mode_.size(), outputs_[0].get(), nullptr)
1029 GetCrtcAction(outputs_[0], &big_mode_, gfx::Point(0, 0)).c_str(), 994 .c_str(),
1030 kUngrab, 995 GetCrtcAction(*outputs_[0], &big_mode_, gfx::Point(0, 0)).c_str(),
1031 NULL), 996 kUngrab, nullptr),
1032 log_->GetActionsAndClear()); 997 log_->GetActionsAndClear());
1033 const gfx::Size framebuffer_size = configurator_.framebuffer_size(); 998 const gfx::Size framebuffer_size = configurator_.framebuffer_size();
1034 DCHECK(!framebuffer_size.IsEmpty()); 999 DCHECK(!framebuffer_size.IsEmpty());
1035 1000
1036 UpdateOutputs(0, true); 1001 UpdateOutputs(0, true);
1037 EXPECT_EQ(JoinActions(kGrab, kUngrab, NULL), log_->GetActionsAndClear()); 1002 EXPECT_EQ(JoinActions(kGrab, kUngrab, nullptr), log_->GetActionsAndClear());
1038 EXPECT_EQ(framebuffer_size.ToString(), 1003 EXPECT_EQ(framebuffer_size.ToString(),
1039 configurator_.framebuffer_size().ToString()); 1004 configurator_.framebuffer_size().ToString());
1040 } 1005 }
1041 1006
1042 TEST_F(DisplayConfiguratorTest, StartWithTwoOutputs) { 1007 TEST_F(DisplayConfiguratorTest, StartWithTwoOutputs) {
1043 UpdateOutputs(2, false); 1008 UpdateOutputs(2, false);
1044 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 1009 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
1045 Init(false); 1010 Init(false);
1046 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 1011 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
1047 1012
1048 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR); 1013 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR);
1049 configurator_.ForceInitialConfigure(0); 1014 configurator_.ForceInitialConfigure(0);
1050 EXPECT_EQ( 1015 EXPECT_EQ(
1051 JoinActions( 1016 JoinActions(
1052 kInitXRandR, kGrab, 1017 kInitXRandR, kGrab,
1053 GetFramebufferAction(small_mode_.size(), &outputs_[0], &outputs_[1]) 1018 GetFramebufferAction(small_mode_.size(), outputs_[0].get(),
1019 outputs_[1].get())
1054 .c_str(), 1020 .c_str(),
1055 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 1021 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1056 GetCrtcAction(outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(), 1022 GetCrtcAction(*outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(),
1057 kForceDPMS, kUngrab, NULL), 1023 kForceDPMS, kUngrab, nullptr),
1058 log_->GetActionsAndClear()); 1024 log_->GetActionsAndClear());
1059 } 1025 }
1060 1026
1061 TEST_F(DisplayConfiguratorTest, InvalidMultipleDisplayStates) { 1027 TEST_F(DisplayConfiguratorTest, InvalidMultipleDisplayStates) {
1062 UpdateOutputs(0, false); 1028 UpdateOutputs(0, false);
1063 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 1029 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
1064 Init(false); 1030 Init(false);
1065 configurator_.ForceInitialConfigure(0); 1031 configurator_.ForceInitialConfigure(0);
1066 observer_.Reset(); 1032 observer_.Reset();
1067 configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_HEADLESS); 1033 configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_HEADLESS);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1105 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR); 1071 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR);
1106 configurator_.ForceInitialConfigure(0); 1072 configurator_.ForceInitialConfigure(0);
1107 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR, configurator_.display_state()); 1073 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR, configurator_.display_state());
1108 } 1074 }
1109 1075
1110 TEST_F(DisplayConfiguratorTest, UpdateCachedOutputsEvenAfterFailure) { 1076 TEST_F(DisplayConfiguratorTest, UpdateCachedOutputsEvenAfterFailure) {
1111 InitWithSingleOutput(); 1077 InitWithSingleOutput();
1112 const DisplayConfigurator::DisplayStateList& cached = 1078 const DisplayConfigurator::DisplayStateList& cached =
1113 configurator_.cached_displays(); 1079 configurator_.cached_displays();
1114 ASSERT_EQ(static_cast<size_t>(1), cached.size()); 1080 ASSERT_EQ(static_cast<size_t>(1), cached.size());
1115 EXPECT_EQ(outputs_[0].current_mode(), cached[0]->current_mode()); 1081 EXPECT_EQ(outputs_[0]->current_mode(), cached[0]->current_mode());
1116 1082
1117 // After connecting a second output, check that it shows up in 1083 // After connecting a second output, check that it shows up in
1118 // |cached_displays_| even if an invalid state is requested. 1084 // |cached_displays_| even if an invalid state is requested.
1119 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_SINGLE); 1085 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_SINGLE);
1120 UpdateOutputs(2, true); 1086 UpdateOutputs(2, true);
1121 ASSERT_EQ(static_cast<size_t>(2), cached.size()); 1087 ASSERT_EQ(static_cast<size_t>(2), cached.size());
1122 EXPECT_EQ(outputs_[0].current_mode(), cached[0]->current_mode()); 1088 EXPECT_EQ(outputs_[0]->current_mode(), cached[0]->current_mode());
1123 EXPECT_EQ(outputs_[1].current_mode(), cached[1]->current_mode()); 1089 EXPECT_EQ(outputs_[1]->current_mode(), cached[1]->current_mode());
1124 } 1090 }
1125 1091
1126 TEST_F(DisplayConfiguratorTest, PanelFitting) { 1092 TEST_F(DisplayConfiguratorTest, PanelFitting) {
1127 // Configure the internal display to support only the big mode and the 1093 // Configure the internal display to support only the big mode and the
1128 // external display to support only the small mode. 1094 // external display to support only the small mode.
1129 std::unique_ptr<const DisplayMode> tmp_mode = big_mode_.Clone(); 1095 outputs_[0] = display::FakeDisplaySnapshot::Builder()
1130 const DisplayMode* mode = tmp_mode.get(); 1096 .SetId(kDisplayIds[0])
1131 std::vector<std::unique_ptr<const DisplayMode>> modes; 1097 .SetNativeMode(big_mode_.Clone())
1132 modes.push_back(std::move(tmp_mode)); 1098 .SetCurrentMode(big_mode_.Clone())
1133 outputs_[0].set_modes(std::move(modes)); 1099 .SetType(DISPLAY_CONNECTION_TYPE_INTERNAL)
1134 outputs_[0].set_current_mode(mode); 1100 .SetIsAspectPerservingScaling(true)
1135 outputs_[0].set_native_mode(mode); 1101 .Build();
1136 1102
1137 modes.clear(); 1103 outputs_[1] = display::FakeDisplaySnapshot::Builder()
1138 tmp_mode = small_mode_.Clone(); 1104 .SetId(kDisplayIds[1])
1139 mode = tmp_mode.get(); 1105 .SetNativeMode(small_mode_.Clone())
1140 modes.push_back(std::move(tmp_mode)); 1106 .SetCurrentMode(small_mode_.Clone())
1141 outputs_[1].set_modes(std::move(modes)); 1107 .SetType(DISPLAY_CONNECTION_TYPE_HDMI)
1142 outputs_[1].set_current_mode(mode); 1108 .SetIsAspectPerservingScaling(true)
1143 outputs_[1].set_native_mode(mode); 1109 .Build();
1144 1110
1145 // The small mode should be added to the internal output when requesting 1111 // The small mode should be added to the internal output when requesting
1146 // mirrored mode. 1112 // mirrored mode.
1147 UpdateOutputs(2, false); 1113 UpdateOutputs(2, false);
1148 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR); 1114 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR);
1149 Init(true /* is_panel_fitting_enabled */); 1115 Init(true /* is_panel_fitting_enabled */);
1150 configurator_.ForceInitialConfigure(0); 1116 configurator_.ForceInitialConfigure(0);
1151 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR, configurator_.display_state()); 1117 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR, configurator_.display_state());
1152 EXPECT_EQ( 1118 EXPECT_EQ(
1153 JoinActions( 1119 JoinActions(
1154 kInitXRandR, kGrab, 1120 kInitXRandR, kGrab,
1155 GetAddOutputModeAction(outputs_[0], &small_mode_).c_str(), 1121 GetAddOutputModeAction(*outputs_[0], &small_mode_).c_str(),
1156 GetFramebufferAction(small_mode_.size(), &outputs_[0], &outputs_[1]) 1122 GetFramebufferAction(small_mode_.size(), outputs_[0].get(),
1123 outputs_[1].get())
1157 .c_str(), 1124 .c_str(),
1158 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 1125 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1159 GetCrtcAction(outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(), 1126 GetCrtcAction(*outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(),
1160 kForceDPMS, kUngrab, NULL), 1127 kForceDPMS, kUngrab, nullptr),
1161 log_->GetActionsAndClear()); 1128 log_->GetActionsAndClear());
1162 1129
1163 // Both outputs should be using the small mode. 1130 // Both outputs should be using the small mode.
1164 ASSERT_EQ(1, observer_.num_changes()); 1131 ASSERT_EQ(1, observer_.num_changes());
1165 ASSERT_EQ(static_cast<size_t>(2), observer_.latest_outputs().size()); 1132 ASSERT_EQ(static_cast<size_t>(2), observer_.latest_outputs().size());
1166 EXPECT_EQ(small_mode_.size(), 1133 EXPECT_EQ(small_mode_.size(),
1167 observer_.latest_outputs()[0]->current_mode()->size()); 1134 observer_.latest_outputs()[0]->current_mode()->size());
1168 EXPECT_EQ(small_mode_.size(), 1135 EXPECT_EQ(small_mode_.size(),
1169 observer_.latest_outputs()[1]->current_mode()->size()); 1136 observer_.latest_outputs()[1]->current_mode()->size());
1170 1137
1171 // Also test that there are 2 modes (instead of the initial one) in the 1138 // Also test that there are 2 modes (instead of the initial one) in the
1172 // snapshot that was passed to the observer (http://crbug.com/289159). 1139 // snapshot that was passed to the observer (http://crbug.com/289159).
1173 DisplaySnapshot* state = observer_.latest_outputs()[0]; 1140 DisplaySnapshot* state = observer_.latest_outputs()[0];
1174 ASSERT_EQ(2UL, state->modes().size()); 1141 ASSERT_EQ(2UL, state->modes().size());
1175 } 1142 }
1176 1143
1177 TEST_F(DisplayConfiguratorTest, ContentProtection) { 1144 TEST_F(DisplayConfiguratorTest, ContentProtection) {
1178 Init(false); 1145 Init(false);
1179 configurator_.ForceInitialConfigure(0); 1146 configurator_.ForceInitialConfigure(0);
1180 EXPECT_NE(kNoActions, log_->GetActionsAndClear()); 1147 EXPECT_NE(kNoActions, log_->GetActionsAndClear());
1181 1148
1182 DisplayConfigurator::ContentProtectionClientId id = 1149 DisplayConfigurator::ContentProtectionClientId id =
1183 configurator_.RegisterContentProtectionClient(); 1150 configurator_.RegisterContentProtectionClient();
1184 EXPECT_NE(0u, id); 1151 EXPECT_NE(0u, id);
1185 1152
1186 // One output. 1153 // One output.
1187 UpdateOutputs(1, true); 1154 UpdateOutputs(1, true);
1188 EXPECT_NE(kNoActions, log_->GetActionsAndClear()); 1155 EXPECT_NE(kNoActions, log_->GetActionsAndClear());
1189 configurator_.QueryContentProtectionStatus( 1156 configurator_.QueryContentProtectionStatus(
1190 id, outputs_[0].display_id(), 1157 id, outputs_[0]->display_id(),
1191 base::Bind(&DisplayConfiguratorTest::QueryContentProtectionCallback, 1158 base::Bind(&DisplayConfiguratorTest::QueryContentProtectionCallback,
1192 base::Unretained(this))); 1159 base::Unretained(this)));
1193 EXPECT_EQ(1, query_content_protection_call_count_); 1160 EXPECT_EQ(1, query_content_protection_call_count_);
1194 EXPECT_TRUE(query_content_protection_response_.success); 1161 EXPECT_TRUE(query_content_protection_response_.success);
1195 EXPECT_EQ(static_cast<uint32_t>(DISPLAY_CONNECTION_TYPE_INTERNAL), 1162 EXPECT_EQ(static_cast<uint32_t>(DISPLAY_CONNECTION_TYPE_INTERNAL),
1196 query_content_protection_response_.link_mask); 1163 query_content_protection_response_.link_mask);
1197 EXPECT_EQ(static_cast<uint32_t>(CONTENT_PROTECTION_METHOD_NONE), 1164 EXPECT_EQ(static_cast<uint32_t>(CONTENT_PROTECTION_METHOD_NONE),
1198 query_content_protection_response_.protection_mask); 1165 query_content_protection_response_.protection_mask);
1199 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 1166 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
1200 1167
1201 // Two outputs. 1168 // Two outputs.
1202 UpdateOutputs(2, true); 1169 UpdateOutputs(2, true);
1203 EXPECT_NE(kNoActions, log_->GetActionsAndClear()); 1170 EXPECT_NE(kNoActions, log_->GetActionsAndClear());
1204 configurator_.QueryContentProtectionStatus( 1171 configurator_.QueryContentProtectionStatus(
1205 id, outputs_[1].display_id(), 1172 id, outputs_[1]->display_id(),
1206 base::Bind(&DisplayConfiguratorTest::QueryContentProtectionCallback, 1173 base::Bind(&DisplayConfiguratorTest::QueryContentProtectionCallback,
1207 base::Unretained(this))); 1174 base::Unretained(this)));
1208 EXPECT_EQ(2, query_content_protection_call_count_); 1175 EXPECT_EQ(2, query_content_protection_call_count_);
1209 EXPECT_TRUE(query_content_protection_response_.success); 1176 EXPECT_TRUE(query_content_protection_response_.success);
1210 EXPECT_EQ(static_cast<uint32_t>(DISPLAY_CONNECTION_TYPE_HDMI), 1177 EXPECT_EQ(static_cast<uint32_t>(DISPLAY_CONNECTION_TYPE_HDMI),
1211 query_content_protection_response_.link_mask); 1178 query_content_protection_response_.link_mask);
1212 EXPECT_EQ(static_cast<uint32_t>(CONTENT_PROTECTION_METHOD_NONE), 1179 EXPECT_EQ(static_cast<uint32_t>(CONTENT_PROTECTION_METHOD_NONE),
1213 query_content_protection_response_.protection_mask); 1180 query_content_protection_response_.protection_mask);
1214 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 1181 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
1215 1182
1216 configurator_.EnableContentProtection( 1183 configurator_.EnableContentProtection(
1217 id, outputs_[1].display_id(), CONTENT_PROTECTION_METHOD_HDCP, 1184 id, outputs_[1]->display_id(), CONTENT_PROTECTION_METHOD_HDCP,
1218 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback, 1185 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback,
1219 base::Unretained(this))); 1186 base::Unretained(this)));
1220 EXPECT_EQ(1, enable_content_protection_call_count_); 1187 EXPECT_EQ(1, enable_content_protection_call_count_);
1221 EXPECT_TRUE(enable_content_protection_status_); 1188 EXPECT_TRUE(enable_content_protection_status_);
1222 EXPECT_EQ(GetSetHDCPStateAction(outputs_[1], HDCP_STATE_DESIRED), 1189 EXPECT_EQ(GetSetHDCPStateAction(*outputs_[1], HDCP_STATE_DESIRED),
1223 log_->GetActionsAndClear()); 1190 log_->GetActionsAndClear());
1224 1191
1225 // Enable protection. 1192 // Enable protection.
1226 native_display_delegate_->set_hdcp_state(HDCP_STATE_ENABLED); 1193 native_display_delegate_->set_hdcp_state(HDCP_STATE_ENABLED);
1227 configurator_.QueryContentProtectionStatus( 1194 configurator_.QueryContentProtectionStatus(
1228 id, outputs_[1].display_id(), 1195 id, outputs_[1]->display_id(),
1229 base::Bind(&DisplayConfiguratorTest::QueryContentProtectionCallback, 1196 base::Bind(&DisplayConfiguratorTest::QueryContentProtectionCallback,
1230 base::Unretained(this))); 1197 base::Unretained(this)));
1231 EXPECT_EQ(3, query_content_protection_call_count_); 1198 EXPECT_EQ(3, query_content_protection_call_count_);
1232 EXPECT_TRUE(query_content_protection_response_.success); 1199 EXPECT_TRUE(query_content_protection_response_.success);
1233 EXPECT_EQ(static_cast<uint32_t>(DISPLAY_CONNECTION_TYPE_HDMI), 1200 EXPECT_EQ(static_cast<uint32_t>(DISPLAY_CONNECTION_TYPE_HDMI),
1234 query_content_protection_response_.link_mask); 1201 query_content_protection_response_.link_mask);
1235 EXPECT_EQ(static_cast<uint32_t>(CONTENT_PROTECTION_METHOD_HDCP), 1202 EXPECT_EQ(static_cast<uint32_t>(CONTENT_PROTECTION_METHOD_HDCP),
1236 query_content_protection_response_.protection_mask); 1203 query_content_protection_response_.protection_mask);
1237 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 1204 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
1238 1205
1239 // Protections should be disabled after unregister. 1206 // Protections should be disabled after unregister.
1240 configurator_.UnregisterContentProtectionClient(id); 1207 configurator_.UnregisterContentProtectionClient(id);
1241 EXPECT_EQ(GetSetHDCPStateAction(outputs_[1], HDCP_STATE_UNDESIRED), 1208 EXPECT_EQ(GetSetHDCPStateAction(*outputs_[1], HDCP_STATE_UNDESIRED),
1242 log_->GetActionsAndClear()); 1209 log_->GetActionsAndClear());
1243 } 1210 }
1244 1211
1245 TEST_F(DisplayConfiguratorTest, DoNotConfigureWithSuspendedDisplays) { 1212 TEST_F(DisplayConfiguratorTest, DoNotConfigureWithSuspendedDisplays) {
1246 InitWithSingleOutput(); 1213 InitWithSingleOutput();
1247 1214
1248 // The DisplayConfigurator may occasionally receive OnConfigurationChanged() 1215 // The DisplayConfigurator may occasionally receive OnConfigurationChanged()
1249 // after the displays have been suspended. This event should be ignored since 1216 // after the displays have been suspended. This event should be ignored since
1250 // the DisplayConfigurator will force a probe and reconfiguration of displays 1217 // the DisplayConfigurator will force a probe and reconfiguration of displays
1251 // at resume time. 1218 // at resume time.
1252 configurator_.SuspendDisplays(base::Bind( 1219 configurator_.SuspendDisplays(base::Bind(
1253 &DisplayConfiguratorTest::OnConfiguredCallback, base::Unretained(this))); 1220 &DisplayConfiguratorTest::OnConfiguredCallback, base::Unretained(this)));
1254 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 1221 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
1255 EXPECT_EQ( 1222 EXPECT_EQ(JoinActions(
1256 JoinActions( 1223 kGrab, GetFramebufferAction(small_mode_.size(),
1257 kGrab, 1224 outputs_[0].get(), nullptr)
1258 GetFramebufferAction(small_mode_.size(), &outputs_[0], NULL).c_str(), 1225 .c_str(),
1259 GetCrtcAction(outputs_[0], NULL, gfx::Point(0, 0)).c_str(), 1226 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
1260 kUngrab, 1227 kUngrab, kSync, nullptr),
1261 kSync, 1228 log_->GetActionsAndClear());
1262 NULL),
1263 log_->GetActionsAndClear());
1264 1229
1265 // The configuration timer should not be started when the displays 1230 // The configuration timer should not be started when the displays
1266 // are suspended. 1231 // are suspended.
1267 configurator_.OnConfigurationChanged(); 1232 configurator_.OnConfigurationChanged();
1268 EXPECT_FALSE(test_api_.TriggerConfigureTimeout()); 1233 EXPECT_FALSE(test_api_.TriggerConfigureTimeout());
1269 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 1234 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
1270 1235
1271 // Calls to SetDisplayPower should do nothing if the power state doesn't 1236 // Calls to SetDisplayPower should do nothing if the power state doesn't
1272 // change. 1237 // change.
1273 configurator_.SetDisplayPower( 1238 configurator_.SetDisplayPower(
1274 chromeos::DISPLAY_POWER_ALL_OFF, 1239 chromeos::DISPLAY_POWER_ALL_OFF,
1275 DisplayConfigurator::kSetDisplayPowerNoFlags, 1240 DisplayConfigurator::kSetDisplayPowerNoFlags,
1276 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 1241 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
1277 base::Unretained(this))); 1242 base::Unretained(this)));
1278 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 1243 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
1279 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 1244 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
1280 configurator_.SetDisplayPower( 1245 configurator_.SetDisplayPower(
1281 chromeos::DISPLAY_POWER_ALL_ON, 1246 chromeos::DISPLAY_POWER_ALL_ON,
1282 DisplayConfigurator::kSetDisplayPowerNoFlags, 1247 DisplayConfigurator::kSetDisplayPowerNoFlags,
1283 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 1248 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
1284 base::Unretained(this))); 1249 base::Unretained(this)));
1285 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 1250 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
1286 EXPECT_EQ( 1251 EXPECT_EQ(
1287 JoinActions( 1252 JoinActions(
1288 kGrab, 1253 kGrab,
1289 GetFramebufferAction(small_mode_.size(), &outputs_[0], NULL).c_str(), 1254 GetFramebufferAction(small_mode_.size(), outputs_[0].get(), nullptr)
1290 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 1255 .c_str(),
1291 kForceDPMS, 1256 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1292 kUngrab, 1257 kForceDPMS, kUngrab, nullptr),
1293 NULL),
1294 log_->GetActionsAndClear()); 1258 log_->GetActionsAndClear());
1295 1259
1296 UpdateOutputs(2, false); 1260 UpdateOutputs(2, false);
1297 configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR); 1261 configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR);
1298 EXPECT_EQ( 1262 EXPECT_EQ(
1299 JoinActions( 1263 JoinActions(
1300 kGrab, 1264 kGrab, GetFramebufferAction(small_mode_.size(), outputs_[0].get(),
1301 GetFramebufferAction(small_mode_.size(), &outputs_[0], &outputs_[1]) 1265 outputs_[1].get())
1302 .c_str(), 1266 .c_str(),
1303 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 1267 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1304 GetCrtcAction(outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(), 1268 GetCrtcAction(*outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(),
1305 kUngrab, 1269 kUngrab, nullptr),
1306 NULL),
1307 log_->GetActionsAndClear()); 1270 log_->GetActionsAndClear());
1308 1271
1309 // The DisplayConfigurator should do nothing at resume time if there is no 1272 // The DisplayConfigurator should do nothing at resume time if there is no
1310 // state change. 1273 // state change.
1311 UpdateOutputs(1, false); 1274 UpdateOutputs(1, false);
1312 configurator_.ResumeDisplays(); 1275 configurator_.ResumeDisplays();
1313 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 1276 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
1314 1277
1315 // If a configuration task is pending when the displays are suspended, that 1278 // If a configuration task is pending when the displays are suspended, that
1316 // task should not run either and the timer should be stopped. The displays 1279 // task should not run either and the timer should be stopped. The displays
1317 // should be turned off by suspend. 1280 // should be turned off by suspend.
1318 configurator_.OnConfigurationChanged(); 1281 configurator_.OnConfigurationChanged();
1319 configurator_.SuspendDisplays(base::Bind( 1282 configurator_.SuspendDisplays(base::Bind(
1320 &DisplayConfiguratorTest::OnConfiguredCallback, base::Unretained(this))); 1283 &DisplayConfiguratorTest::OnConfiguredCallback, base::Unretained(this)));
1321 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 1284 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
1322 EXPECT_EQ( 1285 EXPECT_EQ(JoinActions(
1323 JoinActions( 1286 kGrab, GetFramebufferAction(small_mode_.size(),
1324 kGrab, 1287 outputs_[0].get(), nullptr)
1325 GetFramebufferAction(small_mode_.size(), &outputs_[0], NULL).c_str(), 1288 .c_str(),
1326 GetCrtcAction(outputs_[0], NULL, gfx::Point(0, 0)).c_str(), 1289 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
1327 kUngrab, 1290 kUngrab, kSync, nullptr),
1328 kSync, 1291 log_->GetActionsAndClear());
1329 NULL),
1330 log_->GetActionsAndClear());
1331 1292
1332 EXPECT_FALSE(test_api_.TriggerConfigureTimeout()); 1293 EXPECT_FALSE(test_api_.TriggerConfigureTimeout());
1333 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 1294 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
1334 1295
1335 configurator_.ResumeDisplays(); 1296 configurator_.ResumeDisplays();
1336 EXPECT_EQ( 1297 EXPECT_EQ(
1337 JoinActions( 1298 JoinActions(
1338 kGrab, 1299 kGrab,
1339 GetFramebufferAction(small_mode_.size(), &outputs_[0], NULL).c_str(), 1300 GetFramebufferAction(small_mode_.size(), outputs_[0].get(), nullptr)
1340 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 1301 .c_str(),
1341 kForceDPMS, 1302 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1342 kUngrab, 1303 kForceDPMS, kUngrab, nullptr),
1343 NULL),
1344 log_->GetActionsAndClear()); 1304 log_->GetActionsAndClear());
1345 } 1305 }
1346 1306
1347 TEST_F(DisplayConfiguratorTest, ContentProtectionTwoClients) { 1307 TEST_F(DisplayConfiguratorTest, ContentProtectionTwoClients) {
1348 DisplayConfigurator::ContentProtectionClientId client1 = 1308 DisplayConfigurator::ContentProtectionClientId client1 =
1349 configurator_.RegisterContentProtectionClient(); 1309 configurator_.RegisterContentProtectionClient();
1350 DisplayConfigurator::ContentProtectionClientId client2 = 1310 DisplayConfigurator::ContentProtectionClientId client2 =
1351 configurator_.RegisterContentProtectionClient(); 1311 configurator_.RegisterContentProtectionClient();
1352 EXPECT_NE(client1, client2); 1312 EXPECT_NE(client1, client2);
1353 1313
1354 Init(false); 1314 Init(false);
1355 configurator_.ForceInitialConfigure(0); 1315 configurator_.ForceInitialConfigure(0);
1356 UpdateOutputs(2, true); 1316 UpdateOutputs(2, true);
1357 EXPECT_NE(kNoActions, log_->GetActionsAndClear()); 1317 EXPECT_NE(kNoActions, log_->GetActionsAndClear());
1358 1318
1359 // Clients never know state enableness for methods that they didn't request. 1319 // Clients never know state enableness for methods that they didn't request.
1360 configurator_.EnableContentProtection( 1320 configurator_.EnableContentProtection(
1361 client1, outputs_[1].display_id(), CONTENT_PROTECTION_METHOD_HDCP, 1321 client1, outputs_[1]->display_id(), CONTENT_PROTECTION_METHOD_HDCP,
1362 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback, 1322 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback,
1363 base::Unretained(this))); 1323 base::Unretained(this)));
1364 EXPECT_EQ(1, enable_content_protection_call_count_); 1324 EXPECT_EQ(1, enable_content_protection_call_count_);
1365 EXPECT_TRUE(enable_content_protection_status_); 1325 EXPECT_TRUE(enable_content_protection_status_);
1366 EXPECT_EQ(GetSetHDCPStateAction(outputs_[1], HDCP_STATE_DESIRED).c_str(), 1326 EXPECT_EQ(GetSetHDCPStateAction(*outputs_[1], HDCP_STATE_DESIRED).c_str(),
1367 log_->GetActionsAndClear()); 1327 log_->GetActionsAndClear());
1368 native_display_delegate_->set_hdcp_state(HDCP_STATE_ENABLED); 1328 native_display_delegate_->set_hdcp_state(HDCP_STATE_ENABLED);
1369 1329
1370 configurator_.QueryContentProtectionStatus( 1330 configurator_.QueryContentProtectionStatus(
1371 client1, outputs_[1].display_id(), 1331 client1, outputs_[1]->display_id(),
1372 base::Bind(&DisplayConfiguratorTest::QueryContentProtectionCallback, 1332 base::Bind(&DisplayConfiguratorTest::QueryContentProtectionCallback,
1373 base::Unretained(this))); 1333 base::Unretained(this)));
1374 EXPECT_EQ(1, query_content_protection_call_count_); 1334 EXPECT_EQ(1, query_content_protection_call_count_);
1375 EXPECT_TRUE(query_content_protection_response_.success); 1335 EXPECT_TRUE(query_content_protection_response_.success);
1376 EXPECT_EQ(static_cast<uint32_t>(DISPLAY_CONNECTION_TYPE_HDMI), 1336 EXPECT_EQ(static_cast<uint32_t>(DISPLAY_CONNECTION_TYPE_HDMI),
1377 query_content_protection_response_.link_mask); 1337 query_content_protection_response_.link_mask);
1378 EXPECT_EQ(CONTENT_PROTECTION_METHOD_HDCP, 1338 EXPECT_EQ(CONTENT_PROTECTION_METHOD_HDCP,
1379 query_content_protection_response_.protection_mask); 1339 query_content_protection_response_.protection_mask);
1380 1340
1381 configurator_.QueryContentProtectionStatus( 1341 configurator_.QueryContentProtectionStatus(
1382 client2, outputs_[1].display_id(), 1342 client2, outputs_[1]->display_id(),
1383 base::Bind(&DisplayConfiguratorTest::QueryContentProtectionCallback, 1343 base::Bind(&DisplayConfiguratorTest::QueryContentProtectionCallback,
1384 base::Unretained(this))); 1344 base::Unretained(this)));
1385 EXPECT_EQ(2, query_content_protection_call_count_); 1345 EXPECT_EQ(2, query_content_protection_call_count_);
1386 EXPECT_TRUE(query_content_protection_response_.success); 1346 EXPECT_TRUE(query_content_protection_response_.success);
1387 EXPECT_EQ(static_cast<uint32_t>(DISPLAY_CONNECTION_TYPE_HDMI), 1347 EXPECT_EQ(static_cast<uint32_t>(DISPLAY_CONNECTION_TYPE_HDMI),
1388 query_content_protection_response_.link_mask); 1348 query_content_protection_response_.link_mask);
1389 EXPECT_EQ(CONTENT_PROTECTION_METHOD_NONE, 1349 EXPECT_EQ(CONTENT_PROTECTION_METHOD_NONE,
1390 query_content_protection_response_.protection_mask); 1350 query_content_protection_response_.protection_mask);
1391 1351
1392 // Protections will be disabled only if no more clients request them. 1352 // Protections will be disabled only if no more clients request them.
1393 configurator_.EnableContentProtection( 1353 configurator_.EnableContentProtection(
1394 client2, outputs_[1].display_id(), CONTENT_PROTECTION_METHOD_NONE, 1354 client2, outputs_[1]->display_id(), CONTENT_PROTECTION_METHOD_NONE,
1395 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback, 1355 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback,
1396 base::Unretained(this))); 1356 base::Unretained(this)));
1397 EXPECT_EQ(2, enable_content_protection_call_count_); 1357 EXPECT_EQ(2, enable_content_protection_call_count_);
1398 EXPECT_TRUE(enable_content_protection_status_); 1358 EXPECT_TRUE(enable_content_protection_status_);
1399 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 1359 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
1400 1360
1401 configurator_.EnableContentProtection( 1361 configurator_.EnableContentProtection(
1402 client1, outputs_[1].display_id(), CONTENT_PROTECTION_METHOD_NONE, 1362 client1, outputs_[1]->display_id(), CONTENT_PROTECTION_METHOD_NONE,
1403 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback, 1363 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback,
1404 base::Unretained(this))); 1364 base::Unretained(this)));
1405 EXPECT_EQ(3, enable_content_protection_call_count_); 1365 EXPECT_EQ(3, enable_content_protection_call_count_);
1406 EXPECT_TRUE(enable_content_protection_status_); 1366 EXPECT_TRUE(enable_content_protection_status_);
1407 EXPECT_EQ(GetSetHDCPStateAction(outputs_[1], HDCP_STATE_UNDESIRED).c_str(), 1367 EXPECT_EQ(GetSetHDCPStateAction(*outputs_[1], HDCP_STATE_UNDESIRED).c_str(),
1408 log_->GetActionsAndClear()); 1368 log_->GetActionsAndClear());
1409 } 1369 }
1410 1370
1411 TEST_F(DisplayConfiguratorTest, ContentProtectionTwoClientsEnable) { 1371 TEST_F(DisplayConfiguratorTest, ContentProtectionTwoClientsEnable) {
1412 DisplayConfigurator::ContentProtectionClientId client1 = 1372 DisplayConfigurator::ContentProtectionClientId client1 =
1413 configurator_.RegisterContentProtectionClient(); 1373 configurator_.RegisterContentProtectionClient();
1414 DisplayConfigurator::ContentProtectionClientId client2 = 1374 DisplayConfigurator::ContentProtectionClientId client2 =
1415 configurator_.RegisterContentProtectionClient(); 1375 configurator_.RegisterContentProtectionClient();
1416 EXPECT_NE(client1, client2); 1376 EXPECT_NE(client1, client2);
1417 1377
1418 Init(false); 1378 Init(false);
1419 configurator_.ForceInitialConfigure(0); 1379 configurator_.ForceInitialConfigure(0);
1420 UpdateOutputs(2, true); 1380 UpdateOutputs(2, true);
1421 log_->GetActionsAndClear(); 1381 log_->GetActionsAndClear();
1422 1382
1423 // Only enable once if HDCP is enabling. 1383 // Only enable once if HDCP is enabling.
1424 configurator_.EnableContentProtection( 1384 configurator_.EnableContentProtection(
1425 client1, outputs_[1].display_id(), CONTENT_PROTECTION_METHOD_HDCP, 1385 client1, outputs_[1]->display_id(), CONTENT_PROTECTION_METHOD_HDCP,
1426 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback, 1386 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback,
1427 base::Unretained(this))); 1387 base::Unretained(this)));
1428 EXPECT_EQ(1, enable_content_protection_call_count_); 1388 EXPECT_EQ(1, enable_content_protection_call_count_);
1429 EXPECT_TRUE(enable_content_protection_status_); 1389 EXPECT_TRUE(enable_content_protection_status_);
1430 native_display_delegate_->set_hdcp_state(HDCP_STATE_DESIRED); 1390 native_display_delegate_->set_hdcp_state(HDCP_STATE_DESIRED);
1431 configurator_.EnableContentProtection( 1391 configurator_.EnableContentProtection(
1432 client2, outputs_[1].display_id(), CONTENT_PROTECTION_METHOD_HDCP, 1392 client2, outputs_[1]->display_id(), CONTENT_PROTECTION_METHOD_HDCP,
1433 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback, 1393 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback,
1434 base::Unretained(this))); 1394 base::Unretained(this)));
1435 EXPECT_EQ(2, enable_content_protection_call_count_); 1395 EXPECT_EQ(2, enable_content_protection_call_count_);
1436 EXPECT_TRUE(enable_content_protection_status_); 1396 EXPECT_TRUE(enable_content_protection_status_);
1437 EXPECT_EQ(GetSetHDCPStateAction(outputs_[1], HDCP_STATE_DESIRED).c_str(), 1397 EXPECT_EQ(GetSetHDCPStateAction(*outputs_[1], HDCP_STATE_DESIRED).c_str(),
1438 log_->GetActionsAndClear()); 1398 log_->GetActionsAndClear());
1439 native_display_delegate_->set_hdcp_state(HDCP_STATE_ENABLED); 1399 native_display_delegate_->set_hdcp_state(HDCP_STATE_ENABLED);
1440 1400
1441 // Don't enable again if HDCP is already active. 1401 // Don't enable again if HDCP is already active.
1442 configurator_.EnableContentProtection( 1402 configurator_.EnableContentProtection(
1443 client1, outputs_[1].display_id(), CONTENT_PROTECTION_METHOD_HDCP, 1403 client1, outputs_[1]->display_id(), CONTENT_PROTECTION_METHOD_HDCP,
1444 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback, 1404 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback,
1445 base::Unretained(this))); 1405 base::Unretained(this)));
1446 EXPECT_EQ(3, enable_content_protection_call_count_); 1406 EXPECT_EQ(3, enable_content_protection_call_count_);
1447 EXPECT_TRUE(enable_content_protection_status_); 1407 EXPECT_TRUE(enable_content_protection_status_);
1448 configurator_.EnableContentProtection( 1408 configurator_.EnableContentProtection(
1449 client2, outputs_[1].display_id(), CONTENT_PROTECTION_METHOD_HDCP, 1409 client2, outputs_[1]->display_id(), CONTENT_PROTECTION_METHOD_HDCP,
1450 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback, 1410 base::Bind(&DisplayConfiguratorTest::EnableContentProtectionCallback,
1451 base::Unretained(this))); 1411 base::Unretained(this)));
1452 EXPECT_EQ(4, enable_content_protection_call_count_); 1412 EXPECT_EQ(4, enable_content_protection_call_count_);
1453 EXPECT_TRUE(enable_content_protection_status_); 1413 EXPECT_TRUE(enable_content_protection_status_);
1454 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 1414 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
1455 } 1415 }
1456 1416
1457 TEST_F(DisplayConfiguratorTest, HandleConfigureCrtcFailure) { 1417 TEST_F(DisplayConfiguratorTest, HandleConfigureCrtcFailure) {
1458 InitWithSingleOutput(); 1418 InitWithSingleOutput();
1459 1419
1460 ScopedVector<const DisplayMode> modes; 1420 std::vector<std::unique_ptr<const DisplayMode>> modes;
1461 // The first mode is the mode we are requesting DisplayConfigurator to choose. 1421 // The first mode is the mode we are requesting DisplayConfigurator to choose.
1462 // The test will be setup so that this mode will fail and it will have to 1422 // The test will be setup so that this mode will fail and it will have to
1463 // choose the next best option. 1423 // choose the next best option.
1464 modes.push_back(new DisplayMode(gfx::Size(2560, 1600), false, 60.0)); 1424 modes.push_back(MakeDisplayMode(2560, 1600, false, 60.0));
1465 modes.push_back(new DisplayMode(gfx::Size(1024, 768), false, 60.0)); 1425 modes.push_back(MakeDisplayMode(1024, 768, false, 60.0));
1466 modes.push_back(new DisplayMode(gfx::Size(1280, 720), false, 60.0)); 1426 modes.push_back(MakeDisplayMode(1280, 720, false, 60.0));
1467 modes.push_back(new DisplayMode(gfx::Size(1920, 1080), false, 60.0)); 1427 modes.push_back(MakeDisplayMode(1920, 1080, false, 60.0));
1468 modes.push_back(new DisplayMode(gfx::Size(1920, 1080), false, 40.0)); 1428 modes.push_back(MakeDisplayMode(1920, 1080, false, 40.0));
1469 1429
1470 for (unsigned int i = 0; i < arraysize(outputs_); i++) { 1430 outputs_[0] = display::FakeDisplaySnapshot::Builder()
1471 std::vector<std::unique_ptr<const DisplayMode>> tmp_modes; 1431 .SetId(kDisplayIds[0])
1472 for (const DisplayMode* mode : modes) 1432 .SetNativeMode(modes[0]->Clone())
1473 tmp_modes.push_back(mode->Clone()); 1433 .SetCurrentMode(modes[0]->Clone())
1474 outputs_[i].set_current_mode(tmp_modes[0].get()); 1434 .AddMode(modes[1]->Clone())
1475 outputs_[i].set_native_mode(tmp_modes[0].get()); 1435 .AddMode(modes[2]->Clone())
1476 outputs_[i].set_modes(std::move(tmp_modes)); 1436 .AddMode(modes[3]->Clone())
1477 } 1437 .AddMode(modes[4]->Clone())
1438 .SetType(DISPLAY_CONNECTION_TYPE_INTERNAL)
1439 .SetIsAspectPerservingScaling(true)
1440 .Build();
1478 1441
1479 // First test simply fails in MULTIPLE_DISPLAY_STATE_SINGLE mode. This is 1442 // First test simply fails in MULTIPLE_DISPLAY_STATE_SINGLE mode. This is
1480 // probably unrealistic but we want to make sure any assumptions don't creep 1443 // probably unrealistic but we want to make sure any assumptions don't creep
1481 // in. 1444 // in.
1482 native_display_delegate_->set_max_configurable_pixels( 1445 native_display_delegate_->set_max_configurable_pixels(
1483 modes[2]->size().GetArea()); 1446 modes[2]->size().GetArea());
1484 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_SINGLE); 1447 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_SINGLE);
1485 UpdateOutputs(1, true); 1448 UpdateOutputs(1, true);
1486 1449
1487 EXPECT_EQ( 1450 EXPECT_EQ(
1488 JoinActions( 1451 JoinActions(
1489 kGrab, 1452 kGrab,
1490 GetFramebufferAction(big_mode_.size(), &outputs_[0], NULL).c_str(), 1453 GetFramebufferAction(big_mode_.size(), outputs_[0].get(), nullptr)
1491 GetCrtcAction(outputs_[0], modes[0], gfx::Point(0, 0)).c_str(), 1454 .c_str(),
1492 GetCrtcAction(outputs_[0], modes[3], gfx::Point(0, 0)).c_str(), 1455 GetCrtcAction(*outputs_[0], modes[0].get(), gfx::Point(0, 0)).c_str(),
1493 GetCrtcAction(outputs_[0], modes[2], gfx::Point(0, 0)).c_str(), 1456 GetCrtcAction(*outputs_[0], modes[3].get(), gfx::Point(0, 0)).c_str(),
1494 kUngrab, 1457 GetCrtcAction(*outputs_[0], modes[2].get(), gfx::Point(0, 0)).c_str(),
1495 NULL), 1458 kUngrab, nullptr),
1496 log_->GetActionsAndClear()); 1459 log_->GetActionsAndClear());
1497 1460
1461 outputs_[1] = display::FakeDisplaySnapshot::Builder()
1462 .SetId(kDisplayIds[1])
1463 .SetNativeMode(modes[0]->Clone())
1464 .SetCurrentMode(modes[0]->Clone())
1465 .AddMode(modes[1]->Clone())
1466 .AddMode(modes[2]->Clone())
1467 .AddMode(modes[3]->Clone())
1468 .AddMode(modes[4]->Clone())
1469 .SetType(DISPLAY_CONNECTION_TYPE_HDMI)
1470 .SetIsAspectPerservingScaling(true)
1471 .Build();
1472
1498 // This test should attempt to configure a mirror mode that will not succeed 1473 // This test should attempt to configure a mirror mode that will not succeed
1499 // and should end up in extended mode. 1474 // and should end up in extended mode.
1500 native_display_delegate_->set_max_configurable_pixels( 1475 native_display_delegate_->set_max_configurable_pixels(
1501 modes[3]->size().GetArea()); 1476 modes[3]->size().GetArea());
1502 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR); 1477 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR);
1503 UpdateOutputs(2, true); 1478 UpdateOutputs(2, true);
1504 1479
1505 EXPECT_EQ( 1480 EXPECT_EQ(
1506 JoinActions( 1481 JoinActions(
1507 kGrab, GetFramebufferAction(modes[0]->size(), &outputs_[0], 1482 kGrab, GetFramebufferAction(modes[0]->size(), outputs_[0].get(),
1508 &outputs_[1]).c_str(), 1483 outputs_[1].get())
1509 GetCrtcAction(outputs_[0], modes[0], gfx::Point(0, 0)).c_str(), 1484 .c_str(),
1485 GetCrtcAction(*outputs_[0], modes[0].get(), gfx::Point(0, 0)).c_str(),
1510 // Then attempt to configure crtc1 with the first mode. 1486 // Then attempt to configure crtc1 with the first mode.
1511 GetCrtcAction(outputs_[1], modes[0], gfx::Point(0, 0)).c_str(), 1487 GetCrtcAction(*outputs_[1], modes[0].get(), gfx::Point(0, 0)).c_str(),
1512 // First mode tried is expected to fail and it will 1488 // First mode tried is expected to fail and it will
1513 // retry wil the 4th mode in the list. 1489 // retry wil the 4th mode in the list.
1514 GetCrtcAction(outputs_[0], modes[3], gfx::Point(0, 0)).c_str(), 1490 GetCrtcAction(*outputs_[0], modes[3].get(), gfx::Point(0, 0)).c_str(),
1515 GetCrtcAction(outputs_[1], modes[3], gfx::Point(0, 0)).c_str(), 1491 GetCrtcAction(*outputs_[1], modes[3].get(), gfx::Point(0, 0)).c_str(),
1516 // Since it was requested to go into mirror mode 1492 // Since it was requested to go into mirror mode
1517 // and the configured modes were different, it 1493 // and the configured modes were different, it
1518 // should now try and setup a valid configurable 1494 // should now try and setup a valid configurable
1519 // extended mode. 1495 // extended mode.
1520 GetFramebufferAction( 1496 GetFramebufferAction(
1521 gfx::Size(modes[0]->size().width(), 1497 gfx::Size(modes[0]->size().width(),
1522 modes[0]->size().height() + modes[0]->size().height() + 1498 modes[0]->size().height() + modes[0]->size().height() +
1523 DisplayConfigurator::kVerticalGap), 1499 DisplayConfigurator::kVerticalGap),
1524 &outputs_[0], &outputs_[1]).c_str(), 1500 outputs_[0].get(), outputs_[1].get())
1525 GetCrtcAction(outputs_[0], modes[0], gfx::Point(0, 0)).c_str(), 1501 .c_str(),
1526 GetCrtcAction(outputs_[1], modes[0], 1502 GetCrtcAction(*outputs_[0], modes[0].get(), gfx::Point(0, 0)).c_str(),
1503 GetCrtcAction(*outputs_[1], modes[0].get(),
1527 gfx::Point(0, modes[0]->size().height() + 1504 gfx::Point(0, modes[0]->size().height() +
1528 DisplayConfigurator::kVerticalGap)) 1505 DisplayConfigurator::kVerticalGap))
1529 .c_str(), 1506 .c_str(),
1530 GetCrtcAction(outputs_[0], modes[3], gfx::Point(0, 0)).c_str(), 1507 GetCrtcAction(*outputs_[0], modes[3].get(), gfx::Point(0, 0)).c_str(),
1531 GetCrtcAction(outputs_[1], modes[3], 1508 GetCrtcAction(*outputs_[1], modes[3].get(),
1532 gfx::Point(0, modes[0]->size().height() + 1509 gfx::Point(0, modes[0]->size().height() +
1533 DisplayConfigurator::kVerticalGap)) 1510 DisplayConfigurator::kVerticalGap))
1534 .c_str(), 1511 .c_str(),
1535 kUngrab, NULL), 1512 kUngrab, nullptr),
1536 log_->GetActionsAndClear()); 1513 log_->GetActionsAndClear());
1537 } 1514 }
1538 1515
1539 // Tests that power state requests are saved after failed configuration attempts 1516 // Tests that power state requests are saved after failed configuration attempts
1540 // so they can be reused later: http://crosbug.com/p/31571 1517 // so they can be reused later: http://crosbug.com/p/31571
1541 TEST_F(DisplayConfiguratorTest, SaveDisplayPowerStateOnConfigFailure) { 1518 TEST_F(DisplayConfiguratorTest, SaveDisplayPowerStateOnConfigFailure) {
1542 // Start out with two displays in extended mode. 1519 // Start out with two displays in extended mode.
1543 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED); 1520 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED);
1544 Init(false); 1521 Init(false);
1545 configurator_.ForceInitialConfigure(0); 1522 configurator_.ForceInitialConfigure(0);
(...skipping 22 matching lines...) Expand all
1568 EXPECT_EQ(CALLBACK_FAILURE, PopCallbackResult()); 1545 EXPECT_EQ(CALLBACK_FAILURE, PopCallbackResult());
1569 EXPECT_EQ(1, observer_.num_changes()); 1546 EXPECT_EQ(1, observer_.num_changes());
1570 EXPECT_EQ(1, observer_.num_failures()); 1547 EXPECT_EQ(1, observer_.num_failures());
1571 log_->GetActionsAndClear(); 1548 log_->GetActionsAndClear();
1572 1549
1573 // Simulate the external display getting disconnected and check that the 1550 // Simulate the external display getting disconnected and check that the
1574 // internal display is turned on (i.e. DISPLAY_POWER_ALL_ON is used) rather 1551 // internal display is turned on (i.e. DISPLAY_POWER_ALL_ON is used) rather
1575 // than the earlier DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON state. 1552 // than the earlier DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON state.
1576 native_display_delegate_->set_max_configurable_pixels(0); 1553 native_display_delegate_->set_max_configurable_pixels(0);
1577 UpdateOutputs(1, true); 1554 UpdateOutputs(1, true);
1578 EXPECT_EQ(JoinActions(kGrab, GetFramebufferAction(small_mode_.size(), 1555 EXPECT_EQ(
1579 &outputs_[0], NULL).c_str(), 1556 JoinActions(
1580 GetCrtcAction(outputs_[0], &small_mode_, 1557 kGrab,
1581 gfx::Point(0, 0)).c_str(), 1558 GetFramebufferAction(small_mode_.size(), outputs_[0].get(), nullptr)
1582 kForceDPMS, kUngrab, NULL), 1559 .c_str(),
1583 log_->GetActionsAndClear()); 1560 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1561 kForceDPMS, kUngrab, nullptr),
1562 log_->GetActionsAndClear());
1584 } 1563 }
1585 1564
1586 // Tests that the SetDisplayPowerState() task posted by HandleResume() doesn't 1565 // Tests that the SetDisplayPowerState() task posted by HandleResume() doesn't
1587 // use a stale state if a new state is requested before it runs: 1566 // use a stale state if a new state is requested before it runs:
1588 // http://crosbug.com/p/32393 1567 // http://crosbug.com/p/32393
1589 TEST_F(DisplayConfiguratorTest, DontRestoreStalePowerStateAfterResume) { 1568 TEST_F(DisplayConfiguratorTest, DontRestoreStalePowerStateAfterResume) {
1590 // Start out with two displays in mirrored mode. 1569 // Start out with two displays in mirrored mode.
1591 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR); 1570 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_MIRROR);
1592 Init(false); 1571 Init(false);
1593 configurator_.ForceInitialConfigure(0); 1572 configurator_.ForceInitialConfigure(0);
1594 log_->GetActionsAndClear(); 1573 log_->GetActionsAndClear();
1595 observer_.Reset(); 1574 observer_.Reset();
1596 1575
1597 // Turn off the internal display, simulating docked mode. 1576 // Turn off the internal display, simulating docked mode.
1598 configurator_.SetDisplayPower( 1577 configurator_.SetDisplayPower(
1599 chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON, 1578 chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON,
1600 DisplayConfigurator::kSetDisplayPowerNoFlags, 1579 DisplayConfigurator::kSetDisplayPowerNoFlags,
1601 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 1580 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
1602 base::Unretained(this))); 1581 base::Unretained(this)));
1603 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 1582 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
1604 EXPECT_EQ(1, observer_.num_changes()); 1583 EXPECT_EQ(1, observer_.num_changes());
1605 EXPECT_EQ(0, observer_.num_failures()); 1584 EXPECT_EQ(0, observer_.num_failures());
1606 EXPECT_EQ( 1585 EXPECT_EQ(
1607 JoinActions( 1586 JoinActions(
1608 kGrab, 1587 kGrab, GetFramebufferAction(big_mode_.size(), outputs_[0].get(),
1609 GetFramebufferAction(big_mode_.size(), &outputs_[0], &outputs_[1]) 1588 outputs_[1].get())
1610 .c_str(), 1589 .c_str(),
1611 GetCrtcAction(outputs_[0], NULL, gfx::Point(0, 0)).c_str(), 1590 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
1612 GetCrtcAction(outputs_[1], &big_mode_, gfx::Point(0, 0)).c_str(), 1591 GetCrtcAction(*outputs_[1], &big_mode_, gfx::Point(0, 0)).c_str(),
1613 kForceDPMS, 1592 kForceDPMS, kUngrab, nullptr),
1614 kUngrab,
1615 NULL),
1616 log_->GetActionsAndClear()); 1593 log_->GetActionsAndClear());
1617 1594
1618 // Suspend and resume the system. Resuming should restore the previous power 1595 // Suspend and resume the system. Resuming should restore the previous power
1619 // state and force a probe. Suspend should turn off the displays since an 1596 // state and force a probe. Suspend should turn off the displays since an
1620 // external monitor is connected. 1597 // external monitor is connected.
1621 configurator_.SuspendDisplays(base::Bind( 1598 configurator_.SuspendDisplays(base::Bind(
1622 &DisplayConfiguratorTest::OnConfiguredCallback, base::Unretained(this))); 1599 &DisplayConfiguratorTest::OnConfiguredCallback, base::Unretained(this)));
1623 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 1600 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
1624 EXPECT_EQ(2, observer_.num_changes()); 1601 EXPECT_EQ(2, observer_.num_changes());
1625 EXPECT_EQ( 1602 EXPECT_EQ(
1626 JoinActions( 1603 JoinActions(
1627 kGrab, 1604 kGrab, GetFramebufferAction(small_mode_.size(), outputs_[0].get(),
1628 GetFramebufferAction(small_mode_.size(), &outputs_[0], 1605 outputs_[1].get())
1629 &outputs_[1]).c_str(), 1606 .c_str(),
1630 GetCrtcAction(outputs_[0], NULL, gfx::Point(0, 0)).c_str(), 1607 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
1631 GetCrtcAction(outputs_[1], NULL, gfx::Point(0, 0)).c_str(), 1608 GetCrtcAction(*outputs_[1], nullptr, gfx::Point(0, 0)).c_str(),
1632 kUngrab, 1609 kUngrab, kSync, nullptr),
1633 kSync,
1634 NULL),
1635 log_->GetActionsAndClear()); 1610 log_->GetActionsAndClear());
1636 1611
1637 // Before the task runs, exit docked mode. 1612 // Before the task runs, exit docked mode.
1638 configurator_.SetDisplayPower( 1613 configurator_.SetDisplayPower(
1639 chromeos::DISPLAY_POWER_ALL_ON, 1614 chromeos::DISPLAY_POWER_ALL_ON,
1640 DisplayConfigurator::kSetDisplayPowerNoFlags, 1615 DisplayConfigurator::kSetDisplayPowerNoFlags,
1641 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 1616 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
1642 base::Unretained(this))); 1617 base::Unretained(this)));
1643 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 1618 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
1644 EXPECT_EQ(3, observer_.num_changes()); 1619 EXPECT_EQ(3, observer_.num_changes());
1645 EXPECT_EQ(0, observer_.num_failures()); 1620 EXPECT_EQ(0, observer_.num_failures());
1646 EXPECT_EQ( 1621 EXPECT_EQ(
1647 JoinActions( 1622 JoinActions(
1648 kGrab, 1623 kGrab, GetFramebufferAction(small_mode_.size(), outputs_[0].get(),
1649 GetFramebufferAction(small_mode_.size(), &outputs_[0], &outputs_[1]) 1624 outputs_[1].get())
1650 .c_str(), 1625 .c_str(),
1651 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 1626 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1652 GetCrtcAction(outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(), 1627 GetCrtcAction(*outputs_[1], &small_mode_, gfx::Point(0, 0)).c_str(),
1653 kForceDPMS, 1628 kForceDPMS, kUngrab, nullptr),
1654 kUngrab,
1655 NULL),
1656 log_->GetActionsAndClear()); 1629 log_->GetActionsAndClear());
1657 1630
1658 // Check that the display states are not changed after resuming. 1631 // Check that the display states are not changed after resuming.
1659 configurator_.ResumeDisplays(); 1632 configurator_.ResumeDisplays();
1660 EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); 1633 EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
1661 } 1634 }
1662 1635
1663 TEST_F(DisplayConfiguratorTest, ExternalControl) { 1636 TEST_F(DisplayConfiguratorTest, ExternalControl) {
1664 InitWithSingleOutput(); 1637 InitWithSingleOutput();
1665 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_SINGLE); 1638 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_SINGLE);
1666 configurator_.RelinquishControl( 1639 configurator_.RelinquishControl(
1667 base::Bind(&DisplayConfiguratorTest::OnDisplayControlUpdated, 1640 base::Bind(&DisplayConfiguratorTest::OnDisplayControlUpdated,
1668 base::Unretained(this))); 1641 base::Unretained(this)));
1669 EXPECT_EQ(CALLBACK_SUCCESS, PopDisplayControlResult()); 1642 EXPECT_EQ(CALLBACK_SUCCESS, PopDisplayControlResult());
1643 EXPECT_EQ(JoinActions(kRelinquishDisplayControl, nullptr),
1644 log_->GetActionsAndClear());
1645 configurator_.TakeControl(
1646 base::Bind(&DisplayConfiguratorTest::OnDisplayControlUpdated,
1647 base::Unretained(this)));
1648 EXPECT_EQ(CALLBACK_SUCCESS, PopDisplayControlResult());
1670 EXPECT_EQ( 1649 EXPECT_EQ(
1671 JoinActions( 1650 JoinActions(
1672 kRelinquishDisplayControl, 1651 kTakeDisplayControl, kGrab,
1673 NULL), 1652 GetFramebufferAction(small_mode_.size(), outputs_[0].get(), nullptr)
1653 .c_str(),
1654 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1655 kUngrab, nullptr),
1674 log_->GetActionsAndClear()); 1656 log_->GetActionsAndClear());
1675 configurator_.TakeControl(
1676 base::Bind(&DisplayConfiguratorTest::OnDisplayControlUpdated,
1677 base::Unretained(this)));
1678 EXPECT_EQ(CALLBACK_SUCCESS, PopDisplayControlResult());
1679 EXPECT_EQ(JoinActions(kTakeDisplayControl, kGrab,
1680 GetFramebufferAction(small_mode_.size(), &outputs_[0],
1681 nullptr).c_str(),
1682 GetCrtcAction(outputs_[0], &small_mode_,
1683 gfx::Point(0, 0)).c_str(),
1684 kUngrab, NULL),
1685 log_->GetActionsAndClear());
1686 } 1657 }
1687 1658
1688 TEST_F(DisplayConfiguratorTest, 1659 TEST_F(DisplayConfiguratorTest,
1689 SetDisplayPowerWhilePendingConfigurationTaskRunning) { 1660 SetDisplayPowerWhilePendingConfigurationTaskRunning) {
1690 // Start out with two displays in extended mode. 1661 // Start out with two displays in extended mode.
1691 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED); 1662 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED);
1692 Init(false); 1663 Init(false);
1693 configurator_.ForceInitialConfigure(0); 1664 configurator_.ForceInitialConfigure(0);
1694 log_->GetActionsAndClear(); 1665 log_->GetActionsAndClear();
1695 observer_.Reset(); 1666 observer_.Reset();
(...skipping 18 matching lines...) Expand all
1714 EXPECT_EQ(1, observer_.num_changes()); 1685 EXPECT_EQ(1, observer_.num_changes());
1715 EXPECT_EQ(0, observer_.num_failures()); 1686 EXPECT_EQ(0, observer_.num_failures());
1716 1687
1717 const int kDualHeight = small_mode_.size().height() + 1688 const int kDualHeight = small_mode_.size().height() +
1718 DisplayConfigurator::kVerticalGap + 1689 DisplayConfigurator::kVerticalGap +
1719 big_mode_.size().height(); 1690 big_mode_.size().height();
1720 EXPECT_EQ( 1691 EXPECT_EQ(
1721 JoinActions( 1692 JoinActions(
1722 kGrab, 1693 kGrab,
1723 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight), 1694 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight),
1724 &outputs_[0], &outputs_[1]) 1695 outputs_[0].get(), outputs_[1].get())
1725 .c_str(), 1696 .c_str(),
1726 GetCrtcAction(outputs_[0], nullptr, gfx::Point(0, 0)).c_str(), 1697 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
1727 GetCrtcAction(outputs_[1], nullptr, 1698 GetCrtcAction(*outputs_[1], nullptr,
1728 gfx::Point(0, small_mode_.size().height() + 1699 gfx::Point(0, small_mode_.size().height() +
1729 DisplayConfigurator::kVerticalGap)) 1700 DisplayConfigurator::kVerticalGap))
1730 .c_str(), 1701 .c_str(),
1731 kUngrab, NULL), 1702 kUngrab, nullptr),
1732 log_->GetActionsAndClear()); 1703 log_->GetActionsAndClear());
1733 1704
1734 EXPECT_TRUE(test_api_.TriggerConfigureTimeout()); 1705 EXPECT_TRUE(test_api_.TriggerConfigureTimeout());
1735 base::RunLoop().RunUntilIdle(); 1706 base::RunLoop().RunUntilIdle();
1736 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 1707 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
1737 EXPECT_EQ(2, observer_.num_changes()); 1708 EXPECT_EQ(2, observer_.num_changes());
1738 EXPECT_EQ(0, observer_.num_failures()); 1709 EXPECT_EQ(0, observer_.num_failures());
1739 1710
1740 EXPECT_EQ( 1711 EXPECT_EQ(
1741 JoinActions( 1712 JoinActions(
1742 kGrab, 1713 kGrab,
1743 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight), 1714 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight),
1744 &outputs_[0], &outputs_[1]) 1715 outputs_[0].get(), outputs_[1].get())
1745 .c_str(), 1716 .c_str(),
1746 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 1717 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1747 GetCrtcAction(outputs_[1], &big_mode_, 1718 GetCrtcAction(*outputs_[1], &big_mode_,
1748 gfx::Point(0, small_mode_.size().height() + 1719 gfx::Point(0, small_mode_.size().height() +
1749 DisplayConfigurator::kVerticalGap)) 1720 DisplayConfigurator::kVerticalGap))
1750 .c_str(), 1721 .c_str(),
1751 kForceDPMS, kUngrab, NULL), 1722 kForceDPMS, kUngrab, nullptr),
1752 log_->GetActionsAndClear()); 1723 log_->GetActionsAndClear());
1753 } 1724 }
1754 1725
1755 TEST_F(DisplayConfiguratorTest, 1726 TEST_F(DisplayConfiguratorTest,
1756 SetDisplayPowerAfterFailedDisplayConfiguration) { 1727 SetDisplayPowerAfterFailedDisplayConfiguration) {
1757 // Start out with two displays in extended mode. 1728 // Start out with two displays in extended mode.
1758 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED); 1729 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED);
1759 Init(false); 1730 Init(false);
1760 configurator_.ForceInitialConfigure(0); 1731 configurator_.ForceInitialConfigure(0);
1761 log_->GetActionsAndClear(); 1732 log_->GetActionsAndClear();
(...skipping 13 matching lines...) Expand all
1775 EXPECT_EQ(1, observer_.num_failures()); 1746 EXPECT_EQ(1, observer_.num_failures());
1776 1747
1777 const int kDualHeight = small_mode_.size().height() + 1748 const int kDualHeight = small_mode_.size().height() +
1778 DisplayConfigurator::kVerticalGap + 1749 DisplayConfigurator::kVerticalGap +
1779 big_mode_.size().height(); 1750 big_mode_.size().height();
1780 1751
1781 EXPECT_EQ( 1752 EXPECT_EQ(
1782 JoinActions( 1753 JoinActions(
1783 kGrab, 1754 kGrab,
1784 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight), 1755 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight),
1785 &outputs_[0], &outputs_[1]) 1756 outputs_[0].get(), outputs_[1].get())
1786 .c_str(), 1757 .c_str(),
1787 GetCrtcAction(outputs_[0], nullptr, gfx::Point(0, 0)).c_str(), 1758 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
1788 GetCrtcAction(outputs_[1], nullptr, 1759 GetCrtcAction(*outputs_[1], nullptr,
1789 gfx::Point(0, small_mode_.size().height() + 1760 gfx::Point(0, small_mode_.size().height() +
1790 DisplayConfigurator::kVerticalGap)) 1761 DisplayConfigurator::kVerticalGap))
1791 .c_str(), 1762 .c_str(),
1792 kUngrab, NULL), 1763 kUngrab, nullptr),
1793 log_->GetActionsAndClear()); 1764 log_->GetActionsAndClear());
1794 1765
1795 // This configuration should trigger a display configuration since the 1766 // This configuration should trigger a display configuration since the
1796 // previous configuration failed. 1767 // previous configuration failed.
1797 configurator_.SetDisplayPower( 1768 configurator_.SetDisplayPower(
1798 chromeos::DISPLAY_POWER_ALL_ON, 1769 chromeos::DISPLAY_POWER_ALL_ON,
1799 DisplayConfigurator::kSetDisplayPowerNoFlags, 1770 DisplayConfigurator::kSetDisplayPowerNoFlags,
1800 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 1771 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
1801 base::Unretained(this))); 1772 base::Unretained(this)));
1802 1773
1803 EXPECT_EQ(0, observer_.num_changes()); 1774 EXPECT_EQ(0, observer_.num_changes());
1804 EXPECT_EQ(2, observer_.num_failures()); 1775 EXPECT_EQ(2, observer_.num_failures());
1805 EXPECT_EQ( 1776 EXPECT_EQ(
1806 JoinActions( 1777 JoinActions(
1807 kGrab, 1778 kGrab,
1808 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight), 1779 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight),
1809 &outputs_[0], &outputs_[1]) 1780 outputs_[0].get(), outputs_[1].get())
1810 .c_str(), 1781 .c_str(),
1811 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 1782 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1812 GetCrtcAction(outputs_[1], &big_mode_, 1783 GetCrtcAction(*outputs_[1], &big_mode_,
1813 gfx::Point(0, small_mode_.size().height() + 1784 gfx::Point(0, small_mode_.size().height() +
1814 DisplayConfigurator::kVerticalGap)) 1785 DisplayConfigurator::kVerticalGap))
1815 .c_str(), 1786 .c_str(),
1816 GetCrtcAction(outputs_[1], &small_mode_, 1787 GetCrtcAction(*outputs_[1], &small_mode_,
1817 gfx::Point(0, small_mode_.size().height() + 1788 gfx::Point(0, small_mode_.size().height() +
1818 DisplayConfigurator::kVerticalGap)) 1789 DisplayConfigurator::kVerticalGap))
1819 .c_str(), 1790 .c_str(),
1820 kUngrab, NULL), 1791 kUngrab, nullptr),
1821 log_->GetActionsAndClear()); 1792 log_->GetActionsAndClear());
1822 1793
1823 // Allow configuration to succeed. 1794 // Allow configuration to succeed.
1824 native_display_delegate_->set_max_configurable_pixels(0); 1795 native_display_delegate_->set_max_configurable_pixels(0);
1825 1796
1826 // Validate that a configuration event has the proper power state (displays 1797 // Validate that a configuration event has the proper power state (displays
1827 // should be on). 1798 // should be on).
1828 configurator_.OnConfigurationChanged(); 1799 configurator_.OnConfigurationChanged();
1829 EXPECT_TRUE(test_api_.TriggerConfigureTimeout()); 1800 EXPECT_TRUE(test_api_.TriggerConfigureTimeout());
1830 1801
1831 EXPECT_EQ(1, observer_.num_changes()); 1802 EXPECT_EQ(1, observer_.num_changes());
1832 EXPECT_EQ(2, observer_.num_failures()); 1803 EXPECT_EQ(2, observer_.num_failures());
1833 1804
1834 EXPECT_EQ( 1805 EXPECT_EQ(
1835 JoinActions( 1806 JoinActions(
1836 kGrab, 1807 kGrab,
1837 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight), 1808 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight),
1838 &outputs_[0], &outputs_[1]) 1809 outputs_[0].get(), outputs_[1].get())
1839 .c_str(), 1810 .c_str(),
1840 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 1811 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1841 GetCrtcAction(outputs_[1], &big_mode_, 1812 GetCrtcAction(*outputs_[1], &big_mode_,
1842 gfx::Point(0, small_mode_.size().height() + 1813 gfx::Point(0, small_mode_.size().height() +
1843 DisplayConfigurator::kVerticalGap)) 1814 DisplayConfigurator::kVerticalGap))
1844 .c_str(), 1815 .c_str(),
1845 kUngrab, NULL), 1816 kUngrab, nullptr),
1846 log_->GetActionsAndClear()); 1817 log_->GetActionsAndClear());
1847 } 1818 }
1848 1819
1849 TEST_F(DisplayConfiguratorTest, TestWithThreeDisplays) { 1820 TEST_F(DisplayConfiguratorTest, TestWithThreeDisplays) {
1850 // Start out with two displays in extended mode. 1821 // Start out with two displays in extended mode.
1851 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED); 1822 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED);
1852 Init(false); 1823 Init(false);
1853 configurator_.ForceInitialConfigure(0); 1824 configurator_.ForceInitialConfigure(0);
1854 log_->GetActionsAndClear(); 1825 log_->GetActionsAndClear();
1855 observer_.Reset(); 1826 observer_.Reset();
1856 1827
1857 UpdateOutputs(3, true); 1828 UpdateOutputs(3, true);
1858 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED); 1829 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED);
1859 1830
1860 const int kDualHeight = small_mode_.size().height() + 1831 const int kDualHeight = small_mode_.size().height() +
1861 DisplayConfigurator::kVerticalGap + 1832 DisplayConfigurator::kVerticalGap +
1862 big_mode_.size().height(); 1833 big_mode_.size().height();
1863 const int kTripleHeight = 2 * small_mode_.size().height() + 1834 const int kTripleHeight = 2 * small_mode_.size().height() +
1864 2 * DisplayConfigurator::kVerticalGap + 1835 2 * DisplayConfigurator::kVerticalGap +
1865 big_mode_.size().height(); 1836 big_mode_.size().height();
1866 EXPECT_EQ( 1837 EXPECT_EQ(
1867 JoinActions( 1838 JoinActions(
1868 kGrab, GetFramebufferAction( 1839 kGrab, GetFramebufferAction(
1869 gfx::Size(big_mode_.size().width(), kTripleHeight), 1840 gfx::Size(big_mode_.size().width(), kTripleHeight),
1870 &outputs_[0], &outputs_[1]) 1841 outputs_[0].get(), outputs_[1].get())
1871 .c_str(), 1842 .c_str(),
1872 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 1843 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1873 GetCrtcAction(outputs_[1], &big_mode_, 1844 GetCrtcAction(*outputs_[1], &big_mode_,
1874 gfx::Point(0, small_mode_.size().height() + 1845 gfx::Point(0, small_mode_.size().height() +
1875 DisplayConfigurator::kVerticalGap)) 1846 DisplayConfigurator::kVerticalGap))
1876 .c_str(), 1847 .c_str(),
1877 GetCrtcAction( 1848 GetCrtcAction(
1878 outputs_[2], &small_mode_, 1849 *outputs_[2], &small_mode_,
1879 gfx::Point(0, small_mode_.size().height() + 1850 gfx::Point(0, small_mode_.size().height() +
1880 big_mode_.size().height() + 1851 big_mode_.size().height() +
1881 2 * DisplayConfigurator::kVerticalGap)) 1852 2 * DisplayConfigurator::kVerticalGap))
1882 .c_str(), 1853 .c_str(),
1883 kUngrab, NULL), 1854 kUngrab, nullptr),
1884 log_->GetActionsAndClear()); 1855 log_->GetActionsAndClear());
1885 1856
1886 // Verify that turning the power off works. 1857 // Verify that turning the power off works.
1887 configurator_.SetDisplayPower( 1858 configurator_.SetDisplayPower(
1888 chromeos::DISPLAY_POWER_ALL_OFF, 1859 chromeos::DISPLAY_POWER_ALL_OFF,
1889 DisplayConfigurator::kSetDisplayPowerNoFlags, 1860 DisplayConfigurator::kSetDisplayPowerNoFlags,
1890 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 1861 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
1891 base::Unretained(this))); 1862 base::Unretained(this)));
1892 1863
1893 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 1864 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
1894 EXPECT_EQ( 1865 EXPECT_EQ(
1895 JoinActions( 1866 JoinActions(
1896 kGrab, GetFramebufferAction( 1867 kGrab, GetFramebufferAction(
1897 gfx::Size(big_mode_.size().width(), kTripleHeight), 1868 gfx::Size(big_mode_.size().width(), kTripleHeight),
1898 &outputs_[0], &outputs_[1]) 1869 outputs_[0].get(), outputs_[1].get())
1899 .c_str(), 1870 .c_str(),
1900 GetCrtcAction(outputs_[0], nullptr, gfx::Point(0, 0)).c_str(), 1871 GetCrtcAction(*outputs_[0], nullptr, gfx::Point(0, 0)).c_str(),
1901 GetCrtcAction(outputs_[1], nullptr, 1872 GetCrtcAction(*outputs_[1], nullptr,
1902 gfx::Point(0, small_mode_.size().height() + 1873 gfx::Point(0, small_mode_.size().height() +
1903 DisplayConfigurator::kVerticalGap)) 1874 DisplayConfigurator::kVerticalGap))
1904 .c_str(), 1875 .c_str(),
1905 GetCrtcAction( 1876 GetCrtcAction(
1906 outputs_[2], nullptr, 1877 *outputs_[2], nullptr,
1907 gfx::Point(0, small_mode_.size().height() + 1878 gfx::Point(0, small_mode_.size().height() +
1908 big_mode_.size().height() + 1879 big_mode_.size().height() +
1909 2 * DisplayConfigurator::kVerticalGap)) 1880 2 * DisplayConfigurator::kVerticalGap))
1910 .c_str(), 1881 .c_str(),
1911 kUngrab, NULL), 1882 kUngrab, nullptr),
1912 log_->GetActionsAndClear()); 1883 log_->GetActionsAndClear());
1913 1884
1914 configurator_.SetDisplayPower( 1885 configurator_.SetDisplayPower(
1915 chromeos::DISPLAY_POWER_ALL_ON, 1886 chromeos::DISPLAY_POWER_ALL_ON,
1916 DisplayConfigurator::kSetDisplayPowerNoFlags, 1887 DisplayConfigurator::kSetDisplayPowerNoFlags,
1917 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback, 1888 base::Bind(&DisplayConfiguratorTest::OnConfiguredCallback,
1918 base::Unretained(this))); 1889 base::Unretained(this)));
1919 1890
1920 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult()); 1891 EXPECT_EQ(CALLBACK_SUCCESS, PopCallbackResult());
1921 EXPECT_EQ( 1892 EXPECT_EQ(
1922 JoinActions( 1893 JoinActions(
1923 kGrab, GetFramebufferAction( 1894 kGrab, GetFramebufferAction(
1924 gfx::Size(big_mode_.size().width(), kTripleHeight), 1895 gfx::Size(big_mode_.size().width(), kTripleHeight),
1925 &outputs_[0], &outputs_[1]) 1896 outputs_[0].get(), outputs_[1].get())
1926 .c_str(), 1897 .c_str(),
1927 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 1898 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1928 GetCrtcAction(outputs_[1], &big_mode_, 1899 GetCrtcAction(*outputs_[1], &big_mode_,
1929 gfx::Point(0, small_mode_.size().height() + 1900 gfx::Point(0, small_mode_.size().height() +
1930 DisplayConfigurator::kVerticalGap)) 1901 DisplayConfigurator::kVerticalGap))
1931 .c_str(), 1902 .c_str(),
1932 GetCrtcAction( 1903 GetCrtcAction(
1933 outputs_[2], &small_mode_, 1904 *outputs_[2], &small_mode_,
1934 gfx::Point(0, small_mode_.size().height() + 1905 gfx::Point(0, small_mode_.size().height() +
1935 big_mode_.size().height() + 1906 big_mode_.size().height() +
1936 2 * DisplayConfigurator::kVerticalGap)) 1907 2 * DisplayConfigurator::kVerticalGap))
1937 .c_str(), 1908 .c_str(),
1938 kForceDPMS, kUngrab, NULL), 1909 kForceDPMS, kUngrab, nullptr),
1939 log_->GetActionsAndClear()); 1910 log_->GetActionsAndClear());
1940 1911
1941 // Disconnect the third output. 1912 // Disconnect the third output.
1942 observer_.Reset(); 1913 observer_.Reset();
1943 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED); 1914 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED);
1944 UpdateOutputs(2, true); 1915 UpdateOutputs(2, true);
1945 EXPECT_EQ( 1916 EXPECT_EQ(
1946 JoinActions( 1917 JoinActions(
1947 kGrab, 1918 kGrab,
1948 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight), 1919 GetFramebufferAction(gfx::Size(big_mode_.size().width(), kDualHeight),
1949 &outputs_[0], &outputs_[1]) 1920 outputs_[0].get(), outputs_[1].get())
1950 .c_str(), 1921 .c_str(),
1951 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(), 1922 GetCrtcAction(*outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
1952 GetCrtcAction(outputs_[1], &big_mode_, 1923 GetCrtcAction(*outputs_[1], &big_mode_,
1953 gfx::Point(0, small_mode_.size().height() + 1924 gfx::Point(0, small_mode_.size().height() +
1954 DisplayConfigurator::kVerticalGap)) 1925 DisplayConfigurator::kVerticalGap))
1955 .c_str(), 1926 .c_str(),
1956 kUngrab, NULL), 1927 kUngrab, nullptr),
1957 log_->GetActionsAndClear()); 1928 log_->GetActionsAndClear());
1958 } 1929 }
1959 1930
1960 } // namespace test 1931 } // namespace test
1961 } // namespace ui 1932 } // namespace ui
OLDNEW
« no previous file with comments | « ui/display/chromeos/configure_displays_task_unittest.cc ('k') | ui/display/chromeos/query_content_protection_task_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698