diff options
| author | 2009-07-28 18:20:50 +0100 | |
|---|---|---|
| committer | 2009-07-29 17:02:37 +0100 | |
| commit | 4faee09c422a70439129e9fb40dd82f03d42c98d (patch) | |
| tree | ff7acb43fadde0011cc543ff75c6537bd8633de2 | |
| parent | 0ac031b3d29c6de90895c875991585812dc7388f (diff) | |
Adds the Java side of the system to show the Geolocation permissions prompt.
| -rw-r--r-- | core/java/android/webkit/CallbackProxy.java | 121 | ||||
| -rwxr-xr-x | core/java/android/webkit/GeolocationPermissions.java | 8 | ||||
| -rw-r--r-- | core/java/android/webkit/WebChromeClient.java | 17 | ||||
| -rw-r--r-- | core/java/android/webkit/WebViewCore.java | 51 |
4 files changed, 164 insertions, 33 deletions
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java index a6d03470fbad..ed77ce883e30 100644 --- a/core/java/android/webkit/CallbackProxy.java +++ b/core/java/android/webkit/CallbackProxy.java @@ -72,39 +72,41 @@ class CallbackProxy extends Handler { private final Context mContext; // Message Ids - private static final int PAGE_STARTED = 100; - private static final int RECEIVED_ICON = 101; - private static final int RECEIVED_TITLE = 102; - private static final int OVERRIDE_URL = 103; - private static final int AUTH_REQUEST = 104; - private static final int SSL_ERROR = 105; - private static final int PROGRESS = 106; - private static final int UPDATE_VISITED = 107; - private static final int LOAD_RESOURCE = 108; - private static final int CREATE_WINDOW = 109; - private static final int CLOSE_WINDOW = 110; - private static final int SAVE_PASSWORD = 111; - private static final int JS_ALERT = 112; - private static final int JS_CONFIRM = 113; - private static final int JS_PROMPT = 114; - private static final int JS_UNLOAD = 115; - private static final int ASYNC_KEYEVENTS = 116; - private static final int TOO_MANY_REDIRECTS = 117; - private static final int DOWNLOAD_FILE = 118; - private static final int REPORT_ERROR = 119; - private static final int RESEND_POST_DATA = 120; - private static final int PAGE_FINISHED = 121; - private static final int REQUEST_FOCUS = 122; - private static final int SCALE_CHANGED = 123; - private static final int RECEIVED_CERTIFICATE = 124; - private static final int SWITCH_OUT_HISTORY = 125; - private static final int EXCEEDED_DATABASE_QUOTA = 126; - private static final int REACHED_APPCACHE_MAXSIZE = 127; - private static final int JS_TIMEOUT = 128; - private static final int ADD_MESSAGE_TO_CONSOLE = 129; + private static final int PAGE_STARTED = 100; + private static final int RECEIVED_ICON = 101; + private static final int RECEIVED_TITLE = 102; + private static final int OVERRIDE_URL = 103; + private static final int AUTH_REQUEST = 104; + private static final int SSL_ERROR = 105; + private static final int PROGRESS = 106; + private static final int UPDATE_VISITED = 107; + private static final int LOAD_RESOURCE = 108; + private static final int CREATE_WINDOW = 109; + private static final int CLOSE_WINDOW = 110; + private static final int SAVE_PASSWORD = 111; + private static final int JS_ALERT = 112; + private static final int JS_CONFIRM = 113; + private static final int JS_PROMPT = 114; + private static final int JS_UNLOAD = 115; + private static final int ASYNC_KEYEVENTS = 116; + private static final int TOO_MANY_REDIRECTS = 117; + private static final int DOWNLOAD_FILE = 118; + private static final int REPORT_ERROR = 119; + private static final int RESEND_POST_DATA = 120; + private static final int PAGE_FINISHED = 121; + private static final int REQUEST_FOCUS = 122; + private static final int SCALE_CHANGED = 123; + private static final int RECEIVED_CERTIFICATE = 124; + private static final int SWITCH_OUT_HISTORY = 125; + private static final int EXCEEDED_DATABASE_QUOTA = 126; + private static final int REACHED_APPCACHE_MAXSIZE = 127; + private static final int JS_TIMEOUT = 128; + private static final int ADD_MESSAGE_TO_CONSOLE = 129; + private static final int GEOLOCATION_PERMISSIONS_SHOW_PROMPT = 130; + private static final int GEOLOCATION_PERMISSIONS_HIDE_PROMPT = 131; // Message triggered by the client to resume execution - private static final int NOTIFY = 200; + private static final int NOTIFY = 200; // Result transportation object for returning results across thread // boundaries. @@ -438,6 +440,25 @@ class CallbackProxy extends Handler { } break; + case GEOLOCATION_PERMISSIONS_SHOW_PROMPT: + if (mWebChromeClient != null) { + HashMap<String, Object> map = + (HashMap<String, Object>) msg.obj; + String origin = (String) map.get("origin"); + GeolocationPermissions.Callback callback = + (GeolocationPermissions.Callback) + map.get("callback"); + mWebChromeClient.onGeolocationPermissionsShowPrompt(origin, + callback); + } + break; + + case GEOLOCATION_PERMISSIONS_HIDE_PROMPT: + if (mWebChromeClient != null) { + mWebChromeClient.onGeolocationPermissionsHidePrompt(); + } + break; + case JS_ALERT: if (mWebChromeClient != null) { final JsResult res = (JsResult) msg.obj; @@ -1192,6 +1213,44 @@ class CallbackProxy extends Handler { } /** + * Called by WebViewCore to instruct the browser to display a prompt to ask + * the user to set the Geolocation permission state for the given origin. + * @param origin The origin requesting Geolocation permsissions. + * @param callback The callback to call once a permission state has been + * obtained. + * @hide pending API council review. + */ + public void onGeolocationPermissionsShowPrompt(String origin, + GeolocationPermissions.Callback callback) { + if (mWebChromeClient == null) { + return; + } + + Message showMessage = + obtainMessage(GEOLOCATION_PERMISSIONS_SHOW_PROMPT); + HashMap<String, Object> map = new HashMap(); + map.put("origin", origin); + map.put("callback", callback); + showMessage.obj = map; + sendMessage(showMessage); + } + + /** + * Called by WebViewCore to instruct the browser to hide the Geolocation + * permissions prompt. + * origin. + * @hide pending API council review. + */ + public void onGeolocationPermissionsHidePrompt() { + if (mWebChromeClient == null) { + return; + } + + Message hideMessage = obtainMessage(GEOLOCATION_PERMISSIONS_HIDE_PROMPT); + sendMessage(hideMessage); + } + + /** * Called by WebViewCore when we have a message to be added to the JavaScript * error console. Sends a message to the Java side with the details. * @param message The message to add to the console. diff --git a/core/java/android/webkit/GeolocationPermissions.java b/core/java/android/webkit/GeolocationPermissions.java index 0f3079af7223..d06d7e2e9f0f 100755 --- a/core/java/android/webkit/GeolocationPermissions.java +++ b/core/java/android/webkit/GeolocationPermissions.java @@ -31,6 +31,14 @@ import java.util.Set; * @hide */ public final class GeolocationPermissions { + /** + * Callback interface used by the browser to report a Geolocation permission + * state set by the user in response to a permissions prompt. + */ + public interface Callback { + public void invoke(String origin, boolean allow, boolean remember); + }; + // Log tag private static final String TAG = "geolocationPermissions"; diff --git a/core/java/android/webkit/WebChromeClient.java b/core/java/android/webkit/WebChromeClient.java index fa78777cd9a3..d52406de7920 100644 --- a/core/java/android/webkit/WebChromeClient.java +++ b/core/java/android/webkit/WebChromeClient.java @@ -227,6 +227,20 @@ public class WebChromeClient { } /** + * Instructs the client to show a prompt to ask the user to set the + * Geolocation permission state for the specified origin. + * @hide pending API council approval. + */ + public void onGeolocationPermissionsShowPrompt(String origin, + GeolocationPermissions.Callback callback) {} + + /** + * Instructs the client to hide the Geolocation permissions prompt. + * @hide pending API council approval. + */ + public void onGeolocationPermissionsHidePrompt() {} + + /** * Tell the client that a JavaScript execution timeout has occured. And the * client may decide whether or not to interrupt the execution. If the * client returns true, the JavaScript will be interrupted. If the client @@ -249,6 +263,5 @@ public class WebChromeClient { * @param sourceID The name of the source file that caused the error. * @hide pending API council. */ - public void addMessageToConsole(String message, int lineNumber, String sourceID) { - } + public void addMessageToConsole(String message, int lineNumber, String sourceID) {} } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index dfff9ac166b3..4afc4cd63d45 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -285,6 +285,33 @@ final class WebViewCore { } /** + * Shows a prompt to ask the user to set the Geolocation permission state + * for the given origin. + * @param origin The origin for which Geolocation permissions are + * requested. + */ + protected void geolocationPermissionsShowPrompt(String origin) { + mCallbackProxy.onGeolocationPermissionsShowPrompt(origin, + new GeolocationPermissions.Callback() { + public void invoke(String origin, boolean allow, boolean remember) { + GeolocationPermissionsData data = new GeolocationPermissionsData(); + data.mOrigin = origin; + data.mAllow = allow; + data.mRemember = remember; + // Marshall to WebCore thread. + sendMessage(EventHub.GEOLOCATION_PERMISSIONS_PROVIDE, data); + } + }); + } + + /** + * Hides the Geolocation permissions prompt. + */ + protected void geolocationPermissionsHidePrompt() { + mCallbackProxy.onGeolocationPermissionsHidePrompt(); + } + + /** * Invoke a javascript confirm dialog. * @param message The message displayed in the dialog. * @return True if the user confirmed or false if the user cancelled. @@ -465,6 +492,16 @@ final class WebViewCore { private native void nativeUpdatePluginState(int framePtr, int nodePtr, int state); + /** + * Provide WebCore with a Geolocation permission state for the specified + * origin. + * @param origin The origin for which Geolocation permissions are provided. + * @param allow Whether Geolocation permissions are allowed. + * @param remember Whether this decision should be remembered beyond the + * life of the current page. + */ + private native void nativeGeolocationPermissionsProvide(String origin, boolean allow, boolean remember); + // EventHub for processing messages private final EventHub mEventHub; // WebCore thread handler @@ -608,6 +645,12 @@ final class WebViewCore { int mState; } + static class GeolocationPermissionsData { + String mOrigin; + boolean mAllow; + boolean mRemember; + } + static final String[] HandlerDebugString = { "SCROLL_TEXT_INPUT", // = 99 "LOAD_URL", // = 100; @@ -733,6 +776,8 @@ final class WebViewCore { static final int DUMP_NAVTREE = 172; static final int SET_JS_FLAGS = 173; + // Geolocation + static final int GEOLOCATION_PERMISSIONS_PROVIDE = 180; // private message ids private static final int DESTROY = 200; @@ -1119,6 +1164,12 @@ final class WebViewCore { case SET_JS_FLAGS: nativeSetJsFlags((String)msg.obj); + + case GEOLOCATION_PERMISSIONS_PROVIDE: + GeolocationPermissionsData data = + (GeolocationPermissionsData) msg.obj; + nativeGeolocationPermissionsProvide(data.mOrigin, + data.mAllow, data.mRemember); break; case SYNC_SCROLL: |