Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / modules / battery / BatteryManager.cpp
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 "config.h"
6 #include "modules/battery/BatteryManager.h"
7
8 #include "core/dom/Document.h"
9 #include "core/events/Event.h"
10 #include "modules/battery/BatteryDispatcher.h"
11 #include "modules/battery/BatteryStatus.h"
12 #include "platform/RuntimeEnabledFeatures.h"
13
14 namespace blink {
15
16 PassRefPtrWillBeRawPtr<BatteryManager> BatteryManager::create(ExecutionContext* context)
17 {
18     RefPtrWillBeRawPtr<BatteryManager> batteryManager(adoptRefWillBeRefCountedGarbageCollected(new BatteryManager(context)));
19     batteryManager->suspendIfNeeded();
20     return batteryManager.release();
21 }
22
23 BatteryManager::~BatteryManager()
24 {
25     stopUpdating();
26 }
27
28 BatteryManager::BatteryManager(ExecutionContext* context)
29     : ActiveDOMObject(context)
30     , PlatformEventController(toDocument(context)->page())
31     , m_batteryStatus(BatteryStatus::create())
32     , m_state(NotStarted)
33 {
34     ScriptWrappable::init(this);
35 }
36
37 ScriptPromise BatteryManager::startRequest(ScriptState* scriptState)
38 {
39     if (m_state == Pending)
40         return m_resolver->promise();
41
42     m_resolver = ScriptPromiseResolver::create(scriptState);
43     ScriptPromise promise = m_resolver->promise();
44
45     if (m_state == Resolved) {
46         // FIXME: Consider returning the same promise in this case. See crbug.com/385025.
47         m_resolver->resolve(this);
48     } else if (m_state == NotStarted) {
49         m_state = Pending;
50         m_hasEventListener = true;
51         startUpdating();
52     }
53
54     return promise;
55 }
56
57 bool BatteryManager::charging()
58 {
59     return m_batteryStatus->charging();
60 }
61
62 double BatteryManager::chargingTime()
63 {
64     return m_batteryStatus->chargingTime();
65 }
66
67 double BatteryManager::dischargingTime()
68 {
69     return m_batteryStatus->dischargingTime();
70 }
71
72 double BatteryManager::level()
73 {
74     return m_batteryStatus->level();
75 }
76
77 void BatteryManager::didUpdateData()
78 {
79     ASSERT(RuntimeEnabledFeatures::batteryStatusEnabled());
80     ASSERT(m_state != NotStarted);
81
82     RefPtrWillBeRawPtr<BatteryStatus> oldStatus = m_batteryStatus;
83     m_batteryStatus = BatteryDispatcher::instance().latestData();
84
85 #if !ENABLE(OILPAN)
86     // BatteryDispatcher also holds a reference to m_batteryStatus.
87     ASSERT(m_batteryStatus->refCount() > 1);
88 #endif
89
90     if (m_state == Pending) {
91         ASSERT(m_resolver);
92         m_state = Resolved;
93         m_resolver->resolve(this);
94         return;
95     }
96
97     Document* document = toDocument(executionContext());
98     if (document->activeDOMObjectsAreSuspended() || document->activeDOMObjectsAreStopped())
99         return;
100
101     ASSERT(oldStatus);
102
103     if (m_batteryStatus->charging() != oldStatus->charging())
104         dispatchEvent(Event::create(EventTypeNames::chargingchange));
105     if (m_batteryStatus->chargingTime() != oldStatus->chargingTime())
106         dispatchEvent(Event::create(EventTypeNames::chargingtimechange));
107     if (m_batteryStatus->dischargingTime() != oldStatus->dischargingTime())
108         dispatchEvent(Event::create(EventTypeNames::dischargingtimechange));
109     if (m_batteryStatus->level() != oldStatus->level())
110         dispatchEvent(Event::create(EventTypeNames::levelchange));
111 }
112
113 void BatteryManager::registerWithDispatcher()
114 {
115     BatteryDispatcher::instance().addController(this);
116 }
117
118 void BatteryManager::unregisterWithDispatcher()
119 {
120     BatteryDispatcher::instance().removeController(this);
121 }
122
123 bool BatteryManager::hasLastData()
124 {
125     return BatteryDispatcher::instance().latestData();
126 }
127
128 void BatteryManager::suspend()
129 {
130     m_hasEventListener = false;
131     stopUpdating();
132 }
133
134 void BatteryManager::resume()
135 {
136     m_hasEventListener = true;
137     startUpdating();
138 }
139
140 void BatteryManager::stop()
141 {
142     m_hasEventListener = false;
143     m_state = NotStarted;
144     stopUpdating();
145 }
146
147 bool BatteryManager::hasPendingActivity() const
148 {
149     // Prevent V8 from garbage collecting the wrapper object if there are
150     // event listeners attached to it.
151     return m_state == Resolved && hasEventListeners();
152 }
153
154 void BatteryManager::trace(Visitor* visitor)
155 {
156     visitor->trace(m_batteryStatus);
157     EventTargetWithInlineData::trace(visitor);
158 }
159
160 } // namespace blink