[ 
https://issues.apache.org/jira/browse/CB-8468?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14382213#comment-14382213
 ] 

Andrew Grieve commented on CB-8468:
-----------------------------------

One reservation I have with doing this for all callbacks is that without the 
setTimeout(), exec() calls made from within the callback are "chained" back to 
the native side. This optimization is actually quite dramatic in places where 
it kicks in. Perhaps we should use a setTimeout only when running in debug mode?

> Application freezes if breakpoint hits JavaScript callback invoked from native
> ------------------------------------------------------------------------------
>
>                 Key: CB-8468
>                 URL: https://issues.apache.org/jira/browse/CB-8468
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: CordovaJS, iOS
>            Reporter: Marcus Pridham
>            Priority: Minor
>             Fix For: 4.0.0
>
>
> It you attach Safari to your application and hit a breakpoint in a Cordova 
> callback the application freezes and you can't step through or continue.  
> This only happens in breakpoints in the native to JavaScript callbacks.  
> JavaScript breakpoints in other areas work fine.   
> A simple way to reproduce is to use the globalization plugin.  Attach safari 
> and put a breakpoint in the success callback.
> {code}
> navigator.globalization.getPreferredLanguage(function() {
>         console.log("test"); // Will freeze if breakpoint set here
>     }, function() {});
> {code}
> The problem seems to have to  do with the webview 
> stringByEvaluatingJavaScriptFromString.  It is a synchronous call that can 
> return the result of the JavaScript back to the native.  The native code will 
> crash if a breakpoint is hit while trying to execute the JavaScript.  The 
> workaround is to have your callback code in a setTimeout so it is not in the 
> same context as the native stringByEvaluatingJavaScriptFromString call.
>  
> A workaround:
>  
> Open cordova.js and around line 281 replace:
>  {code}
> callbackFromNative: function(callbackId, isSuccess, status, args, 
> keepCallback) {
>  {code}
> With:
>  {code}
>     callbackFromNative: function(callbackId, isSuccess, status, args, 
> keepCallback) {
>        setTimeout(function() {
>             cordova.callbackFromNative2(callbackId, isSuccess, status, args, 
> keepCallback);
>         }, 0);
>     },
>        
>     callbackFromNative2: function(callbackId, isSuccess, status, args, 
> keepCallback) {
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to