| // 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.android_webview.CleanupReference; |
| import org.chromium.base.Log; |
| import org.chromium.base.ThreadUtils; |
| |
| 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; |
| } |
| } |