OSDN Git Service

Adds a mock GeolocationService.
authorSteve Block <steveblock@google.com>
Wed, 29 Jul 2009 15:21:14 +0000 (16:21 +0100)
committerSteve Block <steveblock@google.com>
Thu, 30 Jul 2009 16:13:48 +0000 (17:13 +0100)
This is being submitted to WebKit in bug 27716.

WebCore/Android.mk
WebCore/Android.v8.mk
WebCore/platform/GeolocationService.cpp
WebCore/platform/GeolocationService.h
WebCore/platform/MockGeolocationService.cpp [new file with mode: 0755]
WebCore/platform/MockGeolocationService.h [new file with mode: 0755]
WebCore/platform/android/GeolocationServiceAndroid.cpp

index 1b3e248..e8f6dce 100644 (file)
@@ -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 \
index 89fbaca..57f9406 100644 (file)
@@ -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 \
index 9b362c8..454538e 100644 (file)
  * 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)
 {
index 74a6ead..3084aad 100644 (file)
@@ -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 (executable)
index 0000000..481d588
--- /dev/null
@@ -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 (executable)
index 0000000..0a1ef11
--- /dev/null
@@ -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
index 17807b3..9c6cb81 100644 (file)
@@ -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