summaryrefslogtreecommitdiffstats
path: root/WebCore
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2009-07-29 16:21:14 +0100
committerSteve Block <steveblock@google.com>2009-07-30 17:13:48 +0100
commita47a1c89e31d5fd26298656c3e15c09e841bce83 (patch)
treecc6c208d5a5b1b39b1ff1dad091a1dd77f6894f2 /WebCore
parent6e84e087cc8b8af787e1af3d75c3c6c24737c697 (diff)
downloadexternal_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.mk1
-rw-r--r--WebCore/Android.v8.mk1
-rw-r--r--WebCore/platform/GeolocationService.cpp27
-rw-r--r--WebCore/platform/GeolocationService.h7
-rwxr-xr-xWebCore/platform/MockGeolocationService.cpp103
-rwxr-xr-xWebCore/platform/MockGeolocationService.h74
-rw-r--r--WebCore/platform/android/GeolocationServiceAndroid.cpp6
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