summaryrefslogtreecommitdiffstats
path: root/android_webview/java
diff options
context:
space:
mode:
authorkristianm@chromium.org <kristianm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-14 14:58:58 +0000
committerkristianm@chromium.org <kristianm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-14 14:58:58 +0000
commit3a879683c4422affac21bb8cb4cfb7b3004730f0 (patch)
treeb77bfbdff457644164de7df117f91635b8e09b82 /android_webview/java
parentc37a3c686abacfe30528c3cdf65d772220392f56 (diff)
downloadchromium_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')
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwContents.java62
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwGeolocationPermissions.java84
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwSettings.java21
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;
+ }
+ }
}