diff options
author | Steve Block <steveblock@google.com> | 2009-10-06 10:57:53 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2009-10-06 10:57:53 +0100 |
commit | 0c7394a4459ba850766d303b4307add7189cf5f3 (patch) | |
tree | e7c0cd92fb4bc31a6ed2bd91448aa3630bdfc8c3 /WebCore/page | |
parent | 2097884b9e1630c3855a8580f84a308163e085e7 (diff) | |
download | external_webkit-0c7394a4459ba850766d303b4307add7189cf5f3.zip external_webkit-0c7394a4459ba850766d303b4307add7189cf5f3.tar.gz external_webkit-0c7394a4459ba850766d303b4307add7189cf5f3.tar.bz2 |
Fixes a WebKit bug where ongoing Geolocation requests are not stopped when the page is unloaded.
This fixes bug http://b/issue?id=2164673
Change-Id: I68a615c0b82bcee2a4a61dc0433a4f9321780ad1
Diffstat (limited to 'WebCore/page')
-rw-r--r-- | WebCore/page/Geolocation.cpp | 20 | ||||
-rw-r--r-- | WebCore/page/Geolocation.h | 8 |
2 files changed, 26 insertions, 2 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); diff --git a/WebCore/page/Geolocation.h b/WebCore/page/Geolocation.h index c97c3e6..9b3b43f 100644 --- a/WebCore/page/Geolocation.h +++ b/WebCore/page/Geolocation.h @@ -26,6 +26,7 @@ #ifndef Geolocation_h #define Geolocation_h +#include "EventListener.h" #include "GeolocationService.h" #include "Geoposition.h" #include "PositionCallback.h" @@ -48,11 +49,11 @@ class Frame; class CachedPositionManager; -class Geolocation : public RefCounted<Geolocation>, public GeolocationServiceClient { +class Geolocation : public GeolocationServiceClient, public EventListener { public: static PassRefPtr<Geolocation> create(Frame* frame) { return adoptRef(new Geolocation(frame)); } - virtual ~Geolocation() {} + virtual ~Geolocation(); void disconnectFrame(); @@ -118,6 +119,9 @@ private: virtual void geolocationServicePositionChanged(GeolocationService*); virtual void geolocationServiceErrorOccurred(GeolocationService*); + // EventListener + virtual void handleEvent(Event*, bool isWindowEvent); + void fatalErrorOccurred(GeoNotifier* notifier); void requestTimedOut(GeoNotifier* notifier); void requestReturnedCachedPosition(GeoNotifier* notifier); |