diff options
author | Steve Block <steveblock@google.com> | 2009-07-29 16:21:14 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2009-07-30 17:13:48 +0100 |
commit | a47a1c89e31d5fd26298656c3e15c09e841bce83 (patch) | |
tree | cc6c208d5a5b1b39b1ff1dad091a1dd77f6894f2 /WebCore | |
parent | 6e84e087cc8b8af787e1af3d75c3c6c24737c697 (diff) | |
download | external_webkit-a47a1c89e31d5fd26298656c3e15c09e841bce83.zip external_webkit-a47a1c89e31d5fd26298656c3e15c09e841bce83.tar.gz external_webkit-a47a1c89e31d5fd26298656c3e15c09e841bce83.tar.bz2 |
Adds a mock GeolocationService.
This is being submitted to WebKit in bug 27716.
Diffstat (limited to 'WebCore')
-rw-r--r-- | WebCore/Android.mk | 1 | ||||
-rw-r--r-- | WebCore/Android.v8.mk | 1 | ||||
-rw-r--r-- | WebCore/platform/GeolocationService.cpp | 27 | ||||
-rw-r--r-- | WebCore/platform/GeolocationService.h | 7 | ||||
-rwxr-xr-x | WebCore/platform/MockGeolocationService.cpp | 103 | ||||
-rwxr-xr-x | WebCore/platform/MockGeolocationService.h | 74 | ||||
-rw-r--r-- | WebCore/platform/android/GeolocationServiceAndroid.cpp | 6 |
7 files changed, 213 insertions, 6 deletions
diff --git a/WebCore/Android.mk b/WebCore/Android.mk index 1b3e248..e8f6dce 100644 --- a/WebCore/Android.mk +++ b/WebCore/Android.mk @@ -635,6 +635,7 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \ platform/Length.cpp \ platform/LinkHash.cpp \ platform/Logging.cpp \ + platform/MockGeolocationService.cpp \ platform/MIMETypeRegistry.cpp \ platform/ScrollView.cpp \ platform/Scrollbar.cpp \ diff --git a/WebCore/Android.v8.mk b/WebCore/Android.v8.mk index 89fbaca..57f9406 100644 --- a/WebCore/Android.v8.mk +++ b/WebCore/Android.v8.mk @@ -496,6 +496,7 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \ platform/Length.cpp \ platform/LinkHash.cpp \ platform/Logging.cpp \ + platform/MockGeolocationService.cpp \ platform/MIMETypeRegistry.cpp \ platform/ScrollView.cpp \ platform/Scrollbar.cpp \ diff --git a/WebCore/platform/GeolocationService.cpp b/WebCore/platform/GeolocationService.cpp index 9b362c8..454538e 100644 --- a/WebCore/platform/GeolocationService.cpp +++ b/WebCore/platform/GeolocationService.cpp @@ -20,23 +20,46 @@ * 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. + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "GeolocationService.h" +#include "Geoposition.h" +#include "MockGeolocationService.h" +#include "PositionError.h" +#include <wtf/CurrentTime.h> #include <wtf/Assertions.h> namespace WebCore { #if !ENABLE(GEOLOCATION) -GeolocationService* GeolocationService::create(GeolocationServiceClient*) +GeolocationService* createNullGeolocationService(GeolocationServiceClient*) { return 0; } + +GeolocationService::FactoryFunction* GeolocationService::s_factoryFunction = &createNullGeolocationService; #endif +GeolocationService* GeolocationService::create(GeolocationServiceClient* client) +{ + return (*s_factoryFunction)(client); +} + +void GeolocationService::setMockPosition(PassRefPtr<Geoposition> position) +{ + s_factoryFunction = &MockGeolocationService::create; + MockGeolocationService::setPosition(position); +} + +void GeolocationService::setMockError(PassRefPtr<PositionError> error) +{ + s_factoryFunction = &MockGeolocationService::create; + MockGeolocationService::setError(error); +} + GeolocationService::GeolocationService(GeolocationServiceClient* client) : m_geolocationServiceClient(client) { diff --git a/WebCore/platform/GeolocationService.h b/WebCore/platform/GeolocationService.h index 74a6ead..3084aad 100644 --- a/WebCore/platform/GeolocationService.h +++ b/WebCore/platform/GeolocationService.h @@ -27,6 +27,7 @@ #define GeolocationService_h #include <wtf/Noncopyable.h> +#include <wtf/PassRefPtr.h> namespace WebCore { @@ -59,11 +60,17 @@ public: void positionChanged(); void errorOccurred(); + static void setMockPosition(PassRefPtr<Geoposition>); + static void setMockError(PassRefPtr<PositionError>); + protected: GeolocationService(GeolocationServiceClient*); private: GeolocationServiceClient* m_geolocationServiceClient; + + typedef GeolocationService* (FactoryFunction)(GeolocationServiceClient*); + static FactoryFunction* s_factoryFunction; }; } // namespace WebCore diff --git a/WebCore/platform/MockGeolocationService.cpp b/WebCore/platform/MockGeolocationService.cpp new file mode 100755 index 0000000..481d588 --- /dev/null +++ b/WebCore/platform/MockGeolocationService.cpp @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2009 Apple Inc. All Rights Reserved. + * + * 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. + */ + +#include "config.h" +#include "MockGeolocationService.h" + +#include "Geoposition.h" +#include "PositionError.h" +#include "PositionOptions.h" + +namespace WebCore { + +MockGeolocationService::MockGeolocationServiceSet MockGeolocationService::s_instances; +RefPtr<Geoposition> MockGeolocationService::s_lastPosition = 0; +RefPtr<PositionError> MockGeolocationService::s_lastError = 0; + +GeolocationService* MockGeolocationService::create(GeolocationServiceClient* client) +{ + return new MockGeolocationService(client); +} + +MockGeolocationService::MockGeolocationService(GeolocationServiceClient* client) + : GeolocationService(client) + , m_timer(this, &MockGeolocationService::timerFired) +{ + s_instances.add(this); +} + +MockGeolocationService::~MockGeolocationService() +{ + MockGeolocationServiceSet::iterator iter = s_instances.find(this); + ASSERT(iter != s_instances.end()); + s_instances.remove(iter); +} + +void MockGeolocationService::setPosition(PassRefPtr<Geoposition> position) +{ + s_lastPosition = position; + s_lastError = 0; + makeGeolocationCallbackFromAllInstances(); +} + +void MockGeolocationService::setError(PassRefPtr<PositionError> error) +{ + s_lastError = error; + s_lastPosition = 0; + makeGeolocationCallbackFromAllInstances(); +} + +bool MockGeolocationService::startUpdating(PositionOptions* options) +{ + m_timer.startOneShot(0); + return true; +} + +void MockGeolocationService::timerFired(Timer<MockGeolocationService>* timer) +{ + ASSERT(timer == m_timer); + makeGeolocationCallback(); +} + +void MockGeolocationService::makeGeolocationCallbackFromAllInstances() +{ + MockGeolocationServiceSet::const_iterator end = s_instances.end(); + for (MockGeolocationServiceSet::const_iterator iter = s_instances.begin(); + iter != end; + ++iter) { + (*iter)->makeGeolocationCallback(); + } +} + +void MockGeolocationService::makeGeolocationCallback() +{ + if (s_lastPosition) { + positionChanged(); + } else if (s_lastError) { + errorOccurred(); + } +} + +} // namespace WebCore diff --git a/WebCore/platform/MockGeolocationService.h b/WebCore/platform/MockGeolocationService.h new file mode 100755 index 0000000..0a1ef11 --- /dev/null +++ b/WebCore/platform/MockGeolocationService.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2009 Apple Inc. All Rights Reserved. + * + * 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 MockGeolocationService_h +#define MockGeolocationService_h + +#include "HashSet.h" +#include "GeolocationService.h" +#include "Timer.h" +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> + +namespace WebCore { + +// This class provides a mock implementation of a GeolocationService for testing +// purposes. It allows the position or error that will be reported by this class +// to be set manually using the setPosition and setError methods. Objects of +// this class call back to their respective GeolocationServiceClient with the +// position or error every time either of these is updated. +class MockGeolocationService : public GeolocationService { + public: + static GeolocationService* create(GeolocationServiceClient*); + + MockGeolocationService(GeolocationServiceClient*); + virtual ~MockGeolocationService(); + + virtual bool startUpdating(PositionOptions*); + + static void setPosition(PassRefPtr<Geoposition> position); + static void setError(PassRefPtr<PositionError> position); + + virtual Geoposition* lastPosition() const { return s_lastPosition.get(); } + virtual PositionError* lastError() const { return s_lastError.get(); } + + private: + static void makeGeolocationCallbackFromAllInstances(); + void makeGeolocationCallback(); + + void timerFired(Timer<MockGeolocationService>*); + + static RefPtr<Geoposition> s_lastPosition; + static RefPtr<PositionError> s_lastError; + + typedef HashSet<MockGeolocationService*> MockGeolocationServiceSet; + static MockGeolocationServiceSet s_instances; + + Timer<MockGeolocationService> m_timer; +}; + +} // namespace WebCore + +#endif // MockGeolocationService_h diff --git a/WebCore/platform/android/GeolocationServiceAndroid.cpp b/WebCore/platform/android/GeolocationServiceAndroid.cpp index 17807b3..9c6cb81 100644 --- a/WebCore/platform/android/GeolocationServiceAndroid.cpp +++ b/WebCore/platform/android/GeolocationServiceAndroid.cpp @@ -27,9 +27,7 @@ namespace WebCore { -GeolocationService* GeolocationService::create(GeolocationServiceClient*) { - // TODO(steveblock): Implement Geolocation on Android. - return 0; -} +// TODO(steveblock): Implement Geolocation on Android. +GeolocationService::FactoryFunction* GeolocationService::s_factoryFunction = 0; } // namespace WebCore |