diff options
-rw-r--r-- | chrome/browser/browser_list.cc | 39 | ||||
-rw-r--r-- | chrome/browser/browser_list.h | 21 | ||||
-rw-r--r-- | chrome/browser/views/frame/aero_glass_frame.h | 3 | ||||
-rw-r--r-- | chrome/browser/views/frame/opaque_frame.h | 1 | ||||
-rw-r--r-- | chrome/common/notification_types.h | 5 | ||||
-rw-r--r-- | chrome/views/window.cc | 25 | ||||
-rw-r--r-- | chrome/views/window.h | 14 |
7 files changed, 47 insertions, 61 deletions
diff --git a/chrome/browser/browser_list.cc b/chrome/browser/browser_list.cc index 69fb122..90ccb56 100644 --- a/chrome/browser/browser_list.cc +++ b/chrome/browser/browser_list.cc @@ -14,11 +14,9 @@ #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) { @@ -60,27 +58,12 @@ 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()) - 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(); -} + if (browsers_.empty()) { + NotificationService::current()->Notify(NOTIFY_ALL_APPWINDOWS_CLOSED, + NotificationService::AllSources(), + NotificationService::NoDetails()); + } -// 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(); } @@ -242,18 +225,6 @@ 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); diff --git a/chrome/browser/browser_list.h b/chrome/browser/browser_list.h index cda32a9..72262a9 100644 --- a/chrome/browser/browser_list.h +++ b/chrome/browser/browser_list.h @@ -10,12 +10,6 @@ #include "chrome/browser/browser.h" -namespace views { -class AppModalDialogDelegate; -class Window; -}; -class WebContents; - // Stores a list of all Browser objects. class BrowserList { public: @@ -41,13 +35,6 @@ class BrowserList { static void AddBrowser(Browser* browser); static void RemoveBrowser(Browser* browser); - // Adds and removes non-browser dependent windows. These are windows that are - // top level, but whose lifetime is associated wtih the existence of at least - // one active Browser. When the last Browser is destroyed, all open dependent - // windows are closed. - static void AddDependentWindow(views::Window* window); - static void RemoveDependentWindow(views::Window* window); - static void AddObserver(Observer* observer); static void RemoveObserver(Observer* observer); @@ -113,20 +100,12 @@ class BrowserList { static bool IsOffTheRecordSessionActive(); private: - // Closes all registered dependent windows. - static void CloseAllDependentWindows(); - // Helper method to remove a browser instance from a list of browsers static void RemoveBrowserFrom(Browser* browser, list_type* browser_list); static list_type browsers_; static std::vector<Observer*> observers_; static list_type last_active_browsers_; - typedef std::vector<views::Window*> DependentWindowList; - static DependentWindowList dependent_windows_; - - // Set to the currently showing modal dialog delegate if any, NULL otherwise. - static views::AppModalDialogDelegate* app_modal_dialog_; }; class WebContents; diff --git a/chrome/browser/views/frame/aero_glass_frame.h b/chrome/browser/views/frame/aero_glass_frame.h index 7daa04a..4ff6288 100644 --- a/chrome/browser/views/frame/aero_glass_frame.h +++ b/chrome/browser/views/frame/aero_glass_frame.h @@ -53,8 +53,9 @@ class AeroGlassFrame : public BrowserFrame, virtual LRESULT OnNCCalcSize(BOOL mode, LPARAM l_param); virtual LRESULT OnNCHitTest(const CPoint& pt); - // Overridden from views::CustomFrameWindow: + // Overridden from views::Window: virtual int GetShowState() const; + virtual bool IsAppWindow() const { return true; } private: // Updates the DWM with the frame bounds. diff --git a/chrome/browser/views/frame/opaque_frame.h b/chrome/browser/views/frame/opaque_frame.h index 13c20d2..e5d2f552 100644 --- a/chrome/browser/views/frame/opaque_frame.h +++ b/chrome/browser/views/frame/opaque_frame.h @@ -43,6 +43,7 @@ class OpaqueFrame : public BrowserFrame, // Overridden from views::CustomFrameWindow: virtual void UpdateWindowIcon(); virtual int GetShowState() const; + virtual bool IsAppWindow() const { return true; } // Overridden from views::WidgetWin: virtual bool AcceleratorPressed(views::Accelerator* accelerator); diff --git a/chrome/common/notification_types.h b/chrome/common/notification_types.h index c2a0c09..e6e2e2e 100644 --- a/chrome/common/notification_types.h +++ b/chrome/common/notification_types.h @@ -155,6 +155,11 @@ enum NotificationType { // only valid for the duration of this call. NOTIFY_BROWSER_CLOSED, + // This message is sent when the last window considered to be an "application + // window" has been closed. Dependent/dialog/utility windows can use this as + // a way to know that they should also close. No source or details are passed. + NOTIFY_ALL_APPWINDOWS_CLOSED, + // Indicates that a top window has been closed. The source is the HWND that // was closed, no details are expected. NOTIFY_WINDOW_CLOSED, diff --git a/chrome/views/window.cc b/chrome/views/window.cc index c09ffd0..1a3ad56 100644 --- a/chrome/views/window.cc +++ b/chrome/views/window.cc @@ -6,8 +6,6 @@ #include "base/win_util.h" #include "chrome/app/chrome_dll_resource.h" -// TODO(beng): some day make this unfortunate dependency not exist. -#include "chrome/browser/browser_list.h" #include "chrome/common/gfx/chrome_font.h" #include "chrome/common/gfx/icon_util.h" #include "chrome/common/l10n_util.h" @@ -36,7 +34,10 @@ static const int kMonitorEdgePadding = 10; // Window, public: Window::~Window() { - BrowserList::RemoveDependentWindow(this); + if (!IsAppWindow()) { + NotificationService::current()->RemoveObserver( + this, NOTIFY_ALL_APPWINDOWS_CLOSED, NotificationService::AllSources()); + } } // static @@ -227,6 +228,19 @@ gfx::Size Window::GetLocalizedContentsSize(int col_resource_id, GetLocalizedContentsHeight(row_resource_id)); } +//////////////////////////////////////////////////////////////////////////////// +// Window, NotificationObserver implementation: + +void Window::Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + // This window is closed when the last app window is closed. + DCHECK(type == NOTIFY_ALL_APPWINDOWS_CLOSED); + // Only registered as an observer when we're not an app window. + DCHECK(!IsAppWindow()); + Close(); +} + /////////////////////////////////////////////////////////////////////////////// // Window, protected: @@ -251,7 +265,10 @@ Window::Window(WindowDelegate* window_delegate) // behavior before calling Init. set_window_style(0); set_window_ex_style(0); - BrowserList::AddDependentWindow(this); + if (!IsAppWindow()) { + NotificationService::current()->AddObserver( + this, NOTIFY_ALL_APPWINDOWS_CLOSED, NotificationService::AllSources()); + } } void Window::Init(HWND parent, const gfx::Rect& bounds) { diff --git a/chrome/views/window.h b/chrome/views/window.h index bdd3d6d..c1c097f 100644 --- a/chrome/views/window.h +++ b/chrome/views/window.h @@ -5,6 +5,7 @@ #ifndef CHROME_VIEWS_WINDOW_H__ #define CHROME_VIEWS_WINDOW_H__ +#include "chrome/common/notification_service.h" #include "chrome/views/widget_win.h" namespace gfx { @@ -30,7 +31,8 @@ class WindowDelegate; // rendered by the operating system. // /////////////////////////////////////////////////////////////////////////////// -class Window : public WidgetWin { +class Window : public WidgetWin, + public NotificationObserver { public: virtual ~Window(); @@ -121,6 +123,11 @@ class Window : public WidgetWin { static gfx::Size GetLocalizedContentsSize(int col_resource_id, int row_resource_id); + // NotificationObserver overrides: + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); + protected: // Constructs the Window. |window_delegate| cannot be NULL. explicit Window(WindowDelegate* window_delegate); @@ -143,6 +150,11 @@ class Window : public WidgetWin { // Sizes the window to the default size specified by its ClientView. virtual void SizeWindowToDefault(); + // Returns true if the Window is considered to be an "app window" - i.e. any + // window which when it is the last of its type closed causes the application + // to exit. + virtual bool IsAppWindow() const { return false; } + void set_client_view(ClientView* client_view) { client_view_ = client_view; } // Shows the system menu at the specified screen point. |