You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cordova.apache.org by "Torsten Freyhall (JIRA)" <ji...@apache.org> on 2016/05/02 08:30:13 UTC

[jira] [Commented] (CB-10774) CDVUIWebView performs javascript synchronous, but command queue expects it to be async

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

Torsten Freyhall commented on CB-10774:
---------------------------------------

In my opinion, the javascript code fixed in #CB-10530 should never execute unless the command bridge (I think it was called something like that) has changed.

My quick tests pointed at that the reason for the bridge change detection timeout to trigger in the javascript was that the native code expected the javascript callbacks to be run async. I haven't dug any further into the issue, just checked that this also solved the problem in #CB-10530. Also, it might have other side effects, however they should be limited to the UIWebViewEngine, since WKWebView performs javascript async by default.

> CDVUIWebView performs javascript synchronous, but command queue expects it to be async
> --------------------------------------------------------------------------------------
>
>                 Key: CB-10774
>                 URL: https://issues.apache.org/jira/browse/CB-10774
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: iOS
>    Affects Versions: 4.1.0
>            Reporter: Torsten Freyhall
>            Assignee: Shazron Abdullah
>              Labels: cordova-ios-4.1.1
>
> From https://issues.apache.org/jira/browse/CB-10530 regarding app freezing at launch.
> ...
> However I was not sure about why the timer resolves due to long script execution times though. It seems like the intention is that whenever gap://ready is loaded in the iframe, the immediate response from the native side should be to call nativeFetchMessages() which should clear the timeout.
> Therefore I dug a little deeper in the native side, and found that the evaluateJavaScript:completionHandler: in CDVCommandQueue expects implementation to to be async (a comment in the code says so), but the CDVUIWebViewEngine method actually is implemented synchronous.
> I wrapped the entire method in a dispatch_async call (maybe a very naive solution, it might mess with references?):
> {code}
> dispatch_async(dispatch_get_main_queue(), ^{
>   NSString* ret = [(UIWebView*)_engineWebView stringByEvaluatingJavaScriptFromString:javaScriptString];
> if (completionHandler)
> { completionHandler(ret, nil); }
> });
> {code}
> This also solves the original issue on cordova-ios 4.0.1 as the timeout never resolves, so maybe asyncing this method should also be a part of the proper fix?



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