Bug 1278716 - Remove wakelocks from geo. r=jdm

MozReview-Commit-ID: 2Uu1W34r3g8

--HG--
extra : rebase_source : 3fe68bb861ce60da3b6b42819c90df02c58a8e70
This commit is contained in:
Michelangelo De Simone 2016-10-04 15:12:16 -07:00
parent fcec1aca37
commit 01caec7221
2 changed files with 8 additions and 112 deletions

View File

@ -18,20 +18,15 @@
#include "nsContentUtils.h"
#include "nsContentPermissionHelper.h"
#include "nsIDocument.h"
#include "nsIDOMEvent.h"
#include "nsIObserverService.h"
#include "nsPIDOMWindow.h"
#include "nsThreadUtils.h"
#include "mozilla/HalWakeLock.h"
#include "mozilla/Hal.h"
#include "mozilla/Services.h"
#include "mozilla/Unused.h"
#include "mozilla/Preferences.h"
#include "mozilla/ClearOnShutdown.h"
#include "mozilla/dom/Event.h"
#include "mozilla/WeakPtr.h"
#include "mozilla/dom/PermissionMessageUtils.h"
#include "mozilla/dom/WakeLock.h"
class nsIPrincipal;
@ -63,7 +58,6 @@ class nsIPrincipal;
using mozilla::Unused; // <snicker>
using namespace mozilla;
using namespace mozilla::dom;
using namespace mozilla::hal;
class nsGeolocationRequest final
: public nsIContentPermissionRequest
@ -487,10 +481,6 @@ nsGeolocationRequest::Allow(JS::HandleValue aChoices)
return NS_OK;
}
if (mLocator->ContainsRequest(this)) {
return NS_OK;
}
if (mIsWatchPositionRequest || !canUseCache) {
// let the locator know we're pending
// we will now be owned by the locator
@ -833,9 +823,9 @@ nsGeolocationService::StartDevice(nsIPrincipal *aPrincipal)
return NS_ERROR_NOT_AVAILABLE;
}
// we do not want to keep the geolocation devices online
// indefinitely. Close them down after a reasonable period of
// inactivivity
// We do not want to keep the geolocation devices online
// indefinitely.
// Close them down after a reasonable period of inactivivity.
SetDisconnectTimer();
if (XRE_IsContentProcess()) {
@ -871,15 +861,6 @@ nsGeolocationService::StartDevice(nsIPrincipal *aPrincipal)
return NS_OK;
}
void
nsGeolocationService::StopDisconnectTimer()
{
if (mDisconnectTimer) {
mDisconnectTimer->Cancel();
mDisconnectTimer = nullptr;
}
}
void
nsGeolocationService::SetDisconnectTimer()
{
@ -927,7 +908,10 @@ nsGeolocationService::UpdateAccuracy(bool aForceHigh)
void
nsGeolocationService::StopDevice()
{
StopDisconnectTimer();
if (mDisconnectTimer) {
mDisconnectTimer->Cancel();
mDisconnectTimer = nullptr;
}
if (XRE_IsContentProcess()) {
ContentChild* cpc = ContentChild::GetSingleton();
@ -1037,14 +1021,6 @@ Geolocation::Init(nsPIDOMWindowInner* aContentDom)
mPrincipal = doc->NodePrincipal();
if (Preferences::GetBool("dom.wakelock.enabled") &&
XRE_IsContentProcess()) {
doc->AddSystemEventListener(NS_LITERAL_STRING("visibilitychange"),
/* listener */ this,
/* use capture */ true,
/* wants untrusted */ false);
}
nsCOMPtr<nsIURI> uri;
nsresult rv = mPrincipal->GetURI(getter_AddRefs(uri));
NS_ENSURE_SUCCESS(rv, rv);
@ -1078,66 +1054,6 @@ Geolocation::Init(nsPIDOMWindowInner* aContentDom)
return NS_OK;
}
bool
Geolocation::ContainsRequest(nsGeolocationRequest* aRequest)
{
if (aRequest->IsWatch() && mWatchingCallbacks.Contains(aRequest)) {
return true;
}
if (mPendingCallbacks.Contains(aRequest)) {
return true;
}
return false;
}
NS_IMETHODIMP
Geolocation::HandleEvent(nsIDOMEvent* aEvent)
{
nsAutoString type;
aEvent->GetType(type);
if (!type.EqualsLiteral("visibilitychange")) {
return NS_OK;
}
nsCOMPtr<nsIDocument> doc = do_QueryInterface(aEvent->InternalDOMEvent()->GetTarget());
MOZ_ASSERT(doc);
if (doc->Hidden()) {
WakeLockInformation info;
GetWakeLockInfo(NS_LITERAL_STRING("gps"), &info);
MOZ_ASSERT(XRE_IsContentProcess());
ContentChild* cpc = ContentChild::GetSingleton();
if (!info.lockingProcesses().Contains(cpc->GetID())) {
cpc->SendRemoveGeolocationListener();
mService->StopDisconnectTimer();
}
return NS_OK;
}
mService->SetDisconnectTimer();
// We will unconditionally allow all the requests in the callbacks
// because if a request is put into either of these two callbacks,
// it means that it has been allowed before.
// That's why when we resume them, we unconditionally allow them again.
for (uint32_t i = 0, length = mWatchingCallbacks.Length(); i < length; ++i) {
mWatchingCallbacks[i]->Allow(JS::UndefinedHandleValue);
}
for (uint32_t i = 0, length = mPendingCallbacks.Length(); i < length; ++i) {
mPendingCallbacks[i]->Allow(JS::UndefinedHandleValue);
}
return NS_OK;
}
void
Geolocation::Shutdown()
{
@ -1145,18 +1061,6 @@ Geolocation::Shutdown()
mPendingCallbacks.Clear();
mWatchingCallbacks.Clear();
if (Preferences::GetBool("dom.wakelock.enabled") &&
XRE_IsContentProcess()) {
if (nsCOMPtr<nsPIDOMWindowInner> window = do_QueryReferent(mOwner)) {
nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
if (doc) {
doc->RemoveSystemEventListener(NS_LITERAL_STRING("visibilitychange"),
this,
/* aUseCapture = */ true);
}
}
}
if (mService) {
mService->RemoveLocator(this);
mService->UpdateAccuracy();

View File

@ -21,7 +21,6 @@
#include "nsCycleCollectionParticipant.h"
#include "nsGeoPosition.h"
#include "nsIDOMEventListener.h"
#include "nsIDOMGeoGeolocation.h"
#include "nsIDOMGeoPosition.h"
#include "nsIDOMGeoPositionError.h"
@ -87,7 +86,6 @@ public:
// create, or reinitalize the callback timer
void SetDisconnectTimer();
void StopDisconnectTimer();
// Update the accuracy and notify the provider if changed
void UpdateAccuracy(bool aForceHigh = false);
@ -125,8 +123,7 @@ namespace dom {
*/
class Geolocation final : public nsIDOMGeoGeolocation,
public nsIGeolocationUpdate,
public nsWrapperCache,
public nsIDOMEventListener
public nsWrapperCache
{
public:
@ -136,8 +133,6 @@ public:
NS_DECL_NSIGEOLOCATIONUPDATE
NS_DECL_NSIDOMGEOGEOLOCATION
NS_DECL_NSIDOMEVENTLISTENER
Geolocation();
nsresult Init(nsPIDOMWindowInner* aContentDom = nullptr);
@ -154,9 +149,6 @@ public:
// Register an allowed request
void NotifyAllowedRequest(nsGeolocationRequest* aRequest);
// Check if callbacks arrays already contain this request
bool ContainsRequest(nsGeolocationRequest* aRequest);
// Remove request from all callbacks arrays
void RemoveRequest(nsGeolocationRequest* request);