diff options
author | kristianm@chromium.org <kristianm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-14 14:58:58 +0000 |
---|---|---|
committer | kristianm@chromium.org <kristianm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-14 14:58:58 +0000 |
commit | 3a879683c4422affac21bb8cb4cfb7b3004730f0 (patch) | |
tree | b77bfbdff457644164de7df117f91635b8e09b82 /android_webview/java | |
parent | c37a3c686abacfe30528c3cdf65d772220392f56 (diff) | |
download | chromium_src-3a879683c4422affac21bb8cb4cfb7b3004730f0.zip chromium_src-3a879683c4422affac21bb8cb4cfb7b3004730f0.tar.gz chromium_src-3a879683c4422affac21bb8cb4cfb7b3004730f0.tar.bz2 |
Implementing geolocation for the Android Webview
Enabling geolocation callbacks
BUG=
Review URL: https://chromiumcodereview.appspot.com/12211047
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@182465 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview/java')
3 files changed, 137 insertions, 30 deletions
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index e0ada40..51c7a14 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java @@ -862,33 +862,52 @@ public class AwContents { mContentsClient.onReceivedHttpAuthRequest(handler, host, realm); } - private static class ChromiumGeolocationCallback implements GeolocationPermissions.Callback { - final int mRenderProcessId; - final int mRenderViewId; - final int mBridgeId; - final String mRequestingFrame; - - private ChromiumGeolocationCallback(int renderProcessId, int renderViewId, int bridgeId, - String requestingFrame) { - mRenderProcessId = renderProcessId; - mRenderViewId = renderViewId; - mBridgeId = bridgeId; - mRequestingFrame = requestingFrame; + private class AwGeolocationCallback implements GeolocationPermissions.Callback { + private final AwGeolocationPermissions mGeolocationPermissions; + + private AwGeolocationCallback(AwGeolocationPermissions geolocationPermissions) { + mGeolocationPermissions = geolocationPermissions; } @Override - public void invoke(String origin, boolean allow, boolean retain) { - // TODO(kristianm): Implement callback handling + public void invoke(final String origin, final boolean allow, final boolean retain) { + ThreadUtils.runOnUiThread(new Runnable() { + @Override + public void run() { + if (retain) { + if (allow) { + mGeolocationPermissions.allow(origin); + } else { + mGeolocationPermissions.deny(origin); + } + } + nativeInvokeGeolocationCallback(mNativeAwContents, allow, origin); + } + }); } } @CalledByNative - private void onGeolocationPermissionsShowPrompt(int renderProcessId, int renderViewId, - int bridgeId, String requestingFrame) { - // TODO(kristianm): Check with GeolocationPermissions if origin already has a policy set - mContentsClient.onGeolocationPermissionsShowPrompt(GURLUtils.getOrigin(requestingFrame), - new ChromiumGeolocationCallback(renderProcessId, renderViewId, bridgeId, - requestingFrame)); + private void onGeolocationPermissionsShowPrompt(String origin) { + AwGeolocationPermissions permissions = AwGeolocationPermissions.getInstance(); + // Reject if geoloaction is disabled, or the origin has a retained deny + if (!mSettings.getGeolocationEnabled()) { + nativeInvokeGeolocationCallback(mNativeAwContents, false, origin); + return; + } + // Allow if the origin has a retained allow + if (permissions.hasOrigin(origin)) { + nativeInvokeGeolocationCallback(mNativeAwContents, permissions.isOriginAllowed(origin), + origin); + return; + } + mContentsClient.onGeolocationPermissionsShowPrompt( + origin, new AwGeolocationCallback(permissions)); + } + + @CalledByNative + private void onGeolocationPermissionsHidePrompt() { + mContentsClient.onGeolocationPermissionsHidePrompt(); } @CalledByNative @@ -1084,4 +1103,7 @@ public class AwContents { private native Picture nativeCapturePicture(int nativeAwContents); private native void nativeEnableOnNewPicture(int nativeAwContents, boolean enabled, boolean invalidationOnly); + + private native void nativeInvokeGeolocationCallback( + int nativeAwContents, boolean value, String requestingFrame); } diff --git a/android_webview/java/src/org/chromium/android_webview/AwGeolocationPermissions.java b/android_webview/java/src/org/chromium/android_webview/AwGeolocationPermissions.java index 133f597..229bf20 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwGeolocationPermissions.java +++ b/android_webview/java/src/org/chromium/android_webview/AwGeolocationPermissions.java @@ -24,10 +24,51 @@ public final class AwGeolocationPermissions { AwGeolocationPermissions.class.getCanonicalName() + "%"; private final SharedPreferences mSharedPreferences; + private static AwGeolocationPermissions sInstance; + + // TODO(kristianm): Rewrite when AwBrowserContext has landed in + // CL: https://codereview.chromium.org/12208099/ public AwGeolocationPermissions(SharedPreferences sharedPreferences) { mSharedPreferences = sharedPreferences; + setInstance(this); + } + + private static void setInstance(AwGeolocationPermissions instance) { + synchronized (AwGeolocationPermissions.class) { + sInstance = instance; + } + } + + /** + * Get the static instance after it has been created + */ + public static AwGeolocationPermissions getInstance() { + synchronized (AwGeolocationPermissions.class) { + if (sInstance == null) { + throw new IllegalStateException("This should only be called after createInstance."); + } + } + return sInstance; + } + + /** + * Create the static instance of this class + */ + public static AwGeolocationPermissions createInstance( + SharedPreferences sharedPreferences) { + synchronized (AwGeolocationPermissions.class) { + if (sInstance != null) { + throw new IllegalStateException("This should only be called once."); + } + // sInstance set in the constructor + new AwGeolocationPermissions(sharedPreferences); + return sInstance; + } } + /** + * Set one origin to be allowed. + */ public void allow(String origin) { String key = getOriginKey(origin); if (key != null) { @@ -35,6 +76,9 @@ public final class AwGeolocationPermissions { } } + /** + * Set one origin to be denied. + */ public void deny(String origin) { String key = getOriginKey(origin); if (key != null) { @@ -42,6 +86,9 @@ public final class AwGeolocationPermissions { } } + /** + * Clear the stored permission for a particular origin. + */ public void clear(String origin) { String key = getOriginKey(origin); if (key != null) { @@ -49,6 +96,9 @@ public final class AwGeolocationPermissions { } } + /** + * Clear stored permissions for all origins. + */ public void clearAll() { SharedPreferences.Editor editor = null; for (String name : mSharedPreferences.getAll().keySet()) { @@ -64,17 +114,25 @@ public final class AwGeolocationPermissions { } } + /** + * Synchronous method to get if an origin is set to be allowed. + */ + public boolean isOriginAllowed(String origin) { + return mSharedPreferences.getBoolean(getOriginKey(origin), false); + } + + /** + * Returns true if the origin is either set to allowed or denied. + */ + public boolean hasOrigin(String origin) { + return mSharedPreferences.contains(getOriginKey(origin)); + } + + /** + * Asynchronous method to get if an origin set to be allowed. + */ 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; + final boolean finalAllowed = isOriginAllowed(origin); ThreadUtils.postOnUiThread(new Runnable() { @Override public void run() { @@ -83,6 +141,9 @@ public final class AwGeolocationPermissions { }); } + /** + * Async method to get the domains currently allowed or denied. + */ public void getOrigins(final ValueCallback<Set<String>> callback) { final Set<String> origins = new HashSet<String>(); for (String name : mSharedPreferences.getAll().keySet()) { @@ -98,6 +159,9 @@ public final class AwGeolocationPermissions { }); } + /** + * Get the domain of an URL using the GURL library. + */ private String getOriginKey(String url) { String origin = GURLUtils.getOrigin(url); if (origin.isEmpty()) { diff --git a/android_webview/java/src/org/chromium/android_webview/AwSettings.java b/android_webview/java/src/org/chromium/android_webview/AwSettings.java index cb91126..65b0c34 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java +++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java @@ -26,6 +26,7 @@ public class AwSettings { private boolean mAllowFileUrlAccess = true; private int mCacheMode = WebSettings.LOAD_DEFAULT; private boolean mShouldFocusFirstNode = true; + private boolean mGeolocationEnabled = true; public AwSettings(Context context) { mContext = context; @@ -137,4 +138,24 @@ public class AwSettings { return mShouldFocusFirstNode; } } + + /** + * See {@link android.webkit.WebSettings#setGeolocationEnabled}. + */ + public void setGeolocationEnabled(boolean flag) { + synchronized (mAwSettingsLock) { + if (mGeolocationEnabled != flag) { + mGeolocationEnabled = flag; + } + } + } + + /** + * @return Returns if geolocation is currently enabled. + */ + boolean getGeolocationEnabled() { + synchronized (mAwSettingsLock) { + return mGeolocationEnabled; + } + } } |