98091ee107da8c198f2dc41ff00f041f29111f8f
[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 BatteryManager* BatteryManager::create(ExecutionContext* context)
17 {
18     BatteryManager* batteryManager = new BatteryManager(context);
19     batteryManager->suspendIfNeeded();
20     return batteryManager;
21 }
22
23 BatteryManager::~BatteryManager()
24 {
25 #if !ENABLE(OILPAN)
26     stopUpdating();
27 #endif
28 }
29
30 BatteryManager::BatteryManager(ExecutionContext* context)
31     : ActiveDOMObject(context)
32     , PlatformEventController(toDocument(context)->page())
33     , m_batteryStatus(BatteryStatus::create())
34     , m_state(NotStarted)
35 {
36 }
37
38 ScriptPromise BatteryManager::startRequest(ScriptState* scriptState)
39 {
40     if (m_state == Pending)
41         return m_resolver->promise();
42
43     m_resolver = ScriptPromiseResolver::create(scriptState);
44     ScriptPromise promise = m_resolver->promise();
45
46     ASSERT(executionContext());
47     // If the context is in a stopped state already, do not start updating.
48     if (m_state == Resolved || executionContext()->activeDOMObjectsAreStopped()) {
49         // FIXME: Consider returning the same promise in this case. See crbug.com/385025.
50         m_state = Resolved;
51         m_resolver->resolve(this);
52     } else if (m_state == NotStarted) {
53         m_state = Pending;
54         m_hasEventListener = true;
55         startUpdating();
56     }
57
58     return promise;
59 }
60
61 bool BatteryManager::charging()
62 {
63     return m_batteryStatus->charging();
64 }
65
66 double BatteryManager::chargingTime()
67 {
68     return m_batteryStatus->chargingTime();
69 }
70
71 double BatteryManager::dischargingTime()
72 {
73     return m_batteryStatus->dischargingTime();
74 }
75
76 double BatteryManager::level()
77 {
78     return m_batteryStatus->level();
79 }
80
81 void BatteryManager::didUpdateData()
82 {
83     ASSERT(RuntimeEnabledFeatures::batteryStatusEnabled());
84     ASSERT(m_state != NotStarted);
85
86     BatteryStatus* oldStatus = m_batteryStatus;
87     m_batteryStatus = BatteryDispatcher::instance().latestData();
88
89     if (m_state == Pending) {
90         ASSERT(m_resolver);
91         m_state = Resolved;
92         m_resolver->resolve(this);
93         return;
94     }
95
96     Document* document = toDocument(executionContext());
97     ASSERT(document);
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     PlatformEventController::trace(visitor);
158     EventTargetWithInlineData::trace(visitor);
159 }
160
161 } // namespace blink