cordova-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andrew Grieve (JIRA)" <>
Subject [jira] [Commented] (CB-5037) Cordova fails to fire deviceready on page reload
Date Sat, 12 Oct 2013 00:51:41 GMT


Andrew Grieve commented on CB-5037:

Great analysis! Thanks for digging into this. Tricky thing with this bug is that you're in
the best position to verify a fix for it. I've taken a stab at a fix. Would you be able to
try it out?

Within CDVCommandQueue.m, change `maybeFetchCommandsFromJs:` to:

- (void)maybeFetchCommandsFromJs:(NSNumber*)requestId
    NSInteger rid = [requestId integerValue];

    // An ID of 1 is a special case because that signifies the first request of
    // the page. Since resetRequestId is called from webViewDidStartLoad, and the
    // JS context at the time of webViewDidStartLoad is still that of the previous
    // page, it's possible for requests from the previous page to come in after this
    // point. We ignore these by enforcing that ID=1 be the first ID.
    if ((_lastCommandQueueFlushRequestId == 0) && (rid != 1)) {
        CDV_EXEC_LOG(@"Exec: Ignoring exec request from previous page.");

    // Use the request ID to determine if we've already flushed for this request.
    // This is required only because the NSURLProtocol enqueues the same request
    // multiple times.
    if (rid > _lastCommandQueueFlushRequestId) {
        _lastCommandQueueFlushRequestId = [requestId integerValue];
        [self fetchCommandsFromJs];

> Cordova fails to fire deviceready on page reload
> ------------------------------------------------
>                 Key: CB-5037
>                 URL:
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: iOS
>    Affects Versions: 3.0.0
>         Environment: iOS 5.
> Device or Network plugins (any plugin that adds itself as a dependency to the deviceready
>            Reporter: Luke Terry
> 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
> # 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
> # 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".

This message was sent by Atlassian JIRA

View raw message