Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Unified Diff: ui/gfx/win/singleton_hwnd.h

Issue 1092183005: Fix Up SingletonHwnd Observer Lifetime Issues (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/gfx/win/singleton_hwnd.h
diff --git a/ui/gfx/win/singleton_hwnd.h b/ui/gfx/win/singleton_hwnd.h
index 5dbfe90d2171b7964c90c5cc947759961ef4313a..1e10af118223b57c82c8e5d70128b2fc08c17cc0 100644
--- a/ui/gfx/win/singleton_hwnd.h
+++ b/ui/gfx/win/singleton_hwnd.h
@@ -9,6 +9,7 @@
#include <vector>
#include "base/basictypes.h"
+#include "base/callback.h"
#include "base/callback_forward.h"
#include "base/observer_list.h"
#include "ui/gfx/win/window_impl.h"
@@ -21,20 +22,31 @@ namespace gfx {
// notifications.
class GFX_EXPORT SingletonHwnd : public WindowImpl {
public:
- static SingletonHwnd* GetInstance();
-
- // Observer interface for receiving Windows WM_* notifications.
- class Observer {
+ // Singleton lifetime management is tricky. This observer handles the correct
+ // cleanup if either the SingletonHwnd or forwarded object is destroyed first.
+ // To use this class, make sure this object is bound to your object's lifetime
+ // and use SetWndProc to set your WndProc.
+ class GFX_EXPORT Observer {
sky 2015/04/24 20:58:23 Put this into its own header. (From the style guid
robliao 2015/04/24 21:49:03 Done.
public:
- virtual void OnWndProc(HWND hwnd,
- UINT message,
- WPARAM wparam,
- LPARAM lparam) = 0;
+ typedef base::Callback<void(HWND, UINT, WPARAM, LPARAM)> WndProc;
+
+ Observer();
+ ~Observer();
+
+ void SetWndProc(const WndProc& wndProc);
sky 2015/04/24 20:58:23 wnd_proc
robliao 2015/04/24 21:49:03 Done.
+ void ClearWndProc();
+
+ private:
+ friend class SingletonHwnd;
+
+ void OnWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
+
+ WndProc wndProc_;
sky 2015/04/24 20:58:23 wm_proc_.
robliao 2015/04/24 21:49:03 Done.
+
+ DISALLOW_COPY_AND_ASSIGN(Observer);
};
- // Add/remove observer to receive WM_* notifications.
- void AddObserver(Observer* observer);
- void RemoveObserver(Observer* observer);
+ static SingletonHwnd* GetInstance();
// Windows callback for WM_* notifications.
BOOL ProcessWindowMessage(HWND window,
@@ -50,6 +62,10 @@ class GFX_EXPORT SingletonHwnd : public WindowImpl {
SingletonHwnd();
~SingletonHwnd() override;
+ // Add/remove Observer to forward WM_* notifications.
+ void AddObserver(Observer* observer);
+ void RemoveObserver(Observer* observer);
+
// List of registered observers.
ObserverList<Observer> observer_list_;

Powered by Google App Engine
This is Rietveld 408576698