Index: extensions/shell/browser/shell_desktop_controller.cc |
diff --git a/extensions/shell/browser/shell_desktop_controller.cc b/extensions/shell/browser/shell_desktop_controller.cc |
index 59e84a57a016d71402c789ac5c00c47474ce1240..1ec98c81c94a2f50bd7d04af473662d71ca947e5 100644 |
--- a/extensions/shell/browser/shell_desktop_controller.cc |
+++ b/extensions/shell/browser/shell_desktop_controller.cc |
@@ -4,6 +4,7 @@ |
#include "extensions/shell/browser/shell_desktop_controller.h" |
+#include <algorithm> |
#include <string> |
#include <vector> |
@@ -160,7 +161,7 @@ class AppsFocusRules : public wm::BaseFocusRules { |
} // namespace |
ShellDesktopController::ShellDesktopController() |
- : app_window_client_(new ShellAppWindowClient), app_window_(NULL) { |
+ : app_window_client_(new ShellAppWindowClient) { |
extensions::AppWindowClient::Set(app_window_client_.get()); |
#if defined(OS_CHROMEOS) |
@@ -191,8 +192,9 @@ aura::WindowTreeHost* ShellDesktopController::GetHost() { |
AppWindow* ShellDesktopController::CreateAppWindow( |
content::BrowserContext* context, |
const Extension* extension) { |
- app_window_ = new AppWindow(context, new ShellAppDelegate, extension); |
- return app_window_; |
+ app_windows_.push_back( |
+ new AppWindow(context, new ShellAppDelegate, extension)); |
+ return app_windows_.back(); |
} |
void ShellDesktopController::AddAppWindow(aura::Window* window) { |
@@ -200,11 +202,20 @@ void ShellDesktopController::AddAppWindow(aura::Window* window) { |
root_window->AddChild(window); |
} |
+void ShellDesktopController::RemoveAppWindow(AppWindow* window) { |
+ auto iter = std::find(app_windows_.begin(), app_windows_.end(), window); |
+ DCHECK(iter != app_windows_.end()); |
+ app_windows_.erase(iter); |
+} |
+ |
void ShellDesktopController::CloseAppWindows() { |
- if (app_window_) { |
- app_window_->GetBaseWindow()->Close(); // Close() deletes |app_window_|. |
- app_window_ = NULL; |
- } |
+ // Create a copy of the window vector, because closing the windows will |
+ // trigger RemoveAppWindow, which will invalidate the iterator. |
+ // This vector should be small enough that this should not be an issue. |
+ std::vector<AppWindow*> app_windows(app_windows_); |
+ for (AppWindow* app_window : app_windows) |
+ app_window->GetBaseWindow()->Close(); // Close() deletes |app_window|. |
+ app_windows_.clear(); |
} |
aura::Window* ShellDesktopController::GetDefaultParent( |