diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-06 04:36:17 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-06 04:36:17 +0000 |
commit | 5b3065b13476000a1940aeabfec125c736d687da (patch) | |
tree | 277151e3397df2fabbbedfd915daf92f92e683c8 /ash | |
parent | ce464bf730dc151f843740626acc659cf19b54d4 (diff) | |
download | chromium_src-5b3065b13476000a1940aeabfec125c736d687da.zip chromium_src-5b3065b13476000a1940aeabfec125c736d687da.tar.gz chromium_src-5b3065b13476000a1940aeabfec125c736d687da.tar.bz2 |
Remove the displays first before adding.
DisplayManager used to add display first, which could make the # of displasys exceed 2 during the configuration.
BUG=163624
TEST=covered by test case.
Review URL: https://chromiumcodereview.appspot.com/11412334
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@171402 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r-- | ash/display/display_manager.cc | 14 | ||||
-rw-r--r-- | ash/display/display_manager_unittest.cc | 23 | ||||
-rw-r--r-- | ash/root_window_controller.cc | 1 |
3 files changed, 27 insertions, 11 deletions
diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc index 88e9ed2..e14d39a 100644 --- a/ash/display/display_manager.cc +++ b/ash/display/display_manager.cc @@ -296,18 +296,18 @@ void DisplayManager::UpdateDisplays( // being removed are accessed during shutting down the root. displays_.insert(displays_.end(), removed_displays.begin(), removed_displays.end()); - for (std::vector<size_t>::iterator iter = changed_display_indices.begin(); - iter != changed_display_indices.end(); ++iter) { - Shell::GetInstance()->screen()->NotifyBoundsChanged(displays_[*iter]); + for (DisplayList::const_reverse_iterator iter = removed_displays.rbegin(); + iter != removed_displays.rend(); ++iter) { + Shell::GetInstance()->screen()->NotifyDisplayRemoved(displays_.back()); + displays_.pop_back(); } for (std::vector<size_t>::iterator iter = added_display_indices.begin(); iter != added_display_indices.end(); ++iter) { Shell::GetInstance()->screen()->NotifyDisplayAdded(displays_[*iter]); } - for (DisplayList::const_reverse_iterator iter = removed_displays.rbegin(); - iter != removed_displays.rend(); ++iter) { - Shell::GetInstance()->screen()->NotifyDisplayRemoved(displays_.back()); - displays_.pop_back(); + for (std::vector<size_t>::iterator iter = changed_display_indices.begin(); + iter != changed_display_indices.end(); ++iter) { + Shell::GetInstance()->screen()->NotifyBoundsChanged(displays_[*iter]); } EnsurePointerInDisplays(); diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc index 287d83d..ddd20cf 100644 --- a/ash/display/display_manager_unittest.cc +++ b/ash/display/display_manager_unittest.cc @@ -316,6 +316,7 @@ TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) { display_manager()->SetFirstDisplayAsInternalDisplayForTest(); const gfx::Display native_display(internal_display_id, gfx::Rect(0, 0, 500, 500)); + const gfx::Display external_display(10, gfx::Rect(1, 1, 100, 100)); EXPECT_EQ(1U, display_manager()->GetNumDisplays()); std::string default_bounds = @@ -329,7 +330,7 @@ TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) { display_manager()->GetDisplayAt(0)->bounds().ToString()); // External connected while primary was disconnected. - displays.push_back(gfx::Display(10, gfx::Rect(1, 1, 100, 100))); + displays.push_back(external_display); display_manager()->OnNativeDisplaysChanged(displays); EXPECT_EQ(2U, display_manager()->GetNumDisplays()); EXPECT_EQ(default_bounds, @@ -340,7 +341,7 @@ TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) { // Primary connected, with different bounds. displays.clear(); displays.push_back(native_display); - displays.push_back(gfx::Display(10, gfx::Rect(1, 1, 100, 100))); + displays.push_back(external_display); display_manager()->OnNativeDisplaysChanged(displays); EXPECT_EQ(2U, display_manager()->GetNumDisplays()); EXPECT_EQ("0,0 500x500", @@ -350,7 +351,7 @@ TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) { // Turn off primary. displays.clear(); - displays.push_back(gfx::Display(10, gfx::Rect(1, 1, 100, 100))); + displays.push_back(external_display); display_manager()->OnNativeDisplaysChanged(displays); EXPECT_EQ(2U, display_manager()->GetNumDisplays()); EXPECT_EQ("0,0 500x500", @@ -373,6 +374,22 @@ TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) { EXPECT_EQ(1U, display_manager()->GetNumDisplays()); EXPECT_EQ("0,0 500x500", FindDisplayForId(internal_display_id).bounds().ToString()); + + // External display was changed during suspend. + displays.push_back(external_display); + display_manager()->OnNativeDisplaysChanged(displays); + EXPECT_EQ(2U, display_manager()->GetNumDisplays()); + + // suspend... + displays.clear(); + display_manager()->OnNativeDisplaysChanged(displays); + EXPECT_EQ(2U, display_manager()->GetNumDisplays()); + + // and resume with different external display. + displays.push_back(native_display); + displays.push_back(gfx::Display(11, gfx::Rect(1, 1, 100, 100))); + display_manager()->OnNativeDisplaysChanged(displays); + EXPECT_EQ(2U, display_manager()->GetNumDisplays()); } TEST_F(DisplayManagerTest, EnsurePointerInDisplays) { diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc index 14b2006..8ccdd12 100644 --- a/ash/root_window_controller.cc +++ b/ash/root_window_controller.cc @@ -406,7 +406,6 @@ void RootWindowController::CloseChildWindows() { aura::Window* child = root_window_->children()[0]; delete child; } - launcher_.reset(); // All containers are deleted, so reset shelf_. shelf_ = NULL; |