Index: content/browser/power_monitor_message_broadcaster.cc |
diff --git a/content/browser/power_monitor_message_broadcaster.cc b/content/browser/power_monitor_message_broadcaster.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..519445be58b08e6188f7a77f54eb414b64b6372f |
--- /dev/null |
+++ b/content/browser/power_monitor_message_broadcaster.cc |
@@ -0,0 +1,87 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/browser/power_monitor_message_broadcaster.h" |
+ |
+#include "base/power_monitor/power_monitor.h" |
+#include "content/common/power_monitor_messages.h" |
+#include "ipc/ipc_sender.h" |
+ |
+namespace content { |
+ |
+PowerMonitorMessageFilter::PowerMonitorMessageFilter() { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind( |
+ &PowerMonitorMessageFilter::CreateBroadcaster, |
+ base::Unretained(this))); |
piman
2013/07/29 21:18:18
What prevents the filter from being destroyed befo
|
+} |
+ |
+PowerMonitorMessageFilter::~PowerMonitorMessageFilter() { |
+} |
+ |
+void PowerMonitorMessageFilter::OnChannelClosing() { |
+ BrowserMessageFilter::OnChannelClosing(); |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind( |
+ &PowerMonitorMessageFilter::DisableBroadcaster, |
+ base::Unretained(this))); |
piman
2013/07/29 21:18:18
What prevents the filter from being destroyed befo
bajones
2013/07/29 21:33:36
I'll switch this and the prior post task over to p
piman
2013/07/29 21:40:50
That won't work.
WeakPtrs are only safe if the ins
|
+} |
+ |
+bool PowerMonitorMessageFilter::OnMessageReceived( |
+ const IPC::Message& message, |
+ bool* message_was_ok) { |
+ return false; // No messages to handle |
+} |
+ |
+void PowerMonitorMessageFilter::CreateBroadcaster() { |
+ broadcaster_ = new PowerMonitorMessageBroadcaster(this); |
+} |
+ |
+void PowerMonitorMessageFilter::DisableBroadcaster() { |
+ broadcaster_->RemoveSender(); |
+} |
+ |
+PowerMonitorMessageBroadcaster::PowerMonitorMessageBroadcaster( |
+ IPC::Sender* sender) |
+ : sender_(sender) { |
+ base::PowerMonitor* power_monitor = base::PowerMonitor::Get(); |
+ if (power_monitor) |
+ power_monitor->AddObserver(this); |
+} |
+ |
+PowerMonitorMessageBroadcaster::~PowerMonitorMessageBroadcaster() { |
+ base::PowerMonitor* power_monitor = base::PowerMonitor::Get(); |
+ if (power_monitor) |
+ power_monitor->RemoveObserver(this); |
piman
2013/07/29 21:18:18
Because this class is refcounted, it may be destro
bajones
2013/07/29 21:33:36
Please see the class declaration. The RefCountedTh
|
+} |
+ |
+void PowerMonitorMessageBroadcaster::RemoveSender() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ sender_ = NULL; |
+} |
+ |
+void PowerMonitorMessageBroadcaster::OnPowerStateChange(bool on_battery_power) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (sender_) |
+ sender_->Send(new PowerMonitorMsg_PowerStateChange(on_battery_power)); |
piman
2013/07/29 21:18:18
This is unsafe: sender_ is the message filter, whi
bajones
2013/07/29 21:33:36
I just realized that by allowing the constructor t
|
+} |
+ |
+void PowerMonitorMessageBroadcaster::OnSuspend() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (sender_) |
+ sender_->Send(new PowerMonitorMsg_Suspend()); |
+} |
+ |
+void PowerMonitorMessageBroadcaster::OnResume() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (sender_) |
+ sender_->Send(new PowerMonitorMsg_Resume()); |
+} |
+ |
+} // namespace content |