Merge change 1299 into donut

* changes:
  Added Java callback for JavaScript execution timeout.
This commit is contained in:
Android (Google) Code Review
2009-05-11 14:03:56 -07:00
3 changed files with 60 additions and 0 deletions

View File

@@ -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();
}
}

View File

@@ -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;
}
}

View File

@@ -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
//-------------------------------------------------------------------------