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()16BatteryDispatcher& BatteryDispatcher::Instance() { 17 DEFINE_STATIC_LOCAL(Persistent<BatteryDispatcher>, battery_dispatcher, 18 (MakeGarbageCollected<BatteryDispatcher>())); 19 return *battery_dispatcher; 20 } 21 BatteryDispatcher()22BatteryDispatcher::BatteryDispatcher() 23 : monitor_(nullptr), has_latest_data_(false) {} 24 Trace(Visitor * visitor) const25void BatteryDispatcher::Trace(Visitor* visitor) const { 26 visitor->Trace(monitor_); 27 PlatformEventDispatcher::Trace(visitor); 28 } 29 QueryNextStatus()30void BatteryDispatcher::QueryNextStatus() { 31 monitor_->QueryNextStatus( 32 WTF::Bind(&BatteryDispatcher::OnDidChange, WrapPersistent(this))); 33 } 34 OnDidChange(device::mojom::blink::BatteryStatusPtr battery_status)35void 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)46void BatteryDispatcher::UpdateBatteryStatus( 47 const BatteryStatus& battery_status) { 48 battery_status_ = battery_status; 49 has_latest_data_ = true; 50 NotifyControllers(); 51 } 52 StartListening(LocalDOMWindow * window)53void 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()62void BatteryDispatcher::StopListening() { 63 monitor_.reset(); 64 has_latest_data_ = false; 65 } 66 67 } // namespace blink 68