diff options
| author | Android (Google) Code Review <android-gerrit@google.com> | 2009-05-11 14:03:56 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2009-05-11 14:03:56 -0700 |
| commit | 25fdf352d40476e8d87cea44e73581a86dda208d (patch) | |
| tree | 68b4c42b54760a2051bb6b99074361c329855d99 /core/java | |
| parent | 7f2ae493c58e221b2961ccbd92de24565665633c (diff) | |
| parent | 81e41434b3421a89e3e967e866238719e8468bd5 (diff) | |
| download | frameworks_base-25fdf352d40476e8d87cea44e73581a86dda208d.zip frameworks_base-25fdf352d40476e8d87cea44e73581a86dda208d.tar.gz frameworks_base-25fdf352d40476e8d87cea44e73581a86dda208d.tar.bz2 | |
Merge change 1299 into donut
* changes:
Added Java callback for JavaScript execution timeout.
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/webkit/CallbackProxy.java | 35 | ||||
| -rw-r--r-- | core/java/android/webkit/WebChromeClient.java | 15 | ||||
| -rw-r--r-- | core/java/android/webkit/WebViewCore.java | 10 |
3 files changed, 60 insertions, 0 deletions
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java index 5f8acc8..17d3f94 100644 --- a/core/java/android/webkit/CallbackProxy.java +++ b/core/java/android/webkit/CallbackProxy.java @@ -98,6 +98,7 @@ class CallbackProxy extends Handler { 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 JS_TIMEOUT = 126; // Message triggered by the client to resume execution private static final int NOTIFY = 200; @@ -530,6 +531,18 @@ class CallbackProxy extends Handler { } break; + case JS_TIMEOUT: + if(mWebChromeClient != null) { + final JsResult res = (JsResult) msg.obj; + if(mWebChromeClient.onJsTimeout()) { + res.confirm(); + } else { + res.cancel(); + } + res.setReady(); + } + break; + case RECEIVED_CERTIFICATE: mWebView.setCertificate((SslCertificate) msg.obj); break; @@ -1022,4 +1035,26 @@ class CallbackProxy extends Handler { } return result.getResult(); } + + /** + * @hide pending API council approval + */ + public boolean onJsTimeout() { + //always interrupt timedout JS by default + if (mWebChromeClient == null) { + return true; + } + JsResult result = new JsResult(this, true); + Message timeout = obtainMessage(JS_TIMEOUT, result); + synchronized (this) { + sendMessage(timeout); + try { + wait(); + } catch (InterruptedException e) { + Log.e(LOGTAG, "Caught exception while waiting for jsUnload"); + Log.e(LOGTAG, Log.getStackTraceString(e)); + } + } + return result.getResult(); + } } diff --git a/core/java/android/webkit/WebChromeClient.java b/core/java/android/webkit/WebChromeClient.java index f940006..9d9763c 100644 --- a/core/java/android/webkit/WebChromeClient.java +++ b/core/java/android/webkit/WebChromeClient.java @@ -157,4 +157,19 @@ public class WebChromeClient { JsResult result) { return false; } + + /** + * 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 + * returns false, the execution will continue. Note that in the case of + * continuing execution, the timeout counter will be reset, and the callback + * will continue to occur if the script does not finish at the next check + * point. + * @return boolean Whether the JavaScript execution should be interrupted. + * @hide pending API Council approval + */ + public boolean onJsTimeout() { + return true; + } } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 58d8ae7..e9df453 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -263,6 +263,16 @@ final class WebViewCore { return mCallbackProxy.onJsBeforeUnload(url, message); } + /** + * + * Callback to notify that a JavaScript execution timeout has occured. + * @return True if the JavaScript execution should be interrupted. False + * will continue the execution. + */ + protected boolean jsInterrupt() { + return mCallbackProxy.onJsTimeout(); + } + //------------------------------------------------------------------------- // JNI methods //------------------------------------------------------------------------- |
