Shingo Toda created CB-7906:
-------------------------------

             Summary: App crashes when find() is called with undefined 
desiredField members
                 Key: CB-7906
                 URL: https://issues.apache.org/jira/browse/CB-7906
             Project: Apache Cordova
          Issue Type: Bug
          Components: Docs, iOS, Plugin Contacts
    Affects Versions: 3.6.0
         Environment: iOS7,8
            Reporter: Shingo Toda
            Priority: Minor


Apps crash when find() is called with undefined members of ContactFieldType.
For example, the following code sets desiredFields to {{xx}} or {{yyy}} which 
are actually not defined in ContactFieldType.

{code:javascript}
options.desiredFields = [navigator.contacts.fieldType.xx, 
navigator.contacts.fieldType.yyy];
var fields = [navigator.contacts.fieldType.displayName, 
navigator.contacts.fieldType.name];
navigator.contacts.find(fields, onSuccess, onError, options);
{code}

In Objective-C code, those undefined members are turned into {{NSNull}} object. 
Therefore {{calcReturnFields}} method receives {{fieldArray}} which contains 
{{NSNull}} objects, then analyses {{fieldStr}} NSString object which is 
actually {{NSNull}} at {{[fieldStr componentsSeparatedByString:@"."]}} and 
eventually an app crashes.

I tweaked {{calcReturnFields}} method to ignore {{NSNull}} object as below and 
this looks working fine.

{code:title=CDVContact.m}
        for (id i in fieldsArray) {
            NSMutableArray* keys = nil;
            NSString* fieldStr = nil;
            if ([i isKindOfClass:[NSNumber class]]) {
                fieldStr = [i stringValue];
            // ST modified start
            } else if([i isEqual:[NSNull null]]){
                continue;
            // ST modified end
            } else {
                fieldStr = i;
            }
{code}

By this modification, all invalid desiredField types are ignored and those 
types could be thought to be "not found". In my opinion, this behaviour would 
make sense to developer as {{find()}} is called with dodgy desiredField 
parameters then those types shouldn't be included in the returned contact data. 
As far as I know, at least {{find()}} for Android behaves like this. 


By the way, I couldn't see supported parameters for {{desiredField}} in 
document. If I look at {{ContactFieldType.js}}, those members are populated 
from {{Contact}}, {{ContactAddress}}, etc.. It would be nice to clearly 
describe all supported types.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to