Index: Source/modules/geolocation/GeolocationController.cpp |
diff --git a/Source/modules/geolocation/GeolocationController.cpp b/Source/modules/geolocation/GeolocationController.cpp |
index dd9f80e24ffe4ff027448296d12bf6a34d421d42..1956eec6345fe9529451a4a5ae5c6e66895f6776 100644 |
--- a/Source/modules/geolocation/GeolocationController.cpp |
+++ b/Source/modules/geolocation/GeolocationController.cpp |
@@ -34,8 +34,8 @@ |
namespace WebCore { |
GeolocationController::GeolocationController(Page* page, GeolocationClient* client) |
- : m_client(client) |
- , m_page(page) |
+ : PageLifecycleObserver(page) |
+ , m_client(client) |
{ |
} |
@@ -64,7 +64,7 @@ void GeolocationController::addObserver(Geolocation* observer, bool enableHighAc |
if (m_client) { |
if (enableHighAccuracy) |
m_client->setEnableHighAccuracy(true); |
- if (wasEmpty) |
+ if (wasEmpty && page()->visibilityState() == PageVisibilityStateVisible) |
m_client->startUpdating(); |
} |
} |
@@ -99,7 +99,7 @@ void GeolocationController::cancelPermissionRequest(Geolocation* geolocation) |
void GeolocationController::positionChanged(GeolocationPosition* position) |
{ |
- position = InspectorInstrumentation::overrideGeolocationPosition(m_page, position); |
+ position = InspectorInstrumentation::overrideGeolocationPosition(page(), position); |
if (!position) { |
errorOccurred(GeolocationError::create(GeolocationError::PositionUnavailable, "PositionUnavailable").get()); |
return; |
@@ -130,6 +130,17 @@ GeolocationPosition* GeolocationController::lastPosition() |
return m_client->lastPosition(); |
} |
+void GeolocationController::pageVisibilityChanged() |
+{ |
+ if (m_observers.isEmpty() || !m_client) |
+ return; |
+ |
+ if (page()->visibilityState() == PageVisibilityStateVisible) |
+ m_client->startUpdating(); |
+ else |
+ m_client->stopUpdating(); |
+} |
+ |
const char* GeolocationController::supplementName() |
{ |
return "GeolocationController"; |