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

Jimmy Jarvis commented on CB-1318:
----------------------------------

My pleasure and thank you for fixing it. When the patch is release we'll pull 
our pseudo-GUID out in favor of your patch. Could you please include the 
Date().getTime() integer (e.g. + 1347566429801) as part of your random number 
string? To you point, a random number is unlikely to repeat, but this would 
make it failsafe, completely removing to possibility of a phantom callback. 
Again, thanks so much for fixing this!
                
> Cordova Callback Logic Not Implemented Correctly -  Native Asynchronous 
> Completion Can Call Wrong Logic in Javascript - Requires Non-recurring Unique 
> ID as Outlined
> --------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CB-1318
>                 URL: https://issues.apache.org/jira/browse/CB-1318
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: Android, iOS
>    Affects Versions: 2.0.0
>            Reporter: Jimmy Jarvis
>            Assignee: Braden Shepherdson
>            Priority: Critical
>             Fix For: 2.2.0
>
>
> This bug creates very difficult to find execution anomalies for any 
> asynchronous callback that occurs when the calling context has changed.
> PROBLEM: Cordova callback logic can trigger the callback function of an 
> unrelated call from a different context. When a call from Javascript is made, 
> Cordova generates a new callbackId, adds it to the cordova.callbacks array, 
> and passes it along to the native code. Some time later, when the native code 
> completes the request, it injects javascript to call the callbackSuccess or 
> callbackError function. The respective callback handler looks up the callback 
> attributes from the cordova.callbacks array and executes the original 
> caller's completion function. The problem is each page, or reload of a page, 
> resets the callbackId counter to zero and new calls end up reusing the same 
> callbackId, even though the native code haS not yet completed the prior 
> request. This can occur upon a new page load or reload upon an empty href in 
> an anchor tag. A call to native code from page1.html could trigger the 
> completion routine on page2.html because the native code has no context of 
> the change on the other side of the bridge.
> SOLUTION: Replace the incrementing callbackId with a unique identifier to 
> insure only the caller's completion logic will be called. I have done this 
> with a Pseudo-GUID generator. Fix outlined below:
> // REPLACE THIS LINE in both cordova.2.0.0.js and cordova.ios.js
>         callbackId = service + cordova.callbackId++;    // BUG: incrementing 
> Id's can call unrelated callback logic
> // WITH THIS LINE
>         callbackId = service + ":" + 
> 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {var r = 
> Math.random()*16|0,v=c=='x'?r:r&0x3|0x8;return v.toString(16);}); // Generate 
> unique callbackID with Pseudo-GUID
> This fix insures no code will execute if the caller's context has changed and 
> is a more well formatted callbackId.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to