Loading core/java/android/webkit/CallbackProxy.java +34 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ class CallbackProxy extends Handler { 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 JS_TIMEOUT = 127; // Message triggered by the client to resume execution private static final int NOTIFY = 200; Loading Loading @@ -548,6 +549,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; Loading Loading @@ -1073,4 +1086,25 @@ class CallbackProxy extends Handler { sendMessage(exceededQuota); } /** * @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(); } } core/java/android/webkit/WebChromeClient.java +15 −0 Original line number Diff line number Diff line Loading @@ -174,4 +174,19 @@ public class WebChromeClient { // WebCore will interpret this that new quota was declined. quotaUpdater.updateQuota(currentQuota); } /** * 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; } } core/java/android/webkit/WebViewCore.java +10 −0 Original line number Diff line number Diff line Loading @@ -288,6 +288,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 //------------------------------------------------------------------------- Loading Loading
core/java/android/webkit/CallbackProxy.java +34 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ class CallbackProxy extends Handler { 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 JS_TIMEOUT = 127; // Message triggered by the client to resume execution private static final int NOTIFY = 200; Loading Loading @@ -548,6 +549,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; Loading Loading @@ -1073,4 +1086,25 @@ class CallbackProxy extends Handler { sendMessage(exceededQuota); } /** * @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(); } }
core/java/android/webkit/WebChromeClient.java +15 −0 Original line number Diff line number Diff line Loading @@ -174,4 +174,19 @@ public class WebChromeClient { // WebCore will interpret this that new quota was declined. quotaUpdater.updateQuota(currentQuota); } /** * 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; } }
core/java/android/webkit/WebViewCore.java +10 −0 Original line number Diff line number Diff line Loading @@ -288,6 +288,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 //------------------------------------------------------------------------- Loading