Files
tubestation/dom/geolocation/MLSFallback.cpp
Chris Peterson 9e8b7c555f Bug 645325 - Part 2: Remove the two-second startup delay for the MLS fallback provider on Windows and macOS. r=garvank r=jdm
The Windows and macOS location providers used to start the MLS provider (with a two-second delay) and then call the operating system's location provider, letting them race. Currently, however, we only start the MLS fallback provider after the system provider returns an error, so the two-second startup delay is just wasted time.

I left the starup delay option in MLSFallback because the Linux gpsd provider still uses it to race MLS with the system's GPS provider.

MozReview-Commit-ID: 3ZFeF1g6PoG
2018-02-28 23:59:03 -08:00

93 lines
2.0 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "MLSFallback.h"
#include "nsGeoPosition.h"
#include "nsIGeolocationProvider.h"
#include "nsServiceManagerUtils.h"
NS_IMPL_ISUPPORTS(MLSFallback, nsITimerCallback, nsINamed)
MLSFallback::MLSFallback(uint32_t delay)
: mDelayMs(delay)
{
}
MLSFallback::~MLSFallback()
{
}
nsresult
MLSFallback::Startup(nsIGeolocationUpdate* aWatcher)
{
if (mHandoffTimer || mMLSFallbackProvider) {
return NS_OK;
}
mUpdateWatcher = aWatcher;
// No need to schedule a timer callback if there is no startup delay.
if (mDelayMs == 0) {
return CreateMLSFallbackProvider();
}
return NS_NewTimerWithCallback(getter_AddRefs(mHandoffTimer),
this, mDelayMs, nsITimer::TYPE_ONE_SHOT);
}
nsresult
MLSFallback::Shutdown()
{
mUpdateWatcher = nullptr;
if (mHandoffTimer) {
mHandoffTimer->Cancel();
mHandoffTimer = nullptr;
}
nsresult rv = NS_OK;
if (mMLSFallbackProvider) {
rv = mMLSFallbackProvider->Shutdown();
mMLSFallbackProvider = nullptr;
}
return rv;
}
NS_IMETHODIMP
MLSFallback::Notify(nsITimer* aTimer)
{
return CreateMLSFallbackProvider();
}
NS_IMETHODIMP
MLSFallback::GetName(nsACString& aName)
{
aName.AssignLiteral("MLSFallback");
return NS_OK;
}
nsresult
MLSFallback::CreateMLSFallbackProvider()
{
if (mMLSFallbackProvider || !mUpdateWatcher) {
return NS_OK;
}
nsresult rv;
mMLSFallbackProvider = do_CreateInstance("@mozilla.org/geolocation/mls-provider;1", &rv);
NS_ENSURE_SUCCESS(rv, rv);
if (mMLSFallbackProvider) {
rv = mMLSFallbackProvider->Startup();
if (NS_SUCCEEDED(rv)) {
mMLSFallbackProvider->Watch(mUpdateWatcher);
}
}
mUpdateWatcher = nullptr;
return rv;
}