summaryrefslogtreecommitdiffstats
path: root/core/java
diff options
context:
space:
mode:
authorAndroid (Google) Code Review <android-gerrit@google.com>2009-05-11 14:03:56 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2009-05-11 14:03:56 -0700
commit25fdf352d40476e8d87cea44e73581a86dda208d (patch)
tree68b4c42b54760a2051bb6b99074361c329855d99 /core/java
parent7f2ae493c58e221b2961ccbd92de24565665633c (diff)
parent81e41434b3421a89e3e967e866238719e8468bd5 (diff)
downloadframeworks_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.java35
-rw-r--r--core/java/android/webkit/WebChromeClient.java15
-rw-r--r--core/java/android/webkit/WebViewCore.java10
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
//-------------------------------------------------------------------------