| Index: content/browser/battery_status/battery_status_message_filter.cc
 | 
| diff --git a/content/browser/battery_status/battery_status_message_filter.cc b/content/browser/battery_status/battery_status_message_filter.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..97c909115a725685e3164889949a29deec971a40
 | 
| --- /dev/null
 | 
| +++ b/content/browser/battery_status/battery_status_message_filter.cc
 | 
| @@ -0,0 +1,94 @@
 | 
| +// Copyright (c) 2012 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/battery_status/battery_status_message_filter.h"
 | 
| +
 | 
| +#include "base/bind.h"
 | 
| +#include "base/bind_helpers.h"
 | 
| +#include "content/browser/battery_status/battery_status_provider_impl.h"
 | 
| +#include "content/common/battery_status_messages.h"
 | 
| +#include "content/public/browser/power_supply_status.h"
 | 
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebBatteryStatus.h"
 | 
| +
 | 
| +namespace content {
 | 
| +
 | 
| +class BatteryStatusMessageFilter::PowerManagerObserver :
 | 
| +    public BatteryStatusProviderImpl::Observer {
 | 
| + public:
 | 
| +  explicit PowerManagerObserver(BatteryStatusMessageFilter* filter)
 | 
| +      : filter_(filter) {
 | 
| +    BatteryStatusProviderImpl::GetInstance()->AddObserver(this);
 | 
| +  }
 | 
| +
 | 
| +  virtual ~PowerManagerObserver() {
 | 
| +    BatteryStatusProviderImpl::GetInstance()->RemoveObserver(this);
 | 
| +  }
 | 
| +
 | 
| +  void DestroyOnUI() {
 | 
| +    filter_ = NULL;
 | 
| +    BrowserThread::DeleteOnUIThread::Destruct(this);
 | 
| +  }
 | 
| +
 | 
| + private:
 | 
| +  virtual void PowerChanged(
 | 
| +      const PowerSupplyStatus& power_status) OVERRIDE {
 | 
| +    if (filter_)
 | 
| +      filter_->SendUpdates(power_status);
 | 
| +  }
 | 
| +
 | 
| +  BatteryStatusMessageFilter* filter_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(PowerManagerObserver);
 | 
| +};
 | 
| +
 | 
| +BatteryStatusMessageFilter::BatteryStatusMessageFilter() {
 | 
| +}
 | 
| +
 | 
| +void BatteryStatusMessageFilter::SendUpdates(
 | 
| +    const PowerSupplyStatus& power_status) {
 | 
| +  WebKit::WebBatteryStatus web_status;
 | 
| +  web_status.charging = power_status.line_power_on;
 | 
| +  web_status.chargingTime = power_status.battery_seconds_to_full;
 | 
| +  web_status.dischargingTime = power_status.battery_seconds_to_empty;
 | 
| +  web_status.level = power_status.battery_percentage / 100.;
 | 
| +
 | 
| +  Send(new BatteryStatusMsg_Updated(web_status));
 | 
| +}
 | 
| +
 | 
| +BatteryStatusMessageFilter::~BatteryStatusMessageFilter() {
 | 
| +  if (observer_.get()) {
 | 
| +    // This destructor is in the IO thread. But we need to destroy the observer
 | 
| +    // in the UI thread.
 | 
| +    observer_.release()->DestroyOnUI();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +void BatteryStatusMessageFilter::OnStartUpdating() {
 | 
| +  if (!observer_.get())
 | 
| +    observer_.reset(new PowerManagerObserver(this));
 | 
| +}
 | 
| +
 | 
| +void BatteryStatusMessageFilter::OnStopUpdating() {
 | 
| +  observer_.reset();
 | 
| +}
 | 
| +
 | 
| +void BatteryStatusMessageFilter::OverrideThreadForMessage(
 | 
| +    const IPC::Message& message,
 | 
| +    BrowserThread::ID* thread) {
 | 
| +  if (IPC_MESSAGE_CLASS(message) == BatteryStatusMsgStart)
 | 
| +    *thread = BrowserThread::UI;
 | 
| +}
 | 
| +
 | 
| +bool BatteryStatusMessageFilter::OnMessageReceived(const IPC::Message& message,
 | 
| +                                                   bool* message_was_ok) {
 | 
| +  bool handled = true;
 | 
| +  IPC_BEGIN_MESSAGE_MAP_EX(BatteryStatusMessageFilter, message, *message_was_ok)
 | 
| +    IPC_MESSAGE_HANDLER(BatteryStatusHostMsg_StartUpdating, OnStartUpdating)
 | 
| +    IPC_MESSAGE_HANDLER(BatteryStatusHostMsg_StopUpdating, OnStopUpdating)
 | 
| +    IPC_MESSAGE_UNHANDLED(handled = false)
 | 
| +  IPC_END_MESSAGE_MAP_EX()
 | 
| +  return handled;
 | 
| +}
 | 
| +
 | 
| +}  // namespace content
 | 
| 
 |