summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-06 04:36:17 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-06 04:36:17 +0000
commit5b3065b13476000a1940aeabfec125c736d687da (patch)
tree277151e3397df2fabbbedfd915daf92f92e683c8 /ash
parentce464bf730dc151f843740626acc659cf19b54d4 (diff)
downloadchromium_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.cc14
-rw-r--r--ash/display/display_manager_unittest.cc23
-rw-r--r--ash/root_window_controller.cc1
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;