diff options
author | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-17 00:01:57 +0000 |
---|---|---|
committer | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-17 00:01:57 +0000 |
commit | f92a69826846102dfe32ac44bc36df79f803beb6 (patch) | |
tree | 35995131920888be482b8eea6cbce3d96803e15b /chrome/browser/browser_list.cc | |
parent | cb1cdf49dfef2a86f5616be04f07381ec00ce1b9 (diff) | |
download | chromium_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.cc | 39 |
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); |