Commit 01fadba9 authored by oshima's avatar oshima Committed by Commit bot

Remove the removed display from the active list after displays are added.

This is necessary because the unified display is needed to
move the windows to new, normal display.

Fix DisplayManagerTestApi::UpdateDisplays so that unified display isn't used for extended mode.

BUG=487368
TEST=covered by test.

Review URL: https://codereview.chromium.org/1130653004

Cr-Commit-Position: refs/heads/master@{#329675}
parent 59cb6968
...@@ -794,21 +794,19 @@ void DisplayManager::UpdateDisplays( ...@@ -794,21 +794,19 @@ void DisplayManager::UpdateDisplays(
RefreshFontParams(); RefreshFontParams();
base::AutoReset<bool> resetter(&change_display_upon_host_resize_, false); base::AutoReset<bool> resetter(&change_display_upon_host_resize_, false);
int active_display_list_size = active_display_list_.size();
// Temporarily add displays to be removed because display object // Temporarily add displays to be removed because display object
// being removed are accessed during shutting down the root. // being removed are accessed during shutting down the root.
active_display_list_.insert(active_display_list_.end(), active_display_list_.insert(active_display_list_.end(),
removed_displays.begin(), removed_displays.end()); removed_displays.begin(), removed_displays.end());
for (DisplayList::const_reverse_iterator iter = removed_displays.rbegin(); for (const auto& display : removed_displays)
iter != removed_displays.rend(); ++iter) { screen_->NotifyDisplayRemoved(display);
screen_->NotifyDisplayRemoved(active_display_list_.back());
active_display_list_.pop_back();
}
for (std::vector<size_t>::iterator iter = added_display_indices.begin(); for (size_t index : added_display_indices)
iter != added_display_indices.end(); ++iter) { screen_->NotifyDisplayAdded(active_display_list_[index]);
screen_->NotifyDisplayAdded(active_display_list_[*iter]);
} active_display_list_.resize(active_display_list_size);
bool notify_primary_change = bool notify_primary_change =
delegate_ ? old_primary.id() != screen_->GetPrimaryDisplay().id() : false; delegate_ ? old_primary.id() != screen_->GetPrimaryDisplay().id() : false;
......
...@@ -15,10 +15,12 @@ ...@@ -15,10 +15,12 @@
#include "ash/test/ash_test_base.h" #include "ash/test/ash_test_base.h"
#include "ash/test/display_manager_test_api.h" #include "ash/test/display_manager_test_api.h"
#include "ash/test/mirror_window_test_api.h" #include "ash/test/mirror_window_test_api.h"
#include "ash/wm/window_state.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "base/format_macros.h" #include "base/format_macros.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/env.h" #include "ui/aura/env.h"
#include "ui/aura/window_observer.h" #include "ui/aura/window_observer.h"
#include "ui/aura/window_tree_host.h" #include "ui/aura/window_tree_host.h"
...@@ -1512,6 +1514,27 @@ TEST_F(DisplayManagerTest, RotateUnifiedDesktop) { ...@@ -1512,6 +1514,27 @@ TEST_F(DisplayManagerTest, RotateUnifiedDesktop) {
EXPECT_EQ("300x200", screen->GetPrimaryDisplay().size().ToString()); EXPECT_EQ("300x200", screen->GetPrimaryDisplay().size().ToString());
} }
// Makes sure the transition from unified to single won't crash
// with docked wnidows.
TEST_F(DisplayManagerTest, UnifiedWithDockWindows) {
if (!SupportsMultipleDisplays())
return;
display_manager()->SetDefaultMultiDisplayMode(DisplayManager::UNIFIED);
display_manager()->SetMultiDisplayMode(DisplayManager::UNIFIED);
UpdateDisplay("300x200,400x500");
scoped_ptr<aura::Window> docked(
CreateTestWindowInShellWithBounds(gfx::Rect(10, 10, 50, 50)));
docked->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_DOCKED);
ASSERT_TRUE(wm::GetWindowState(docked.get())->IsDocked());
EXPECT_EQ("0,0 250x453", docked->bounds().ToString());
UpdateDisplay("300x200");
// Make sure the window is still docked.
EXPECT_TRUE(wm::GetWindowState(docked.get())->IsDocked());
EXPECT_EQ("0,0 250x250", docked->bounds().ToString());
}
class ScreenShutdownTest : public test::AshTestBase { class ScreenShutdownTest : public test::AshTestBase {
public: public:
ScreenShutdownTest() { ScreenShutdownTest() {
......
...@@ -34,11 +34,16 @@ std::vector<DisplayInfo> CreateDisplayInfoListFromString( ...@@ -34,11 +34,16 @@ std::vector<DisplayInfo> CreateDisplayInfoListFromString(
std::vector<std::string> parts; std::vector<std::string> parts;
base::SplitString(specs, ',', &parts); base::SplitString(specs, ',', &parts);
size_t index = 0; size_t index = 0;
DisplayManager::DisplayList list =
display_manager->IsInUnifiedMode()
? display_manager->software_mirroring_display_list()
: display_manager->active_display_list();
for (std::vector<std::string>::const_iterator iter = parts.begin(); for (std::vector<std::string>::const_iterator iter = parts.begin();
iter != parts.end(); ++iter, ++index) { iter != parts.end(); ++iter, ++index) {
int64 id = index < display_manager->GetNumDisplays() ? int64 id = (index < list.size()) ? list[index].id()
display_manager->GetDisplayAt(index).id() : : gfx::Display::kInvalidDisplayID;
gfx::Display::kInvalidDisplayID;
display_info_list.push_back( display_info_list.push_back(
DisplayInfo::CreateFromSpecWithID(*iter, id)); DisplayInfo::CreateFromSpecWithID(*iter, id));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment