Index: android_webview/java/src/org/chromium/android_webview/permission/AwGeolocationCallback.java |
diff --git a/android_webview/java/src/org/chromium/android_webview/permission/AwGeolocationCallback.java b/android_webview/java/src/org/chromium/android_webview/permission/AwGeolocationCallback.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ef084f7c2807aa21a3bba30b58e67af804debbfb |
--- /dev/null |
+++ b/android_webview/java/src/org/chromium/android_webview/permission/AwGeolocationCallback.java |
@@ -0,0 +1,76 @@ |
+// Copyright 2015 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.permission; |
+ |
+import android.webkit.GeolocationPermissions; |
+ |
+import org.chromium.android_webview.AwContents; |
+import org.chromium.base.Log; |
+import org.chromium.base.ThreadUtils; |
+import org.chromium.content.common.CleanupReference; |
+ |
+import java.lang.ref.WeakReference; |
+ |
+/** |
+ * This class implements GeolocationPermissions.Callback, and will be sent to |
+ * WebView applications through WebChromeClient.onGeolocationPermissionsShowPrompt(). |
+ */ |
+public class AwGeolocationCallback implements GeolocationPermissions.Callback { |
+ private static final String TAG = "cr.Geolocation"; |
+ |
+ private CleanupRunable mCleanupRunable; |
+ private CleanupReference mCleanupReference; |
+ |
+ private static class CleanupRunable implements Runnable { |
+ private WeakReference<AwContents> mAwContents; |
+ private boolean mAllow; |
+ private boolean mRetain; |
+ private String mOrigin; |
+ |
+ public CleanupRunable(AwContents awContents, String origin) { |
+ mAwContents = new WeakReference<AwContents>(awContents); |
+ mOrigin = origin; |
+ } |
+ |
+ @Override |
+ public void run() { |
+ assert ThreadUtils.runningOnUiThread(); |
+ AwContents awContents = mAwContents.get(); |
+ if (awContents == null) return; |
+ if (mRetain) { |
+ if (mAllow) { |
+ awContents.getGeolocationPermissions().allow(mOrigin); |
+ } else { |
+ awContents.getGeolocationPermissions().deny(mOrigin); |
+ } |
+ } |
+ awContents.invokeGeolocationCallback(mAllow, mOrigin); |
+ } |
+ |
+ public void setResponse(String origin, boolean allow, boolean retain) { |
+ mOrigin = origin; |
+ mAllow = allow; |
+ mRetain = retain; |
+ } |
+ } |
+ |
+ public AwGeolocationCallback(String origin, AwContents awContents) { |
+ mCleanupRunable = new CleanupRunable(awContents, origin); |
+ mCleanupReference = new CleanupReference(this, mCleanupRunable); |
+ } |
+ |
+ @Override |
+ public void invoke(String origin, boolean allow, boolean retain) { |
+ if (mCleanupRunable == null || mCleanupReference == null) { |
+ Log.w(TAG, "Response for this geolocation request has been received." |
+ + " Ignoring subsequent responses"); |
+ return; |
+ } |
+ mCleanupRunable.setResponse(origin, allow, retain); |
+ mCleanupReference.cleanupNow(); |
+ mCleanupReference = null; |
+ mCleanupRunable = null; |
+ } |
+} |