Chromium Code Reviews| 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 |