Index: ash/common/wm/overview/window_grid.cc |
diff --git a/ash/common/wm/overview/window_grid.cc b/ash/common/wm/overview/window_grid.cc |
index 1220a07e124833dcb3041c32b080544da377c272..0458a0d045b47ef1a266e77e0d808e65533a667f 100644 |
--- a/ash/common/wm/overview/window_grid.cc |
+++ b/ash/common/wm/overview/window_grid.cc |
@@ -392,8 +392,10 @@ WindowGrid::WindowGrid(WmWindow* root_window, |
WindowSelector* window_selector) |
: root_window_(root_window), |
window_selector_(window_selector), |
+ window_observer_(this), |
selected_index_(0), |
- num_columns_(0) { |
+ num_columns_(0), |
+ prepared_for_overview_(false) { |
std::vector<WmWindow*> windows_in_root; |
for (auto* window : windows) { |
if (window->GetRootWindow() == root_window) |
@@ -409,16 +411,12 @@ WindowGrid::WindowGrid(WmWindow* root_window, |
window_selector_->text_filter_bottom()); |
} |
for (auto* window : windows_in_root) { |
- window->AddObserver(this); |
- observed_windows_.insert(window); |
+ window_observer_.Add(window); |
window_list_.push_back(new WindowSelectorItem(window, window_selector_)); |
} |
} |
-WindowGrid::~WindowGrid() { |
- for (WmWindow* window : observed_windows_) |
- window->RemoveObserver(this); |
-} |
+WindowGrid::~WindowGrid() {} |
void WindowGrid::Shutdown() { |
if (shield_widget_) { |
@@ -453,6 +451,7 @@ void WindowGrid::PrepareForOverview() { |
InitShieldWidget(); |
for (auto iter = window_list_.begin(); iter != window_list_.end(); ++iter) |
(*iter)->PrepareForOverview(); |
+ prepared_for_overview_ = true; |
} |
void WindowGrid::PositionWindowsMD(bool animate) { |
@@ -787,8 +786,7 @@ void WindowGrid::WindowClosing(WindowSelectorItem* window) { |
} |
void WindowGrid::OnWindowDestroying(WmWindow* window) { |
- window->RemoveObserver(this); |
- observed_windows_.erase(window); |
+ window_observer_.Remove(window); |
ScopedVector<WindowSelectorItem>::iterator iter = |
std::find_if(window_list_.begin(), window_list_.end(), |
WindowSelectorItemComparator(window)); |
@@ -821,6 +819,12 @@ void WindowGrid::OnWindowDestroying(WmWindow* window) { |
void WindowGrid::OnWindowBoundsChanged(WmWindow* window, |
const gfx::Rect& old_bounds, |
const gfx::Rect& new_bounds) { |
+ // During preparation, window bounds can change (e.g. by unminimizing a |
+ // window). Ignore bounds change notifications in this case; we'll reposition |
+ // soon. |
+ if (!prepared_for_overview_) |
+ return; |
+ |
auto iter = std::find_if(window_list_.begin(), window_list_.end(), |
WindowSelectorItemComparator(window)); |
DCHECK(iter != window_list_.end()); |