Index: remoting/host/it2me_host_user_interface.cc |
diff --git a/remoting/host/it2me_host_user_interface.cc b/remoting/host/it2me_host_user_interface.cc |
index c39f6d366d748c848fc9ca029d9d63df7edf4616..1b2f392598d9abdc5e1a7639821f2c6fb19e5285 100644 |
--- a/remoting/host/it2me_host_user_interface.cc |
+++ b/remoting/host/it2me_host_user_interface.cc |
@@ -24,29 +24,15 @@ static const int kContinueWindowHideTimeoutMs = 60 * 1000; |
namespace remoting { |
-class It2MeHostUserInterface::TimerTask { |
- public: |
- TimerTask(base::MessageLoopProxy* message_loop, |
- const base::Closure& task, |
- int delay_ms) |
- : thread_proxy_(message_loop) { |
- thread_proxy_.PostDelayedTask(FROM_HERE, task, delay_ms); |
- } |
- |
- private: |
- ScopedThreadProxy thread_proxy_; |
-}; |
- |
- |
It2MeHostUserInterface::It2MeHostUserInterface(ChromotingHostContext* context) |
- : HostUserInterface(context) { |
+ : HostUserInterface(context), |
+ ALLOW_THIS_IN_INITIALIZER_LIST(timer_weak_factory_(this)) { |
} |
It2MeHostUserInterface::~It2MeHostUserInterface() { |
DCHECK(ui_message_loop()->BelongsToCurrentThread()); |
ShowContinueWindow(false); |
- StartContinueWindowTimer(false); |
} |
void It2MeHostUserInterface::Start(ChromotingHost* host, |
@@ -103,7 +89,6 @@ void It2MeHostUserInterface::ContinueSession(bool continue_session) { |
if (continue_session) { |
get_host()->PauseSession(false); |
- timer_task_.reset(); |
StartContinueWindowTimer(true); |
} else { |
DisconnectSession(); |
@@ -116,11 +101,13 @@ void It2MeHostUserInterface::OnContinueWindowTimer() { |
get_host()->PauseSession(true); |
ShowContinueWindow(true); |
- timer_task_.reset(new TimerTask( |
- ui_message_loop(), |
+ // Cancel any pending timer and post one to hide the continue window. |
+ timer_weak_factory_.InvalidateWeakPtrs(); |
+ ui_message_loop()->PostDelayedTask( |
+ FROM_HERE, |
base::Bind(&It2MeHostUserInterface::OnShutdownHostTimer, |
- base::Unretained(this)), |
- kContinueWindowHideTimeoutMs)); |
+ timer_weak_factory_.GetWeakPtr()), |
+ kContinueWindowHideTimeoutMs); |
} |
void It2MeHostUserInterface::OnShutdownHostTimer() { |
@@ -144,14 +131,14 @@ void It2MeHostUserInterface::ShowContinueWindow(bool show) { |
void It2MeHostUserInterface::StartContinueWindowTimer(bool start) { |
DCHECK(ui_message_loop()->BelongsToCurrentThread()); |
+ // Abandon previous timer events by invalidating their weak pointer to us. |
+ timer_weak_factory_.InvalidateWeakPtrs(); |
if (start) { |
- timer_task_.reset(new TimerTask( |
- ui_message_loop(), |
+ ui_message_loop()->PostDelayedTask( |
+ FROM_HERE, |
base::Bind(&It2MeHostUserInterface::OnContinueWindowTimer, |
- base::Unretained(this)), |
- kContinueWindowShowTimeoutMs)); |
- } else { |
- timer_task_.reset(); |
+ timer_weak_factory_.GetWeakPtr()), |
+ kContinueWindowShowTimeoutMs); |
} |
} |