[ https://issues.apache.org/jira/browse/CB-1318?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13448967#comment-13448967 ]
Braden Shepherdson commented on CB-1318: ---------------------------------------- I'm interested in working on this for 2.2. That means that we need to discuss the approach to solving this problem. On discussion with Andrew Grieve, we feel the best approach would be to do the following on navigation: - Blow away the mapping of callback identifiers, effectively canceling all pending callbacks. - Call a destroy() or similar method on each plugin object, allowing them a chance to cancel pending operations that they have outstanding - network requests and the like. It is not essential that plugins are well-behaved here, it would only result in a bit of wasted effort. - Destroy each plugin object and recreate it, allowing the plugin to start fresh as though this were the first page loaded. We feel that simply calling a reset() method on a plugin relies on the plugin authors getting things right and actually cleaning things up to a good state. The above method is more robust, and more in line with the browser model of what a navigation means: the old context is destroyed and a clean slate is used. Thoughts? > 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: Shazron Abdullah > 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