1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "third_party/blink/renderer/modules/battery/battery_dispatcher.h"
6 
7 #include "services/device/public/mojom/battery_status.mojom-blink.h"
8 #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
9 #include "third_party/blink/public/platform/platform.h"
10 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
11 #include "third_party/blink/renderer/platform/mojo/mojo_helper.h"
12 #include "third_party/blink/renderer/platform/wtf/assertions.h"
13 
14 namespace blink {
15 
Instance()16 BatteryDispatcher& BatteryDispatcher::Instance() {
17   DEFINE_STATIC_LOCAL(Persistent<BatteryDispatcher>, battery_dispatcher,
18                       (MakeGarbageCollected<BatteryDispatcher>()));
19   return *battery_dispatcher;
20 }
21 
BatteryDispatcher()22 BatteryDispatcher::BatteryDispatcher()
23     : monitor_(nullptr), has_latest_data_(false) {}
24 
Trace(Visitor * visitor) const25 void BatteryDispatcher::Trace(Visitor* visitor) const {
26   visitor->Trace(monitor_);
27   PlatformEventDispatcher::Trace(visitor);
28 }
29 
QueryNextStatus()30 void BatteryDispatcher::QueryNextStatus() {
31   monitor_->QueryNextStatus(
32       WTF::Bind(&BatteryDispatcher::OnDidChange, WrapPersistent(this)));
33 }
34 
OnDidChange(device::mojom::blink::BatteryStatusPtr battery_status)35 void BatteryDispatcher::OnDidChange(
36     device::mojom::blink::BatteryStatusPtr battery_status) {
37   QueryNextStatus();
38 
39   DCHECK(battery_status);
40 
41   UpdateBatteryStatus(
42       BatteryStatus(battery_status->charging, battery_status->charging_time,
43                     battery_status->discharging_time, battery_status->level));
44 }
45 
UpdateBatteryStatus(const BatteryStatus & battery_status)46 void BatteryDispatcher::UpdateBatteryStatus(
47     const BatteryStatus& battery_status) {
48   battery_status_ = battery_status;
49   has_latest_data_ = true;
50   NotifyControllers();
51 }
52 
StartListening(LocalDOMWindow * window)53 void BatteryDispatcher::StartListening(LocalDOMWindow* window) {
54   DCHECK(!monitor_.is_bound());
55   // See https://bit.ly/2S0zRAS for task types.
56   Platform::Current()->GetBrowserInterfaceBroker()->GetInterface(
57       monitor_.BindNewPipeAndPassReceiver(
58           window->GetTaskRunner(TaskType::kMiscPlatformAPI)));
59   QueryNextStatus();
60 }
61 
StopListening()62 void BatteryDispatcher::StopListening() {
63   monitor_.reset();
64   has_latest_data_ = false;
65 }
66 
67 }  // namespace blink
68