summaryrefslogtreecommitdiffstats
path: root/chrome/browser/browser_list.cc
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-01-17 00:01:57 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-01-17 00:01:57 +0000
commitf92a69826846102dfe32ac44bc36df79f803beb6 (patch)
tree35995131920888be482b8eea6cbce3d96803e15b /chrome/browser/browser_list.cc
parentcb1cdf49dfef2a86f5616be04f07381ec00ce1b9 (diff)
downloadchromium_src-f92a69826846102dfe32ac44bc36df79f803beb6.zip
chromium_src-f92a69826846102dfe32ac44bc36df79f803beb6.tar.gz
chromium_src-f92a69826846102dfe32ac44bc36df79f803beb6.tar.bz2
revert r8217 until memory tests are fixed.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@8245 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/browser_list.cc')
-rw-r--r--chrome/browser/browser_list.cc39
1 files changed, 34 insertions, 5 deletions
diff --git a/chrome/browser/browser_list.cc b/chrome/browser/browser_list.cc
index 90ccb56..69fb122 100644
--- a/chrome/browser/browser_list.cc
+++ b/chrome/browser/browser_list.cc
@@ -14,9 +14,11 @@
#include "chrome/browser/profile_manager.h"
#include "chrome/browser/tab_contents/web_contents.h"
#include "chrome/common/notification_service.h"
+#include "chrome/views/window.h"
BrowserList::list_type BrowserList::browsers_;
std::vector<BrowserList::Observer*> BrowserList::observers_;
+BrowserList::DependentWindowList BrowserList::dependent_windows_;
// static
void BrowserList::AddBrowser(Browser* browser) {
@@ -58,12 +60,27 @@ void BrowserList::RemoveBrowser(Browser* browser) {
// If the last Browser object was destroyed, make sure we try to close any
// remaining dependent windows too.
- if (browsers_.empty()) {
- NotificationService::current()->Notify(NOTIFY_ALL_APPWINDOWS_CLOSED,
- NotificationService::AllSources(),
- NotificationService::NoDetails());
- }
+ if (browsers_.empty())
+ CloseAllDependentWindows();
+
+ g_browser_process->ReleaseModule();
+}
+
+// static
+void BrowserList::AddDependentWindow(views::Window* window) {
+ DependentWindowList::const_iterator existing =
+ find(dependent_windows_.begin(), dependent_windows_.end(), window);
+ DCHECK(existing == dependent_windows_.end());
+ dependent_windows_.push_back(window);
+ g_browser_process->AddRefModule();
+}
+// static
+void BrowserList::RemoveDependentWindow(views::Window* window) {
+ DependentWindowList::iterator existing =
+ find(dependent_windows_.begin(), dependent_windows_.end(), window);
+ DCHECK(existing != dependent_windows_.end());
+ dependent_windows_.erase(existing);
g_browser_process->ReleaseModule();
}
@@ -225,6 +242,18 @@ bool BrowserList::IsOffTheRecordSessionActive() {
}
// static
+void BrowserList::CloseAllDependentWindows() {
+ // Note that |dependent_windows_| is guaranteed to be consistent for the
+ // duration of this operation because windows are not actually closed
+ // (destroyed, then deleted, and thus removed from this list) until we return
+ // to the message loop. So this basically just schedules a bunch of close
+ // operations to be performed asynchronously.
+ DependentWindowList::iterator window = dependent_windows_.begin();
+ for (; window != dependent_windows_.end(); ++window)
+ (*window)->Close();
+}
+
+// static
void BrowserList::RemoveBrowserFrom(Browser* browser, list_type* browser_list) {
const iterator remove_browser =
find(browser_list->begin(), browser_list->end(), browser);