/src/mozilla-central/dom/power/PowerManagerService.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim: set ts=8 sts=2 et sw=2 tw=80: */ |
3 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
4 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
5 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | | |
7 | | #include "mozilla/dom/ContentParent.h" |
8 | | #include "mozilla/Hal.h" |
9 | | #include "mozilla/HalWakeLock.h" |
10 | | #include "mozilla/ClearOnShutdown.h" |
11 | | #include "mozilla/Preferences.h" |
12 | | #include "mozilla/Services.h" |
13 | | #include "nsIDOMWakeLockListener.h" |
14 | | #include "nsIDOMWindow.h" |
15 | | #include "nsIObserverService.h" |
16 | | #include "PowerManagerService.h" |
17 | | #include "WakeLock.h" |
18 | | |
19 | | // For _exit(). |
20 | | #ifdef XP_WIN |
21 | | #include <process.h> |
22 | | #else |
23 | | #include <unistd.h> |
24 | | #endif |
25 | | |
26 | | namespace mozilla { |
27 | | namespace dom { |
28 | | namespace power { |
29 | | |
30 | | using namespace hal; |
31 | | |
32 | | NS_IMPL_ISUPPORTS(PowerManagerService, nsIPowerManagerService) |
33 | | |
34 | | /* static */ StaticRefPtr<PowerManagerService> PowerManagerService::sSingleton; |
35 | | |
36 | | /* static */ already_AddRefed<PowerManagerService> |
37 | | PowerManagerService::GetInstance() |
38 | 0 | { |
39 | 0 | if (!sSingleton) { |
40 | 0 | sSingleton = new PowerManagerService(); |
41 | 0 | sSingleton->Init(); |
42 | 0 | ClearOnShutdown(&sSingleton); |
43 | 0 | } |
44 | 0 |
|
45 | 0 | RefPtr<PowerManagerService> service = sSingleton.get(); |
46 | 0 | return service.forget(); |
47 | 0 | } |
48 | | |
49 | | void |
50 | | PowerManagerService::Init() |
51 | 0 | { |
52 | 0 | RegisterWakeLockObserver(this); |
53 | 0 | } |
54 | | |
55 | | PowerManagerService::~PowerManagerService() |
56 | 0 | { |
57 | 0 | UnregisterWakeLockObserver(this); |
58 | 0 | } |
59 | | |
60 | | void |
61 | | PowerManagerService::ComputeWakeLockState(const WakeLockInformation& aWakeLockInfo, |
62 | | nsAString &aState) |
63 | | { |
64 | | WakeLockState state = hal::ComputeWakeLockState(aWakeLockInfo.numLocks(), |
65 | | aWakeLockInfo.numHidden()); |
66 | | switch (state) { |
67 | | case WAKE_LOCK_STATE_UNLOCKED: |
68 | | aState.AssignLiteral("unlocked"); |
69 | | break; |
70 | | case WAKE_LOCK_STATE_HIDDEN: |
71 | | aState.AssignLiteral("locked-background"); |
72 | | break; |
73 | | case WAKE_LOCK_STATE_VISIBLE: |
74 | | aState.AssignLiteral("locked-foreground"); |
75 | | break; |
76 | | } |
77 | | } |
78 | | |
79 | | void |
80 | | PowerManagerService::Notify(const WakeLockInformation& aWakeLockInfo) |
81 | 0 | { |
82 | 0 | nsAutoString state; |
83 | 0 | ComputeWakeLockState(aWakeLockInfo, state); |
84 | 0 |
|
85 | 0 | /** |
86 | 0 | * Copy the listeners list before we walk through the callbacks |
87 | 0 | * because the callbacks may install new listeners. We expect no |
88 | 0 | * more than one listener per window, so it shouldn't be too long. |
89 | 0 | */ |
90 | 0 | AutoTArray<nsCOMPtr<nsIDOMMozWakeLockListener>, 2> listeners(mWakeLockListeners); |
91 | 0 |
|
92 | 0 | for (uint32_t i = 0; i < listeners.Length(); ++i) { |
93 | 0 | listeners[i]->Callback(aWakeLockInfo.topic(), state); |
94 | 0 | } |
95 | 0 | } |
96 | | |
97 | | NS_IMETHODIMP |
98 | | PowerManagerService::AddWakeLockListener(nsIDOMMozWakeLockListener *aListener) |
99 | 0 | { |
100 | 0 | if (mWakeLockListeners.Contains(aListener)) |
101 | 0 | return NS_OK; |
102 | 0 | |
103 | 0 | mWakeLockListeners.AppendElement(aListener); |
104 | 0 | return NS_OK; |
105 | 0 | } |
106 | | |
107 | | NS_IMETHODIMP |
108 | | PowerManagerService::RemoveWakeLockListener(nsIDOMMozWakeLockListener *aListener) |
109 | 0 | { |
110 | 0 | mWakeLockListeners.RemoveElement(aListener); |
111 | 0 | return NS_OK; |
112 | 0 | } |
113 | | |
114 | | NS_IMETHODIMP |
115 | | PowerManagerService::GetWakeLockState(const nsAString &aTopic, nsAString &aState) |
116 | 0 | { |
117 | 0 | WakeLockInformation info; |
118 | 0 | GetWakeLockInfo(aTopic, &info); |
119 | 0 |
|
120 | 0 | ComputeWakeLockState(info, aState); |
121 | 0 |
|
122 | 0 | return NS_OK; |
123 | 0 | } |
124 | | |
125 | | already_AddRefed<WakeLock> |
126 | | PowerManagerService::NewWakeLock(const nsAString& aTopic, |
127 | | nsPIDOMWindowInner* aWindow, |
128 | | mozilla::ErrorResult& aRv) |
129 | 0 | { |
130 | 0 | RefPtr<WakeLock> wakelock = new WakeLock(); |
131 | 0 | aRv = wakelock->Init(aTopic, aWindow); |
132 | 0 | if (aRv.Failed()) { |
133 | 0 | return nullptr; |
134 | 0 | } |
135 | 0 | |
136 | 0 | return wakelock.forget(); |
137 | 0 | } |
138 | | |
139 | | NS_IMETHODIMP |
140 | | PowerManagerService::NewWakeLock(const nsAString &aTopic, |
141 | | mozIDOMWindow *aWindow, |
142 | | nsISupports **aWakeLock) |
143 | 0 | { |
144 | 0 | mozilla::ErrorResult rv; |
145 | 0 | RefPtr<WakeLock> wakelock = |
146 | 0 | NewWakeLock(aTopic, nsPIDOMWindowInner::From(aWindow), rv); |
147 | 0 | if (rv.Failed()) { |
148 | 0 | return rv.StealNSResult(); |
149 | 0 | } |
150 | 0 | |
151 | 0 | nsCOMPtr<nsIDOMEventListener> eventListener = wakelock.get(); |
152 | 0 | eventListener.forget(aWakeLock); |
153 | 0 | return NS_OK; |
154 | 0 | } |
155 | | |
156 | | already_AddRefed<WakeLock> |
157 | | PowerManagerService::NewWakeLockOnBehalfOfProcess(const nsAString& aTopic, |
158 | | ContentParent* aContentParent) |
159 | 0 | { |
160 | 0 | RefPtr<WakeLock> wakelock = new WakeLock(); |
161 | 0 | nsresult rv = wakelock->Init(aTopic, aContentParent); |
162 | 0 | NS_ENSURE_SUCCESS(rv, nullptr); |
163 | 0 | return wakelock.forget(); |
164 | 0 | } |
165 | | |
166 | | } // namespace power |
167 | | } // namespace dom |
168 | | } // namespace mozilla |