diff -r 000000000000 -r 4f2f89ce4247 WebCore/page/Geolocation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebCore/page/Geolocation.h Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,189 @@ +/* + * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved. + * Copyright 2010, The Android Open Source Project + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef Geolocation_h +#define Geolocation_h + +#include "GeolocationPositionCache.h" +#include "Geoposition.h" +#include "PositionCallback.h" +#include "PositionError.h" +#include "PositionErrorCallback.h" +#include "PositionOptions.h" +#include "Timer.h" + +#if !ENABLE(CLIENT_BASED_GEOLOCATION) +#include "GeolocationService.h" +#endif + +namespace WebCore { + +class Frame; + +#if ENABLE(CLIENT_BASED_GEOLOCATION) +class GeolocationPosition; +class GeolocationError; +#endif + +class Geolocation : public RefCounted +#if !ENABLE(CLIENT_BASED_GEOLOCATION) && ENABLE(GEOLOCATION) + , public GeolocationServiceClient +#endif +{ +public: + static PassRefPtr create(Frame* frame) { return adoptRef(new Geolocation(frame)); } + + ~Geolocation(); + + void disconnectFrame(); + + void getCurrentPosition(PassRefPtr, PassRefPtr, PassRefPtr); + int watchPosition(PassRefPtr, PassRefPtr, PassRefPtr); + void clearWatch(int watchId); + + // These methods are used by Android. + void suspend(); + void resume(); + + void setIsAllowed(bool); + Frame* frame() const { return m_frame; } + +#if ENABLE(CLIENT_BASED_GEOLOCATION) + void positionChanged(); + void setError(GeolocationError*); +#else + GeolocationService* getGeolocationService() const { return m_service.get(); } +#endif + +private: + Geoposition* lastPosition(); + + bool isAllowed() const { return m_allowGeolocation == Yes; } + bool isDenied() const { return m_allowGeolocation == No; } + + Geolocation(Frame*); + + class GeoNotifier : public RefCounted { + public: + static PassRefPtr create(Geolocation* geolocation, PassRefPtr positionCallback, PassRefPtr positionErrorCallback, PassRefPtr options) { return adoptRef(new GeoNotifier(geolocation, positionCallback, positionErrorCallback, options)); } + + void setFatalError(PassRefPtr); + bool hasZeroTimeout() const; + void setUseCachedPosition(); + void runSuccessCallback(Geoposition*); + void startTimerIfNeeded(); + void timerFired(Timer*); + + Geolocation* m_geolocation; + RefPtr m_successCallback; + RefPtr m_errorCallback; + RefPtr m_options; + Timer m_timer; + RefPtr m_fatalError; + bool m_useCachedPosition; + + private: + GeoNotifier(Geolocation*, PassRefPtr, PassRefPtr, PassRefPtr); + }; + + class Watchers { + public: + void set(int id, PassRefPtr); + void remove(int id); + void remove(GeoNotifier*); + bool contains(GeoNotifier*) const; + void clear(); + bool isEmpty() const; + void getNotifiersVector(Vector >&) const; + private: + typedef HashMap > IdToNotifierMap; + typedef HashMap, int> NotifierToIdMap; + IdToNotifierMap m_idToNotifierMap; + NotifierToIdMap m_notifierToIdMap; + }; + + bool hasListeners() const { return !m_oneShots.isEmpty() || !m_watchers.isEmpty(); } + + void sendError(Vector >&, PositionError*); + void sendPosition(Vector >&, Geoposition*); + + static void stopTimer(Vector >&); + void stopTimersForOneShots(); + void stopTimersForWatchers(); + void stopTimers(); + + void positionChangedInternal(); + void makeSuccessCallbacks(); + void handleError(PositionError*); + + void requestPermission(); + + bool startUpdating(GeoNotifier*); + void stopUpdating(); + +#if !ENABLE(CLIENT_BASED_GEOLOCATION) && ENABLE(GEOLOCATION) + // GeolocationServiceClient + virtual void geolocationServicePositionChanged(GeolocationService*); + virtual void geolocationServiceErrorOccurred(GeolocationService*); +#endif + + PassRefPtr startRequest(PassRefPtr, PassRefPtr, PassRefPtr); + + void fatalErrorOccurred(GeoNotifier*); + void requestTimedOut(GeoNotifier*); + void requestUsesCachedPosition(GeoNotifier*); + bool haveSuitableCachedPosition(PositionOptions*); + void makeCachedPositionCallbacks(); + + typedef HashSet > GeoNotifierSet; + + GeoNotifierSet m_oneShots; + Watchers m_watchers; + Frame* m_frame; +#if !ENABLE(CLIENT_BASED_GEOLOCATION) + OwnPtr m_service; +#endif +#if USE(PREEMPT_GEOLOCATION_PERMISSION) + RefPtr m_startRequestPermissionNotifier; +#endif + RefPtr m_lastPosition; + + enum { + Unknown, + InProgress, + Yes, + No + } m_allowGeolocation; + +#if ENABLE(GEOLOCATION) + OwnPtr m_positionCache; +#endif + GeoNotifierSet m_requestsAwaitingCachedPosition; +}; + +} // namespace WebCore + +#endif // Geolocation_h