summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--WebCore/page/Geolocation.cpp21
-rw-r--r--WebCore/platform/android/GeolocationServiceAndroid.cpp2
2 files changed, 14 insertions, 9 deletions
diff --git a/WebCore/page/Geolocation.cpp b/WebCore/page/Geolocation.cpp
index 8dfe19c..5fbad47 100644
--- a/WebCore/page/Geolocation.cpp
+++ b/WebCore/page/Geolocation.cpp
@@ -101,6 +101,9 @@ void Geolocation::GeoNotifier::timerFired(Timer<GeoNotifier>*)
if (m_cachedPosition) {
m_successCallback->handleEvent(m_cachedPosition.get());
+ // Clear the cached position in case this is a watch request, which
+ // will continue to run.
+ m_cachedPosition = 0;
geolocation->requestReturnedCachedPosition(this);
return;
}
@@ -403,16 +406,13 @@ void Geolocation::requestTimedOut(GeoNotifier* notifier)
void Geolocation::requestReturnedCachedPosition(GeoNotifier* notifier)
{
// If this is a one-shot request, stop it.
- if (m_oneShots.contains(notifier)) {
- m_oneShots.remove(notifier);
- if (!hasListeners())
- m_service->stopUpdating();
- return;
- }
+ m_oneShots.remove(notifier);
+ if (!hasListeners())
+ m_service->stopUpdating();
// Otherwise, if the watch still exists, start the service to get updates.
if (m_watchers.contains(notifier)) {
- if (m_service->startUpdating(notifier->m_options.get()))
+ if (notifier->hasZeroTimeout() || m_service->startUpdating(notifier->m_options.get()))
notifier->startTimerIfNeeded();
else
notifier->setFatalError(PositionError::create(PositionError::POSITION_UNAVAILABLE, "Failed to start Geolocation service"));
@@ -471,8 +471,10 @@ void Geolocation::setIsAllowed(bool allowed)
makeSuccessCallbacks();
else {
GeoNotifierSet::const_iterator end = m_requestsAwaitingCachedPosition.end();
- for (GeoNotifierSet::const_iterator iter = m_requestsAwaitingCachedPosition.begin(); iter != end; ++iter)
+ for (GeoNotifierSet::const_iterator iter = m_requestsAwaitingCachedPosition.begin(); iter != end; ++iter) {
+ ASSERT(m_cachedPositionManager->cachedPosition());
(*iter)->setCachedPosition(m_cachedPositionManager->cachedPosition());
+ }
}
m_requestsAwaitingCachedPosition.clear();
}
@@ -622,6 +624,9 @@ void Geolocation::geolocationServiceErrorOccurred(GeolocationService* service)
{
ASSERT(service->lastError());
+ // Note that we do not stop timers here. For one-shots, the request is
+ // cleared in handleError. For watchers, the spec requires that the timer is
+ // not cleared.
handleError(service->lastError());
}
diff --git a/WebCore/platform/android/GeolocationServiceAndroid.cpp b/WebCore/platform/android/GeolocationServiceAndroid.cpp
index d44b3f0..43a8f5f 100644
--- a/WebCore/platform/android/GeolocationServiceAndroid.cpp
+++ b/WebCore/platform/android/GeolocationServiceAndroid.cpp
@@ -92,7 +92,7 @@ bool GeolocationServiceAndroid::startUpdating(PositionOptions* options)
void GeolocationServiceAndroid::stopUpdating()
{
// Called when the Geolocation object has no watches or one shots in
- // progress.
+ // progress. This may be called repeatedly.
m_javaBridge.clear();
// Reset last position and error to make sure that we always try to get a
// new position from the system service when a request is first made.