diff options
author | Steve Block <steveblock@google.com> | 2012-05-18 17:58:24 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2012-05-22 14:17:23 +0100 |
commit | dbdd2da378a2c3d2baf2524694cb6e25419f8818 (patch) | |
tree | 69dac14113149a28575d9d323ba1b9061519a32b /Source/WebKit/android | |
parent | b80d1c52ad334f34843b52138f0ea684f2683904 (diff) | |
download | external_webkit-dbdd2da378a2c3d2baf2524694cb6e25419f8818.zip external_webkit-dbdd2da378a2c3d2baf2524694cb6e25419f8818.tar.gz external_webkit-dbdd2da378a2c3d2baf2524694cb6e25419f8818.tar.bz2 |
Hook up client-based Geolocation mock
This simply involves updating GeolocationMock, which is called by DRT from
Java, to call the GeolocationClientMock via GeolocationManager, rather than the
old GeolocationServiceMock. Note that GeolocationClientMock is tied to a
specific page, whereas GeolocationServiceMock had static methods, so we need to
pass the WebViewCore from Java.
We can now safely exclude the non-client-based files from the build.
We pass all Geolocation LayoutTests, except for
permission-denied-already-[error|success].html, which are flaky due to
https://bugs.webkit.org/show_bug.cgi?id=87033.
See corresponding framework change I6d88d5dce5c2148812b191a5b452718bf0854aeb.
Bug: 6511338
Change-Id: Ib74a3c05991593e75c3138415d4ac0bf0c9aefa9
Diffstat (limited to 'Source/WebKit/android')
-rw-r--r-- | Source/WebKit/android/WebCoreSupport/GeolocationManager.cpp | 43 | ||||
-rw-r--r-- | Source/WebKit/android/WebCoreSupport/GeolocationManager.h | 11 | ||||
-rwxr-xr-x | Source/WebKit/android/jni/MockGeolocation.cpp | 67 |
3 files changed, 91 insertions, 30 deletions
diff --git a/Source/WebKit/android/WebCoreSupport/GeolocationManager.cpp b/Source/WebKit/android/WebCoreSupport/GeolocationManager.cpp index 8d0d6b5..cbf399d 100644 --- a/Source/WebKit/android/WebCoreSupport/GeolocationManager.cpp +++ b/Source/WebKit/android/WebCoreSupport/GeolocationManager.cpp @@ -29,22 +29,27 @@ #include "GeolocationClientImpl.h" #include "WebViewCore.h" +#include <Frame.h> #include <GeolocationError.h> #include <GeolocationPosition.h> #include <JNIHelp.h> +#include <Page.h> using WebCore::GeolocationClient; +using WebCore::GeolocationClientMock; namespace android { GeolocationManager::GeolocationManager(WebViewCore* webViewCore) - : m_webViewCore(webViewCore) + : m_useMock(false) + , m_webViewCore(webViewCore) { } GeolocationClient* GeolocationManager::client() const { - // TODO: Return the mock client when appropriate. See http://b/6511338. + if (m_useMock) + return mockClient(); return realClient(); } @@ -76,6 +81,30 @@ void GeolocationManager::provideRealClientPermissionState(WTF::String origin, bo m_realClient->providePermissionState(origin, allow, remember); } +void GeolocationManager::setUseMock() +{ + m_useMock = true; + m_mockClient.clear(); +} + +void GeolocationManager::setMockPosition(PassRefPtr<WebCore::GeolocationPosition> position) +{ + ASSERT(m_useMock); + mockClient()->setPosition(position); +} + +void GeolocationManager::setMockError(PassRefPtr<WebCore::GeolocationError> error) +{ + ASSERT(m_useMock); + mockClient()->setError(error); +} + +void GeolocationManager::setMockPermission(bool allowed) +{ + ASSERT(m_useMock); + mockClient()->setPermission(allowed); +} + GeolocationClientImpl* GeolocationManager::realClient() const { if (!m_realClient) @@ -83,4 +112,14 @@ GeolocationClientImpl* GeolocationManager::realClient() const return m_realClient.get(); } +GeolocationClientMock* GeolocationManager::mockClient() const +{ + ASSERT(m_useMock); + if (!m_mockClient) { + m_mockClient.set(new GeolocationClientMock); + m_mockClient->setController(m_webViewCore->mainFrame()->page()->geolocationController()); + } + return m_mockClient.get(); +} + } // namespace android diff --git a/Source/WebKit/android/WebCoreSupport/GeolocationManager.h b/Source/WebKit/android/WebCoreSupport/GeolocationManager.h index 707cf6f..6459db1 100644 --- a/Source/WebKit/android/WebCoreSupport/GeolocationManager.h +++ b/Source/WebKit/android/WebCoreSupport/GeolocationManager.h @@ -28,6 +28,7 @@ #include "GeolocationClientImpl.h" +#include <GeolocationClientMock.h> #include <OwnPtr.h> #include <PassRefPtr.h> @@ -45,7 +46,6 @@ class WebViewCore; // may be either the real implementation or a mock. It also handles setting the // data on the mock client. This class is owned by WebViewCore and exists to // keep cruft out of that class. -// TODO: Add support for mock. See b/6511338. class GeolocationManager { public: GeolocationManager(WebViewCore*); @@ -59,11 +59,20 @@ public: void resetRealClientTemporaryPermissionStates(); void provideRealClientPermissionState(WTF::String origin, bool allow, bool remember); + // Sets use of the Geolocation mock client. Also resets that client. + void setUseMock(); + void setMockPosition(PassRefPtr<WebCore::GeolocationPosition>); + void setMockError(PassRefPtr<WebCore::GeolocationError>); + void setMockPermission(bool allowed); + private: GeolocationClientImpl* realClient() const; + WebCore::GeolocationClientMock* mockClient() const; + bool m_useMock; WebViewCore* m_webViewCore; mutable OwnPtr<GeolocationClientImpl> m_realClient; + mutable OwnPtr<WebCore::GeolocationClientMock> m_mockClient; }; } // namespace android diff --git a/Source/WebKit/android/jni/MockGeolocation.cpp b/Source/WebKit/android/jni/MockGeolocation.cpp index 250953f..164c37d 100755 --- a/Source/WebKit/android/jni/MockGeolocation.cpp +++ b/Source/WebKit/android/jni/MockGeolocation.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2009, The Android Open Source Project + * Copyright 2012, The Android Open Source Project * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -23,19 +23,16 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -// The functions in this file are used to configure the mock GeolocationService +// The functions in this file are used to configure the mock Geolocation client // for the LayoutTests. #include "config.h" -#include "Coordinates.h" -#include "GeolocationServiceMock.h" -#include "Geoposition.h" -#include "JavaSharedClient.h" -#include "PositionError.h" -#include "WebCoreJni.h" -#include <JNIHelp.h> -#include <JNIUtility.h> +#include "WebViewCore.h" + +#include <GeolocationError.h> +#include <GeolocationPosition.h> +#include "ScopedLocalRef.h" #include <wtf/CurrentTime.h> using namespace WebCore; @@ -44,30 +41,46 @@ namespace android { static const char* javaMockGeolocationClass = "android/webkit/MockGeolocation"; -static void setPosition(JNIEnv* env, jobject, double latitude, double longitude, double accuracy) +WebViewCore* getWebViewCore(JNIEnv* env, jobject webViewCore) +{ + ScopedLocalRef<jclass> webViewCoreClass(env, env->FindClass("android/webkit/WebViewCore")); + jfieldID nativeClassField = env->GetFieldID(webViewCoreClass.get(), "mNativeClass", "I"); + return reinterpret_cast<WebViewCore*>(env->GetIntField(webViewCore, nativeClassField)); +} + +static void setUseMock(JNIEnv* env, jobject, jobject webViewCore) +{ + getWebViewCore(env, webViewCore)->geolocationManager()->setUseMock(); +} + +static void setPosition(JNIEnv* env, jobject, jobject webViewCore, double latitude, double longitude, double accuracy) +{ + getWebViewCore(env, webViewCore)->geolocationManager()->setMockPosition(GeolocationPosition::create(WTF::currentTime(), + latitude, + longitude, + accuracy, + false, 0.0, // altitude, + false, 0.0, // altitudeAccuracy, + false, 0.0, // heading + false, 0.0)); // speed +} + +static void setError(JNIEnv* env, jobject, jobject webViewCore, int code, jstring message) { - RefPtr<Coordinates> coordinates = Coordinates::create(latitude, - longitude, - false, 0.0, // altitude, - accuracy, - false, 0.0, // altitudeAccuracy, - false, 0.0, // heading - false, 0.0); // speed - RefPtr<Geoposition> position = Geoposition::create(coordinates.release(), WTF::currentTimeMS()); - GeolocationServiceMock::setPosition(position.release()); + GeolocationError::ErrorCode codeEnum = static_cast<GeolocationError::ErrorCode>(code); + getWebViewCore(env, webViewCore)->geolocationManager()->setMockError(GeolocationError::create(codeEnum, jstringToWtfString(env, message))); } -static void setError(JNIEnv* env, jobject, int code, jstring message) +static void setPermission(JNIEnv* env, jobject, jobject webViewCore, bool allow) { - PositionError::ErrorCode codeEnum = static_cast<PositionError::ErrorCode>(code); - String messageString = jstringToWtfString(env, message); - RefPtr<PositionError> error = PositionError::create(codeEnum, messageString); - GeolocationServiceMock::setError(error.release()); + getWebViewCore(env, webViewCore)->geolocationManager()->setMockPermission(allow); } static JNINativeMethod gMockGeolocationMethods[] = { - { "nativeSetPosition", "(DDD)V", (void*) setPosition }, - { "nativeSetError", "(ILjava/lang/String;)V", (void*) setError } + { "nativeSetUseMock", "(Landroid/webkit/WebViewCore;)V", (void*) setUseMock }, + { "nativeSetPosition", "(Landroid/webkit/WebViewCore;DDD)V", (void*) setPosition }, + { "nativeSetError", "(Landroid/webkit/WebViewCore;ILjava/lang/String;)V", (void*) setError }, + { "nativeSetPermission", "(Landroid/webkit/WebViewCore;Z)V", (void*) setPermission }, }; int registerMockGeolocation(JNIEnv* env) |