diff options
Diffstat (limited to 'WebCore/page/Geolocation.cpp')
-rw-r--r-- | WebCore/page/Geolocation.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/WebCore/page/Geolocation.cpp b/WebCore/page/Geolocation.cpp index d7e0cc3..38411ce 100644 --- a/WebCore/page/Geolocation.cpp +++ b/WebCore/page/Geolocation.cpp @@ -30,6 +30,7 @@ #include "Chrome.h" #include "CurrentTime.h" #include "Document.h" +#include "EventNames.h" #include "Frame.h" #include "Page.h" #include "SQLiteDatabase.h" @@ -249,6 +250,15 @@ Geolocation::Geolocation(Frame* frame) return; ASSERT(m_frame->document()); m_frame->document()->setUsingGeolocation(true); + + if (m_frame->domWindow()) + m_frame->domWindow()->addEventListener(eventNames().unloadEvent, this, false); +} + +Geolocation::~Geolocation() +{ + if (m_frame && m_frame->domWindow()) + m_frame->domWindow()->removeEventListener(eventNames().unloadEvent, this, false); } void Geolocation::disconnectFrame() @@ -552,6 +562,16 @@ void Geolocation::geolocationServiceErrorOccurred(GeolocationService* service) handleError(service->lastError()); } +void Geolocation::handleEvent(Event* event, bool) +{ + ASSERT_UNUSED(event, event->type() == eventTypes().unloadEvent); + // Cancel any ongoing requests on page unload. This is required to release + // references to JS callbacks in the page, to allow the frame to be cleaned up + // by WebKit. + m_oneShots.clear(); + m_watchers.clear(); +} + void Geolocation::setDatabasePath(String databasePath) { CachedPositionManager::setDatabasePath(databasePath); |