diff options
| author | kristianm@chromium.org <kristianm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-15 22:19:44 +0000 | 
|---|---|---|
| committer | kristianm@chromium.org <kristianm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-15 22:19:44 +0000 | 
| commit | d72acb0dd473cd8dd0d3d420e22a03c766d76623 (patch) | |
| tree | 51dc420ff792f104bb4c8a81a7e4ccc8a1401b7d | |
| parent | 439a09441d84c629bb312733fbac43c4fef9a955 (diff) | |
| download | chromium_src-d72acb0dd473cd8dd0d3d420e22a03c766d76623.zip chromium_src-d72acb0dd473cd8dd0d3d420e22a03c766d76623.tar.gz chromium_src-d72acb0dd473cd8dd0d3d420e22a03c766d76623.tar.bz2 | |
Adding java implementation for Geolocation
Review URL: https://chromiumcodereview.appspot.com/11416347
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173328 0039d316-1c4b-4281-b951-d872f2087c98
| -rw-r--r-- | android_webview/java/src/org/chromium/android_webview/AwGeolocationPermissions.java | 101 | ||||
| -rw-r--r-- | base/android/java/src/org/chromium/base/ThreadUtils.java | 10 | ||||
| -rw-r--r-- | net/android/gurl_utils.cc | 24 | ||||
| -rw-r--r-- | net/android/gurl_utils.h | 16 | ||||
| -rw-r--r-- | net/android/java/src/org/chromium/net/GURLUtils.java | 27 | ||||
| -rw-r--r-- | net/android/net_jni_registrar.cc | 2 | ||||
| -rw-r--r-- | net/net.gyp | 3 | 
7 files changed, 183 insertions, 0 deletions
| diff --git a/android_webview/java/src/org/chromium/android_webview/AwGeolocationPermissions.java b/android_webview/java/src/org/chromium/android_webview/AwGeolocationPermissions.java new file mode 100644 index 0000000..7b4b945 --- /dev/null +++ b/android_webview/java/src/org/chromium/android_webview/AwGeolocationPermissions.java @@ -0,0 +1,101 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.android_webview; + +import android.content.SharedPreferences; +import android.webkit.ValueCallback; + +import org.chromium.base.JNINamespace; +import org.chromium.base.ThreadUtils; +import org.chromium.net.GURLUtils; + +import java.util.HashSet; +import java.util.Set; + +/** + * This class is used to manage permissions for the WebView's Geolocation JavaScript API. + * + * Callbacks are posted on the UI thread. + */ +public final class AwGeolocationPermissions { + +    private static final String PREF_PREFIX = +            AwGeolocationPermissions.class.getCanonicalName() + "%"; +    private final SharedPreferences mSharedPreferences; + +    public AwGeolocationPermissions(SharedPreferences sharedPreferences) { +        mSharedPreferences = sharedPreferences; +    } + +    public void allow(String origin) { +        String key = getOriginKey(origin); +        if (key != null) { +            mSharedPreferences.edit().putBoolean(key, true).apply(); +        } +    } + +    public void deny(String origin) { +        String key = getOriginKey(origin); +        if (key != null) { +            mSharedPreferences.edit().putBoolean(key, false).apply(); +        } +    } + +    public void clear(String origin) { +        String key = getOriginKey(origin); +        if (key != null) { +            mSharedPreferences.edit().remove(key).apply(); +        } +    } + +    public void clearAll() { +        for (String name : mSharedPreferences.getAll().keySet()) { +            if (name.startsWith(PREF_PREFIX)) { +                mSharedPreferences.edit().remove(name).apply(); +            } +        } +    } + +    public void getAllowed(String origin, final ValueCallback<Boolean> callback) { +        boolean allowed = false; +        try { +            String key = getOriginKey(origin); +            if (key != null) { +                allowed = mSharedPreferences.getBoolean(key, false); +            } +        } catch (ClassCastException e) { +            // Want to return false in this case, do nothing here +        } +        final boolean finalAllowed = allowed; +        ThreadUtils.postOnUiThread(new Runnable() { +            public void run() { +                callback.onReceiveValue(finalAllowed); +            } +        }); +    } + +    public void getOrigins(final ValueCallback<Set<String>> callback) { +        final Set<String> origins = new HashSet<String>(); +        for (String name : mSharedPreferences.getAll().keySet()) { +            if (name.startsWith(PREF_PREFIX)) { +                origins.add(name.substring(PREF_PREFIX.length())); +            } +        } +        ThreadUtils.postOnUiThread(new Runnable() { +            public void run() { +                callback.onReceiveValue(origins); +            } +        }); +    } + +    private String getOriginKey(String url) { +        String origin = GURLUtils.getOrigin(url); +        if (origin.isEmpty()) { +            return null; +        } + +        return PREF_PREFIX + origin; +    } +} diff --git a/base/android/java/src/org/chromium/base/ThreadUtils.java b/base/android/java/src/org/chromium/base/ThreadUtils.java index b827a0b..70232c4 100644 --- a/base/android/java/src/org/chromium/base/ThreadUtils.java +++ b/base/android/java/src/org/chromium/base/ThreadUtils.java @@ -123,6 +123,16 @@ public class ThreadUtils {      }      /** +     * Post the supplied Runnable to run on the main thread. The method will +     * not block, even if called on the UI thread. +     * +     * @param task The Runnable to run +     */ +    public static void postOnUiThread(Runnable r) { +        LazyHolder.sUiThreadHandler.post(r); +    } + +    /**       * Asserts that the current thread is running on the main thread.       */      public static void assertOnUiThread() { diff --git a/net/android/gurl_utils.cc b/net/android/gurl_utils.cc new file mode 100644 index 0000000..94d8e78 --- /dev/null +++ b/net/android/gurl_utils.cc @@ -0,0 +1,24 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/android/gurl_utils.h" + +#include "base/android/jni_string.h" +#include "googleurl/src/gurl.h" +#include "jni/GURLUtils_jni.h" + +namespace net { + +jstring GetOrigin(JNIEnv* env, jclass clazz, jstring url) { +  GURL host(base::android::ConvertJavaStringToUTF16(env, url)); + +  return base::android::ConvertUTF8ToJavaString(env, +      host.GetOrigin().spec()).Release(); +} + +bool RegisterGURLUtils(JNIEnv* env) { +  return RegisterNativesImpl(env); +} + +}  // net namespace diff --git a/net/android/gurl_utils.h b/net/android/gurl_utils.h new file mode 100644 index 0000000..aeeecf7 --- /dev/null +++ b/net/android/gurl_utils.h @@ -0,0 +1,16 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_ANDROID_GURL_UTILS_H_ +#define NET_ANDROID_GURL_UTILS_H_ + +#include <jni.h> + +namespace net { + +bool RegisterGURLUtils(JNIEnv* env); + +}  // net namespace + +#endif  // NET_ANDROID_GURL_UTILS_H_ diff --git a/net/android/java/src/org/chromium/net/GURLUtils.java b/net/android/java/src/org/chromium/net/GURLUtils.java new file mode 100644 index 0000000..8047ad3 --- /dev/null +++ b/net/android/java/src/org/chromium/net/GURLUtils.java @@ -0,0 +1,27 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.net; + +import org.chromium.base.JNINamespace; + +/** + * Class to access the GURL library from java. + */ +@JNINamespace("net") +public final class GURLUtils { + +    /** +     * Get the origin of an url: Ex getOrigin("http://www.example.com:8080/index.html?bar=foo") +     * would return "http://www.example.com:8080". It will return an empty string for an +     * invalid url. +     * +     * @return The origin of the url +     */ +    public static String getOrigin(String url) { +        return nativeGetOrigin(url); +    } + +    private static native String nativeGetOrigin(String url); +} diff --git a/net/android/net_jni_registrar.cc b/net/android/net_jni_registrar.cc index bd0d155..cfc3bb1 100644 --- a/net/android/net_jni_registrar.cc +++ b/net/android/net_jni_registrar.cc @@ -7,6 +7,7 @@  #include "base/basictypes.h"  #include "base/android/jni_android.h"  #include "base/android/jni_registrar.h" +#include "net/android/gurl_utils.h"  #include "net/android/network_change_notifier_android.h"  #include "net/android/network_library.h"  #include "net/proxy/proxy_config_service_android.h" @@ -16,6 +17,7 @@ namespace android {  static base::android::RegistrationMethod kNetRegisteredMethods[] = {    { "AndroidNetworkLibrary", net::android::RegisterNetworkLibrary }, +  { "GURLUtils", net::RegisterGURLUtils },    { "NetworkChangeNotifierAndroid",      net::NetworkChangeNotifierAndroid::Register },    { "ProxyConfigService", net::ProxyConfigServiceAndroid::Register }, diff --git a/net/net.gyp b/net/net.gyp index 056d776..6852985 100644 --- a/net/net.gyp +++ b/net/net.gyp @@ -56,6 +56,8 @@          'net_resources',        ],        'sources': [ +        'android/gurl_utils.cc', +        'android/gurl_utils.h',          'android/net_jni_registrar.cc',          'android/net_jni_registrar.h',          'android/network_change_notifier_android.cc', @@ -2265,6 +2267,7 @@            'type': 'none',            'sources': [              'android/java/src/org/chromium/net/AndroidNetworkLibrary.java', +            'android/java/src/org/chromium/net/GURLUtils.java',              'android/java/src/org/chromium/net/NetworkChangeNotifier.java',              'android/java/src/org/chromium/net/ProxyChangeListener.java',            ], | 
