Coverage Report

Created: 2018-09-25 14:53

/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