cordova-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andrew Grieve (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CB-8468) Application freezes if breakpoint hits JavaScript callback invoked from native
Date Thu, 26 Mar 2015 16:56:53 GMT

    [ 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: issues-unsubscribe@cordova.apache.org
For additional commands, e-mail: issues-help@cordova.apache.org


Mime
View raw message