diff --git a/lib/parse.js b/lib/parse.js
index 731161e..8b3e453 100644
--- a/lib/parse.js
+++ b/lib/parse.js
@@ -77,6 +77,18 @@ function parse (xml) {
return plist;
}
+/**
+ * Return length a XML string.
+ *
+ * @param {String} xml - the XML String to decode
+ * @return {integer} length - the string length
+ * @api public
+ */
+function getXMLStringLength(xml) {
+ var doc = new DOMParser().parseFromString(xml);
+ return doc.documentElement.childNodes.length;
+}
+
/**
* Convert an XML based plist document into a JSON representation.
*
diff --git a/test/parse.js b/test/parse.js
index 0dd10ba..2548079 100644
--- a/test/parse.js
+++ b/test/parse.js
@@ -499,5 +499,149 @@ int main(int argc, char *argv[])
CFBundleAllowMixedLocalizations: true
});
});
+ });
+ it('should parse an example "Cordova.plist" file', function () {
+ var xml = multiline(function () {
+/*
+
+
+
+
+
+ UIWebViewBounce
+
+ TopActivityIndicator
+ gray
+ EnableLocation
+
+ EnableViewportScale
+
+ AutoHideSplashScreen
+
+ ShowSplashScreenSpinner
+
+ MediaPlaybackRequiresUserAction
+
+ AllowInlineMediaPlayback
+
+ OpenAllWhitelistURLsInWebView
+
+ BackupWebStorage
+
+ ExternalHosts
+
+ *
+
+ Plugins
+
+ Device
+ CDVDevice
+ Logger
+ CDVLogger
+ Compass
+ CDVLocation
+ Accelerometer
+ CDVAccelerometer
+ Camera
+ CDVCamera
+ NetworkStatus
+ CDVConnection
+ Contacts
+ CDVContacts
+ Debug Console
+ CDVDebugConsole
+ Echo
+ CDVEcho
+ File
+ CDVFile
+ FileTransfer
+ CDVFileTransfer
+ Geolocation
+ CDVLocation
+ Notification
+ CDVNotification
+ Media
+ CDVSound
+ Capture
+ CDVCapture
+ SplashScreen
+ CDVSplashScreen
+ Battery
+ CDVBattery
+
+
+
+*/
+ });
+ var parsed = parse(xml);
+ assert.deepEqual(parsed, {
+ UIWebViewBounce: true,
+ TopActivityIndicator: 'gray',
+ EnableLocation: false,
+ EnableViewportScale: false,
+ AutoHideSplashScreen: true,
+ ShowSplashScreenSpinner: true,
+ MediaPlaybackRequiresUserAction: false,
+ AllowInlineMediaPlayback: false,
+ OpenAllWhitelistURLsInWebView: false,
+ BackupWebStorage: true,
+ ExternalHosts: [ '*' ],
+ Plugins: {
+ Device: 'CDVDevice',
+ Logger: 'CDVLogger',
+ Compass: 'CDVLocation',
+ Accelerometer: 'CDVAccelerometer',
+ Camera: 'CDVCamera',
+ NetworkStatus: 'CDVConnection',
+ Contacts: 'CDVContacts',
+ 'Debug Console': 'CDVDebugConsole',
+ Echo: 'CDVEcho',
+ File: 'CDVFile',
+ FileTransfer: 'CDVFileTransfer',
+ Geolocation: 'CDVLocation',
+ Notification: 'CDVNotification',
+ Media: 'CDVSound',
+ Capture: 'CDVCapture',
+ SplashScreen: 'CDVSplashScreen',
+ Battery: 'CDVBattery'
+ }
+ });
+ });
+
+ it('Add function getXMLStringLength. Issue #114', function () {
+ var xml = multiline(function () {
+ var xmlPollution =
+/*
+
+
+ __proto__
+
+ length
+ polluted
+
+
+
+*/
+ assert.equal(getXMLStringLength(xml), 8);
+ });
});
});