Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
3.0.0
-
None
-
iOS 5.
Device or Network plugins (any plugin that adds itself as a dependency to the deviceready event).
Description
Reproduction Steps:
- Create a new cordova project for iOS
- Add the Device and Network plugins
- Add a logging plugin of some kind
- Add client code that calls the logging plugin before issuing a window.location.reload(). In our situation we have lots of logging happening just before we do a reload.
Expected Results:
The application reloads, successfully invoking the deviceready event.
Actual Results:
The application reloads but is stopped waiting for deviceready.
Cause:
Race condition on request ID reset.
Let the first instance of cordova be instanceA and the second instance of cordova be instanceB.
- instanceA issues commands that are queued to be handled by the native bridge.
- instanceA reloads the page.
- The native bridge handles webViewDidStartLoad and resets the largest request ID to 0.
- The native bridge continues to process the large queue from instanceA incrementing the largest request ID to X (perhaps the XHR request has come in after the webViewDidStartLoad is handled?)
- instanceB starts up,
- The Device plugin for instanceB tries to getDeviceInfo,
- The native bridge sees the instanceB request with ID 0 and ignores it because it is less than request ID X.
- The Device plugin never gets a callback and therefore prevents the deviceready event from firing.
Possible Solutions:
- Cordova should make an initial XHR request to reset the request ID on the native bridge. Perhaps "gap_init" instead of "gap_exec".