From 95e7487cbe7ec5c780e8af61f3cea2d90bb4459b Mon Sep 17 00:00:00 2001 From: Steve Block Date: Thu, 3 Dec 2009 12:52:03 +0000 Subject: Fixes a Geolocation bug with cached positions. When a Geolocation watch calls back with a cached position, it could be cleared in the callback. This change makes sure the watch still exists after the callback before starting the Geolocation service. Change-Id: I9a5736f5ce78e1c4bb36659245ffb61b485c4018 --- WebCore/page/Geolocation.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'WebCore/page/Geolocation.cpp') diff --git a/WebCore/page/Geolocation.cpp b/WebCore/page/Geolocation.cpp index 978a1b0..604802f 100644 --- a/WebCore/page/Geolocation.cpp +++ b/WebCore/page/Geolocation.cpp @@ -136,6 +136,11 @@ void Geolocation::Watchers::remove(GeoNotifier* notifier) m_notifierToIdMap.remove(iter); } +bool Geolocation::Watchers::contains(GeoNotifier* notifier) const +{ + return m_notifierToIdMap.contains(notifier); +} + void Geolocation::Watchers::clear() { m_idToNotifierMap.clear(); @@ -403,11 +408,13 @@ void Geolocation::requestReturnedCachedPosition(GeoNotifier* notifier) return; } - // Otherwise, start the service to get updates. - if (m_service->startUpdating(notifier->m_options.get())) - notifier->startTimerIfNeeded(); - else - notifier->setFatalError(PositionError::create(PositionError::UNKNOWN_ERROR, "Failed to start Geolocation service")); + // 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())) + notifier->startTimerIfNeeded(); + else + notifier->setFatalError(PositionError::create(PositionError::UNKNOWN_ERROR, "Failed to start Geolocation service")); + } } bool Geolocation::haveSuitableCachedPosition(PositionOptions* options) -- cgit v1.1