You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by sh...@apache.org on 2013/01/15 21:20:38 UTC
ios commit: Interim js patch for [CB-2094] issue
Updated Branches:
refs/heads/master fc45dde67 -> 608717636
Interim js patch for [CB-2094] issue
Project: http://git-wip-us.apache.org/repos/asf/cordova-ios/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-ios/commit/60871763
Tree: http://git-wip-us.apache.org/repos/asf/cordova-ios/tree/60871763
Diff: http://git-wip-us.apache.org/repos/asf/cordova-ios/diff/60871763
Branch: refs/heads/master
Commit: 6087176364c633de83dd9044533dfe8cac88e54e
Parents: fc45dde
Author: Shazron Abdullah <sh...@apache.org>
Authored: Tue Jan 15 12:20:32 2013 -0800
Committer: Shazron Abdullah <sh...@apache.org>
Committed: Tue Jan 15 12:20:32 2013 -0800
----------------------------------------------------------------------
CordovaLib/cordova.ios.js | 832 ++++++++++++++++++----------------------
1 files changed, 369 insertions(+), 463 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/60871763/CordovaLib/cordova.ios.js
----------------------------------------------------------------------
diff --git a/CordovaLib/cordova.ios.js b/CordovaLib/cordova.ios.js
index a8e5f6b..a88bdb9 100644
--- a/CordovaLib/cordova.ios.js
+++ b/CordovaLib/cordova.ios.js
@@ -1,6 +1,6 @@
-// commit 24d65ab645742e8360c3dd16d7a36411cc3383e0
+// commit 48f8f97e0afad673448b03f0c8cb088691659f80
-// File generated at :: Thu Jan 03 2013 16:57:26 GMT-0800 (PST)
+// File generated at :: Tue Jan 15 2013 12:16:09 GMT-0800 (PST)
/*
Licensed to the Apache Software Foundation (ASF) under one
@@ -320,6 +320,8 @@ module.exports = cordova;
define("cordova/argscheck", function(require, exports, module) {
var exec = require('cordova/exec');
+var utils = require('cordova/utils');
+
var moduleExports = module.exports;
var typeMap = {
@@ -340,7 +342,7 @@ function checkArgs(spec, functionName, args, opt_callee) {
return;
}
var errMsg = null;
- var type;
+ var typeName;
for (var i = 0; i < spec.length; ++i) {
var c = spec.charAt(i),
cUpper = c.toUpperCase(),
@@ -349,17 +351,17 @@ function checkArgs(spec, functionName, args, opt_callee) {
if (c == '*') {
continue;
}
- type = Object.prototype.toString.call(arg).slice(8, -1);
+ typeName = utils.typeName(arg);
if ((arg === null || arg === undefined) && c == cUpper) {
continue;
}
- if (type != typeMap[cUpper]) {
+ if (typeName != typeMap[cUpper]) {
errMsg = 'Expected ' + typeMap[cUpper];
break;
}
}
if (errMsg) {
- errMsg += ', but got ' + type + '.';
+ errMsg += ', but got ' + typeName + '.';
errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg;
// Don't log when running jake test.
if (typeof jasmine == 'undefined') {
@@ -369,7 +371,12 @@ function checkArgs(spec, functionName, args, opt_callee) {
}
}
+function getValue(value, defaultValue) {
+ return value === undefined ? defaultValue : value;
+}
+
moduleExports.checkArgs = checkArgs;
+moduleExports.getValue = getValue;
moduleExports.enableChecks = true;
@@ -1037,6 +1044,41 @@ function shouldBundleCommandJson() {
return false;
}
+function massageArgsJsToNative(args) {
+ var encodeArrayBufferAs8bitString = function(ab) {
+ return String.fromCharCode.apply(null, new Uint8Array(ab));
+ };
+ var encodeArrayBufferAsBase64 = function(ab) {
+ return window.btoa(encodeArrayBufferAs8bitString(ab));
+ };
+ args.forEach(function(arg, i) {
+ if (arg instanceof ArrayBuffer) {
+ args[i] = {
+ 'CDVType': 'ArrayBuffer',
+ 'data': encodeArrayBufferAsBase64(arg)
+ };
+ } // else if (arg instanceof OTHER_TYPE)
+ });
+ return args;
+}
+
+function massagePayloadNativeToJs(payload) {
+ if (payload && payload.hasOwnProperty('CDVType') && payload.CDVType == 'ArrayBuffer') {
+ var stringToArrayBuffer = function(str) {
+ var ret = new Uint8Array(str.length);
+ for (var i = 0; i < str.length; i++) {
+ ret[i] = str.charCodeAt(i);
+ }
+ return ret.buffer;
+ };
+ var base64ToArrayBuffer = function(b64) {
+ return stringToArrayBuffer(atob(b64));
+ };
+ payload = base64ToArrayBuffer(payload.data);
+ }
+ return payload;
+}
+
function iOSExec() {
// XHR mode does not work on iOS 4.2, so default to IFRAME_NAV for such devices.
// XHR mode's main advantage is working around a bug in -webkit-scroll, which
@@ -1076,6 +1118,8 @@ function iOSExec() {
{success:successCallback, fail:failCallback};
}
+ actionArgs = massageArgsJsToNative(actionArgs);
+
var command = [callbackId, service, action, actionArgs];
// Stringify and queue the command. We stringify to command now to
@@ -1098,7 +1142,8 @@ function iOSExec() {
execXhr = execXhr || new XMLHttpRequest();
// Changing this to a GET will make the XHR reach the URIProtocol on 4.2.
// For some reason it still doesn't work though...
- execXhr.open('HEAD', "/!gap_exec", true);
+ // Add a timestamp to the query param to prevent caching.
+ execXhr.open('HEAD', "/!gap_exec?" + (+new Date()), true);
if (!vcHeaderValue) {
vcHeaderValue = /.*\((.*)\)/.exec(navigator.userAgent)[1];
}
@@ -1141,6 +1186,7 @@ iOSExec.nativeFetchMessages = function() {
iOSExec.nativeCallback = function(callbackId, status, payload, keepCallback) {
return iOSExec.nativeEvalAndFetch(function() {
var success = status === 0 || status === 1;
+ payload = massagePayloadNativeToJs(payload);
cordova.callbackFromNative(callbackId, success, status, payload, keepCallback);
});
};
@@ -1191,9 +1237,6 @@ module.exports = {
Entry:{
path: "cordova/plugin/ios/Entry"
},
- FileReader:{
- path: "cordova/plugin/ios/FileReader"
- },
navigator:{
children:{
notification:{
@@ -1233,7 +1276,8 @@ module.exports = Acceleration;
// file: lib/common/plugin/Camera.js
define("cordova/plugin/Camera", function(require, exports, module) {
-var exec = require('cordova/exec'),
+var argscheck = require('cordova/argscheck'),
+ exec = require('cordova/exec'),
Camera = require('cordova/plugin/CameraConstants');
var cameraExport = {};
@@ -1254,90 +1298,21 @@ for (var key in Camera) {
* @param {Object} options
*/
cameraExport.getPicture = function(successCallback, errorCallback, options) {
+ argscheck.checkArgs('fFO', 'Camera.getPicture', arguments);
options = options || {};
- // successCallback required
- if (typeof successCallback != "function") {
- console.log("Camera Error: successCallback is not a function");
- return;
- }
-
- // errorCallback optional
- if (errorCallback && (typeof errorCallback != "function")) {
- console.log("Camera Error: errorCallback is not a function");
- return;
- }
-
- var quality = 50;
- if (typeof options.quality == "number") {
- quality = options.quality;
- } else if (typeof options.quality == "string") {
- var qlity = parseInt(options.quality, 10);
- if (isNaN(qlity) === false) {
- quality = qlity.valueOf();
- }
- }
-
- var destinationType = Camera.DestinationType.FILE_URI;
- if (typeof options.destinationType == "number") {
- destinationType = options.destinationType;
- }
-
- var sourceType = Camera.PictureSourceType.CAMERA;
- if (typeof options.sourceType == "number") {
- sourceType = options.sourceType;
- }
-
- var targetWidth = -1;
- if (typeof options.targetWidth == "number") {
- targetWidth = options.targetWidth;
- } else if (typeof options.targetWidth == "string") {
- var width = parseInt(options.targetWidth, 10);
- if (isNaN(width) === false) {
- targetWidth = width.valueOf();
- }
- }
-
- var targetHeight = -1;
- if (typeof options.targetHeight == "number") {
- targetHeight = options.targetHeight;
- } else if (typeof options.targetHeight == "string") {
- var height = parseInt(options.targetHeight, 10);
- if (isNaN(height) === false) {
- targetHeight = height.valueOf();
- }
- }
-
- var encodingType = Camera.EncodingType.JPEG;
- if (typeof options.encodingType == "number") {
- encodingType = options.encodingType;
- }
-
- var mediaType = Camera.MediaType.PICTURE;
- if (typeof options.mediaType == "number") {
- mediaType = options.mediaType;
- }
- var allowEdit = false;
- if (typeof options.allowEdit == "boolean") {
- allowEdit = options.allowEdit;
- } else if (typeof options.allowEdit == "number") {
- allowEdit = options.allowEdit <= 0 ? false : true;
- }
- var correctOrientation = false;
- if (typeof options.correctOrientation == "boolean") {
- correctOrientation = options.correctOrientation;
- } else if (typeof options.correctOrientation == "number") {
- correctOrientation = options.correctOrientation <=0 ? false : true;
- }
- var saveToPhotoAlbum = false;
- if (typeof options.saveToPhotoAlbum == "boolean") {
- saveToPhotoAlbum = options.saveToPhotoAlbum;
- } else if (typeof options.saveToPhotoAlbum == "number") {
- saveToPhotoAlbum = options.saveToPhotoAlbum <=0 ? false : true;
- }
- var popoverOptions = null;
- if (typeof options.popoverOptions == "object") {
- popoverOptions = options.popoverOptions;
- }
+ var getValue = argscheck.getValue;
+
+ var quality = getValue(options.quality, 50);
+ var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI);
+ var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA);
+ var targetWidth = getValue(options.targetWidth, -1);
+ var targetHeight = getValue(options.targetHeight, -1);
+ var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG);
+ var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE);
+ var allowEdit = getValue(options.allowEdit, 0) > 0;
+ var correctOrientation = getValue(options.correctOrientation, 0) > 0;
+ var saveToPhotoAlbum = getValue(options.saveToPhotoAlbum, 0) > 0;
+ var popoverOptions = getValue(options.popoverOptions, null);
var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,
mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions];
@@ -1359,7 +1334,8 @@ define("cordova/plugin/CameraConstants", function(require, exports, module) {
module.exports = {
DestinationType:{
DATA_URL: 0, // Return base64 encoded string
- FILE_URI: 1 // Return file uri (content://media/external/images/media/2 for Android)
+ FILE_URI: 1, // Return file uri (content://media/external/images/media/2 for Android)
+ NATIVE_URI: 2 // Return native uri (eg. asset-library://... for iOS)
},
EncodingType:{
JPEG: 0, // Return JPEG encoded image
@@ -1511,10 +1487,10 @@ module.exports = CompassError;
define("cordova/plugin/CompassHeading", function(require, exports, module) {
var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) {
- this.magneticHeading = (magneticHeading !== undefined ? magneticHeading : null);
- this.trueHeading = (trueHeading !== undefined ? trueHeading : null);
- this.headingAccuracy = (headingAccuracy !== undefined ? headingAccuracy : null);
- this.timestamp = (timestamp !== undefined ? timestamp : new Date().getTime());
+ this.magneticHeading = magneticHeading || null;
+ this.trueHeading = trueHeading || null;
+ this.headingAccuracy = headingAccuracy || null;
+ this.timestamp = timestamp || new Date().getTime();
};
module.exports = CompassHeading;
@@ -1563,7 +1539,8 @@ module.exports = {
// file: lib/common/plugin/Contact.js
define("cordova/plugin/Contact", function(require, exports, module) {
-var exec = require('cordova/exec'),
+var argscheck = require('cordova/argscheck'),
+ exec = require('cordova/exec'),
ContactError = require('cordova/plugin/ContactError'),
utils = require('cordova/utils');
@@ -1648,7 +1625,8 @@ var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, a
* @param errorCB error callback
*/
Contact.prototype.remove = function(successCB, errorCB) {
- var fail = function(code) {
+ argscheck.checkArgs('FF', 'Contact.remove', arguments);
+ var fail = errorCB && function(code) {
errorCB(new ContactError(code));
};
if (this.id === null) {
@@ -1666,50 +1644,26 @@ Contact.prototype.remove = function(successCB, errorCB) {
*/
Contact.prototype.clone = function() {
var clonedContact = utils.clone(this);
- var i;
clonedContact.id = null;
clonedContact.rawId = null;
- // Loop through and clear out any id's in phones, emails, etc.
- if (clonedContact.phoneNumbers) {
- for (i = 0; i < clonedContact.phoneNumbers.length; i++) {
- clonedContact.phoneNumbers[i].id = null;
- }
- }
- if (clonedContact.emails) {
- for (i = 0; i < clonedContact.emails.length; i++) {
- clonedContact.emails[i].id = null;
- }
- }
- if (clonedContact.addresses) {
- for (i = 0; i < clonedContact.addresses.length; i++) {
- clonedContact.addresses[i].id = null;
- }
- }
- if (clonedContact.ims) {
- for (i = 0; i < clonedContact.ims.length; i++) {
- clonedContact.ims[i].id = null;
- }
- }
- if (clonedContact.organizations) {
- for (i = 0; i < clonedContact.organizations.length; i++) {
- clonedContact.organizations[i].id = null;
- }
- }
- if (clonedContact.categories) {
- for (i = 0; i < clonedContact.categories.length; i++) {
- clonedContact.categories[i].id = null;
- }
- }
- if (clonedContact.photos) {
- for (i = 0; i < clonedContact.photos.length; i++) {
- clonedContact.photos[i].id = null;
- }
- }
- if (clonedContact.urls) {
- for (i = 0; i < clonedContact.urls.length; i++) {
- clonedContact.urls[i].id = null;
+
+ function nullIds(arr) {
+ if (arr) {
+ for (var i = 0; i < arr.length; ++i) {
+ arr[i].id = null;
+ }
}
}
+
+ // Loop through and clear out any id's in phones, emails, etc.
+ nullIds(clonedContact.phoneNumbers);
+ nullIds(clonedContact.emails);
+ nullIds(clonedContact.addresses);
+ nullIds(clonedContact.ims);
+ nullIds(clonedContact.organizations);
+ nullIds(clonedContact.categories);
+ nullIds(clonedContact.photos);
+ nullIds(clonedContact.urls);
return clonedContact;
};
@@ -1719,21 +1673,22 @@ Contact.prototype.clone = function() {
* @param errorCB error callback
*/
Contact.prototype.save = function(successCB, errorCB) {
- var fail = function(code) {
- errorCB(new ContactError(code));
- };
+ argscheck.checkArgs('FFO', 'Contact.save', arguments);
+ var fail = errorCB && function(code) {
+ errorCB(new ContactError(code));
+ };
var success = function(result) {
- if (result) {
- if (typeof successCB === 'function') {
- var fullContact = require('cordova/plugin/contacts').create(result);
- successCB(convertIn(fullContact));
- }
- }
- else {
- // no Entry object returned
- fail(ContactError.UNKNOWN_ERROR);
- }
- };
+ if (result) {
+ if (successCB) {
+ var fullContact = require('cordova/plugin/contacts').create(result);
+ successCB(convertIn(fullContact));
+ }
+ }
+ else {
+ // no Entry object returned
+ fail(ContactError.UNKNOWN_ERROR);
+ }
+ };
var dupContact = convertOut(utils.clone(this));
exec(success, fail, "Contacts", "save", [dupContact]);
};
@@ -1954,7 +1909,8 @@ module.exports = Coordinates;
// file: lib/common/plugin/DirectoryEntry.js
define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
-var utils = require('cordova/utils'),
+var argscheck = require('cordova/argscheck'),
+ utils = require('cordova/utils'),
exec = require('cordova/exec'),
Entry = require('cordova/plugin/Entry'),
FileError = require('cordova/plugin/FileError'),
@@ -1970,7 +1926,7 @@ var utils = require('cordova/utils'),
* TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly)
*/
var DirectoryEntry = function(name, fullPath) {
- DirectoryEntry.__super__.constructor.apply(this, [false, true, name, fullPath]);
+ DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath);
};
utils.extend(DirectoryEntry, Entry);
@@ -1991,11 +1947,12 @@ DirectoryEntry.prototype.createReader = function() {
* @param {Function} errorCallback is called with a FileError
*/
DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) {
- var win = typeof successCallback !== 'function' ? null : function(result) {
+ argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments);
+ var win = successCallback && function(result) {
var entry = new DirectoryEntry(result.name, result.fullPath);
successCallback(entry);
};
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
+ var fail = errorCallback && function(code) {
errorCallback(new FileError(code));
};
exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]);
@@ -2008,7 +1965,8 @@ DirectoryEntry.prototype.getDirectory = function(path, options, successCallback,
* @param {Function} errorCallback is called with a FileError
*/
DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) {
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
+ argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments);
+ var fail = errorCallback && function(code) {
errorCallback(new FileError(code));
};
exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]);
@@ -2023,12 +1981,13 @@ DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCall
* @param {Function} errorCallback is called with a FileError
*/
DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) {
- var win = typeof successCallback !== 'function' ? null : function(result) {
+ argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments);
+ var win = successCallback && function(result) {
var FileEntry = require('cordova/plugin/FileEntry');
var entry = new FileEntry(result.name, result.fullPath);
successCallback(entry);
};
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
+ var fail = errorCallback && function(code) {
errorCallback(new FileError(code));
};
exec(win, fail, "File", "getFile", [this.fullPath, path, options]);
@@ -2089,7 +2048,8 @@ module.exports = DirectoryReader;
// file: lib/common/plugin/Entry.js
define("cordova/plugin/Entry", function(require, exports, module) {
-var exec = require('cordova/exec'),
+var argscheck = require('cordova/argscheck'),
+ exec = require('cordova/exec'),
FileError = require('cordova/plugin/FileError'),
Metadata = require('cordova/plugin/Metadata');
@@ -2108,8 +2068,8 @@ var exec = require('cordova/exec'),
* (readonly)
*/
function Entry(isFile, isDirectory, name, fullPath, fileSystem) {
- this.isFile = (typeof isFile != 'undefined'?isFile:false);
- this.isDirectory = (typeof isDirectory != 'undefined'?isDirectory:false);
+ this.isFile = !!isFile;
+ this.isDirectory = !!isDirectory;
this.name = name || '';
this.fullPath = fullPath || '';
this.filesystem = fileSystem || null;
@@ -2124,15 +2084,16 @@ function Entry(isFile, isDirectory, name, fullPath, fileSystem) {
* {Function} is called with a FileError
*/
Entry.prototype.getMetadata = function(successCallback, errorCallback) {
- var success = typeof successCallback !== 'function' ? null : function(lastModified) {
- var metadata = new Metadata(lastModified);
- successCallback(metadata);
- };
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
- errorCallback(new FileError(code));
- };
+ argscheck.checkArgs('FF', 'Entry.getMetadata', arguments);
+ var success = successCallback && function(lastModified) {
+ var metadata = new Metadata(lastModified);
+ successCallback(metadata);
+ };
+ var fail = errorCallback && function(code) {
+ errorCallback(new FileError(code));
+ };
- exec(success, fail, "File", "getMetadata", [this.fullPath]);
+ exec(success, fail, "File", "getMetadata", [this.fullPath]);
};
/**
@@ -2146,8 +2107,8 @@ Entry.prototype.getMetadata = function(successCallback, errorCallback) {
* {Object} keys and values to set
*/
Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) {
-
- exec(successCallback, errorCallback, "File", "setMetadata", [this.fullPath, metadataObject]);
+ argscheck.checkArgs('FFO', 'Entry.setMetadata', arguments);
+ exec(successCallback, errorCallback, "File", "setMetadata", [this.fullPath, metadataObject]);
};
/**
@@ -2163,36 +2124,25 @@ Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataO
* {Function} called with a FileError
*/
Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) {
- var fail = function(code) {
- if (typeof errorCallback === 'function') {
- errorCallback(new FileError(code));
- }
+ argscheck.checkArgs('oSFF', 'Entry.moveTo', arguments);
+ var fail = errorCallback && function(code) {
+ errorCallback(new FileError(code));
};
- // user must specify parent Entry
- if (!parent) {
- fail(FileError.NOT_FOUND_ERR);
- return;
- }
// source path
var srcPath = this.fullPath,
// entry name
name = newName || this.name,
success = function(entry) {
if (entry) {
- if (typeof successCallback === 'function') {
+ if (successCallback) {
// create appropriate Entry object
var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
- try {
- successCallback(result);
- }
- catch (e) {
- console.log('Error invoking callback: ' + e);
- }
+ successCallback(result);
}
}
else {
// no Entry object returned
- fail(FileError.NOT_FOUND_ERR);
+ fail && fail(FileError.NOT_FOUND_ERR);
}
};
@@ -2213,18 +2163,11 @@ Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallbac
* {Function} called with a FileError
*/
Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) {
- var fail = function(code) {
- if (typeof errorCallback === 'function') {
- errorCallback(new FileError(code));
- }
+ argscheck.checkArgs('oSFF', 'Entry.copyTo', arguments);
+ var fail = errorCallback && function(code) {
+ errorCallback(new FileError(code));
};
- // user must specify parent Entry
- if (!parent) {
- fail(FileError.NOT_FOUND_ERR);
- return;
- }
-
// source path
var srcPath = this.fullPath,
// entry name
@@ -2232,20 +2175,15 @@ Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallbac
// success callback
success = function(entry) {
if (entry) {
- if (typeof successCallback === 'function') {
+ if (successCallback) {
// create appropriate Entry object
var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
- try {
- successCallback(result);
- }
- catch (e) {
- console.log('Error invoking callback: ' + e);
- }
+ successCallback(result);
}
}
else {
// no Entry object returned
- fail(FileError.NOT_FOUND_ERR);
+ fail && fail(FileError.NOT_FOUND_ERR);
}
};
@@ -2282,7 +2220,8 @@ Entry.prototype.toURI = function(mimeType) {
* @param errorCallback {Function} called with a FileError
*/
Entry.prototype.remove = function(successCallback, errorCallback) {
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
+ argscheck.checkArgs('FF', 'Entry.remove', arguments);
+ var fail = errorCallback && function(code) {
errorCallback(new FileError(code));
};
exec(successCallback, fail, "File", "remove", [this.fullPath]);
@@ -2295,12 +2234,13 @@ Entry.prototype.remove = function(successCallback, errorCallback) {
* @param errorCallback {Function} called with a FileError
*/
Entry.prototype.getParent = function(successCallback, errorCallback) {
- var win = typeof successCallback !== 'function' ? null : function(result) {
+ argscheck.checkArgs('FF', 'Entry.getParent', arguments);
+ var win = successCallback && function(result) {
var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
var entry = new DirectoryEntry(result.name, result.fullPath);
successCallback(entry);
};
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
+ var fail = errorCallback && function(code) {
errorCallback(new FileError(code));
};
exec(win, fail, "File", "getParent", [this.fullPath]);
@@ -2328,8 +2268,46 @@ var File = function(name, fullPath, type, lastModifiedDate, size){
this.type = type || null;
this.lastModifiedDate = lastModifiedDate || null;
this.size = size || 0;
+
+ // These store the absolute start and end for slicing the file.
+ this.start = 0;
+ this.end = this.size;
+};
+
+/**
+ * Returns a "slice" of the file. Since Cordova Files don't contain the actual
+ * content, this really returns a File with adjusted start and end.
+ * Slices of slices are supported.
+ * start {Number} The index at which to start the slice (inclusive).
+ * end {Number} The index at which to end the slice (exclusive).
+ */
+File.prototype.slice = function(start, end) {
+ var size = this.end - this.start;
+ var newStart = 0;
+ var newEnd = size;
+ if (arguments.length) {
+ if (start < 0) {
+ newStart = Math.max(size + start, 0);
+ } else {
+ newStart = Math.min(size, start);
+ }
+ }
+
+ if (arguments.length >= 2) {
+ if (end < 0) {
+ newEnd = Math.max(size + end, 0);
+ } else {
+ newEnd = Math.min(end, size);
+ }
+ }
+
+ var newFile = new File(this.name, this.fullPath, this.type, this.lastModifiedData, this.size);
+ newFile.start = this.start + newStart;
+ newFile.end = this.start + newEnd;
+ return newFile;
};
+
module.exports = File;
});
@@ -2370,13 +2348,9 @@ FileEntry.prototype.createWriter = function(successCallback, errorCallback) {
var writer = new FileWriter(filePointer);
if (writer.fileName === null || writer.fileName === "") {
- if (typeof errorCallback === "function") {
- errorCallback(new FileError(FileError.INVALID_STATE_ERR));
- }
+ errorCallback && errorCallback(new FileError(FileError.INVALID_STATE_ERR));
} else {
- if (typeof successCallback === "function") {
- successCallback(writer);
- }
+ successCallback && successCallback(writer);
}
}, errorCallback);
};
@@ -2388,11 +2362,11 @@ FileEntry.prototype.createWriter = function(successCallback, errorCallback) {
* @param {Function} errorCallback is called with a FileError
*/
FileEntry.prototype.file = function(successCallback, errorCallback) {
- var win = typeof successCallback !== 'function' ? null : function(f) {
+ var win = successCallback && function(f) {
var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size);
successCallback(file);
};
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
+ var fail = errorCallback && function(code) {
errorCallback(new FileError(code));
};
exec(win, fail, "File", "getFileMetadata", [this.fullPath]);
@@ -2438,8 +2412,11 @@ module.exports = FileError;
define("cordova/plugin/FileReader", function(require, exports, module) {
var exec = require('cordova/exec'),
+ utils = require('cordova/utils'),
+ File = require('cordova/plugin/File'),
FileError = require('cordova/plugin/FileError'),
- ProgressEvent = require('cordova/plugin/ProgressEvent');
+ ProgressEvent = require('cordova/plugin/ProgressEvent'),
+ origFileReader = this.FileReader;
/**
* This class reads the mobile device file system.
@@ -2450,23 +2427,11 @@ var exec = require('cordova/exec'),
* @constructor
*/
var FileReader = function() {
- this.fileName = "";
-
- this.readyState = 0; // FileReader.EMPTY
-
- // File data
- this.result = null;
-
- // Error
- this.error = null;
-
- // Event handlers
- this.onloadstart = null; // When the read starts.
- this.onprogress = null; // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total)
- this.onload = null; // When the read has successfully completed.
- this.onerror = null; // When the read has failed (see errors).
- this.onloadend = null; // When the request has completed (either in success or failure).
- this.onabort = null; // When the read has been aborted. For instance, by invoking the abort() method.
+ this._readyState = 0;
+ this._error = null;
+ this._result = null;
+ this._fileName = '';
+ this._realReader = origFileReader ? new origFileReader() : {};
};
// States
@@ -2474,17 +2439,70 @@ FileReader.EMPTY = 0;
FileReader.LOADING = 1;
FileReader.DONE = 2;
+utils.defineGetter(FileReader.prototype, 'readyState', function() {
+ return this._fileName ? this._readyState : this._realReader.readyState;
+});
+
+utils.defineGetter(FileReader.prototype, 'error', function() {
+ return this._fileName ? this._error: this._realReader.error;
+});
+
+utils.defineGetter(FileReader.prototype, 'result', function() {
+ return this._fileName ? this._result: this._realReader.result;
+});
+
+function defineEvent(eventName) {
+ utils.defineGetterSetter(FileReader.prototype, eventName, function() {
+ return this._realReader[eventName] || null;
+ }, function(value) {
+ this._realReader[eventName] = value;
+ });
+}
+defineEvent('onloadstart'); // When the read starts.
+defineEvent('onprogress'); // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total)
+defineEvent('onload'); // When the read has successfully completed.
+defineEvent('onerror'); // When the read has failed (see errors).
+defineEvent('onloadend'); // When the request has completed (either in success or failure).
+defineEvent('onabort'); // When the read has been aborted. For instance, by invoking the abort() method.
+
+function initRead(reader, file) {
+ // Already loading something
+ if (reader.readyState == FileReader.LOADING) {
+ throw new FileError(FileError.INVALID_STATE_ERR);
+ }
+
+ reader._result = null;
+ reader._error = null;
+ reader._readyState = FileReader.LOADING;
+
+ if (typeof file == 'string') {
+ // Deprecated in Cordova 2.4.
+ console.warning('Using a string argument with FileReader.readAs functions is deprecated.');
+ reader._fileName = file;
+ } else if (typeof file.fullPath == 'string') {
+ reader._fileName = file.fullPath;
+ } else {
+ reader._fileName = '';
+ return true;
+ }
+
+ reader.onloadstart && reader.onloadstart(new ProgressEvent("loadstart", {target:reader}));
+}
+
/**
* Abort reading file.
*/
FileReader.prototype.abort = function() {
- this.result = null;
+ if (origFileReader && !this._fileName) {
+ return this._realReader.abort();
+ }
+ this._result = null;
- if (this.readyState == FileReader.DONE || this.readyState == FileReader.EMPTY) {
+ if (this._readyState == FileReader.DONE || this._readyState == FileReader.EMPTY) {
return;
}
- this.readyState = FileReader.DONE;
+ this._readyState = FileReader.DONE;
// If abort callback
if (typeof this.onabort === 'function') {
@@ -2503,43 +2521,33 @@ FileReader.prototype.abort = function() {
* @param encoding [Optional] (see http://www.iana.org/assignments/character-sets)
*/
FileReader.prototype.readAsText = function(file, encoding) {
- // Figure out pathing
- this.fileName = '';
- if (typeof file.fullPath === 'undefined') {
- this.fileName = file;
- } else {
- this.fileName = file.fullPath;
- }
-
- // Already loading something
- if (this.readyState == FileReader.LOADING) {
- throw new FileError(FileError.INVALID_STATE_ERR);
- }
-
- // LOADING state
- this.readyState = FileReader.LOADING;
-
- // If loadstart callback
- if (typeof this.onloadstart === "function") {
- this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+ if (initRead(this, file)) {
+ return this._realReader.readAsText(file, encoding);
}
// Default encoding is UTF-8
var enc = encoding ? encoding : "UTF-8";
-
var me = this;
+ var execArgs = [this._fileName, enc];
+
+ // Maybe add slice parameters.
+ if (file.end < file.size) {
+ execArgs.push(file.start, file.end);
+ } else if (file.start > 0) {
+ execArgs.push(file.start);
+ }
// Read file
exec(
// Success callback
function(r) {
// If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
+ if (me._readyState === FileReader.DONE) {
return;
}
// Save result
- me.result = r;
+ me._result = r;
// If onload callback
if (typeof me.onload === "function") {
@@ -2547,7 +2555,7 @@ FileReader.prototype.readAsText = function(file, encoding) {
}
// DONE state
- me.readyState = FileReader.DONE;
+ me._readyState = FileReader.DONE;
// If onloadend callback
if (typeof me.onloadend === "function") {
@@ -2557,18 +2565,18 @@ FileReader.prototype.readAsText = function(file, encoding) {
// Error callback
function(e) {
// If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
+ if (me._readyState === FileReader.DONE) {
return;
}
// DONE state
- me.readyState = FileReader.DONE;
+ me._readyState = FileReader.DONE;
// null result
- me.result = null;
+ me._result = null;
// Save error
- me.error = new FileError(e);
+ me._error = new FileError(e);
// If onerror callback
if (typeof me.onerror === "function") {
@@ -2579,7 +2587,7 @@ FileReader.prototype.readAsText = function(file, encoding) {
if (typeof me.onloadend === "function") {
me.onloadend(new ProgressEvent("loadend", {target:me}));
}
- }, "File", "readAsText", [this.fileName, enc]);
+ }, "File", "readAsText", execArgs);
};
@@ -2591,42 +2599,34 @@ FileReader.prototype.readAsText = function(file, encoding) {
* @param file {File} File object containing file properties
*/
FileReader.prototype.readAsDataURL = function(file) {
- this.fileName = "";
- if (typeof file.fullPath === "undefined") {
- this.fileName = file;
- } else {
- this.fileName = file.fullPath;
+ if (initRead(this, file)) {
+ return this._realReader.readAsDataURL(file);
}
- // Already loading something
- if (this.readyState == FileReader.LOADING) {
- throw new FileError(FileError.INVALID_STATE_ERR);
- }
-
- // LOADING state
- this.readyState = FileReader.LOADING;
+ var me = this;
+ var execArgs = [this._fileName];
- // If loadstart callback
- if (typeof this.onloadstart === "function") {
- this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+ // Maybe add slice parameters.
+ if (file.end < file.size) {
+ execArgs.push(file.start, file.end);
+ } else if (file.start > 0) {
+ execArgs.push(file.start);
}
- var me = this;
-
// Read file
exec(
// Success callback
function(r) {
// If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
+ if (me._readyState === FileReader.DONE) {
return;
}
// DONE state
- me.readyState = FileReader.DONE;
+ me._readyState = FileReader.DONE;
// Save result
- me.result = r;
+ me._result = r;
// If onload callback
if (typeof me.onload === "function") {
@@ -2641,17 +2641,17 @@ FileReader.prototype.readAsDataURL = function(file) {
// Error callback
function(e) {
// If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
+ if (me._readyState === FileReader.DONE) {
return;
}
// DONE state
- me.readyState = FileReader.DONE;
+ me._readyState = FileReader.DONE;
- me.result = null;
+ me._result = null;
// Save error
- me.error = new FileError(e);
+ me._error = new FileError(e);
// If onerror callback
if (typeof me.onerror === "function") {
@@ -2662,7 +2662,7 @@ FileReader.prototype.readAsDataURL = function(file) {
if (typeof me.onloadend === "function") {
me.onloadend(new ProgressEvent("loadend", {target:me}));
}
- }, "File", "readAsDataURL", [this.fileName]);
+ }, "File", "readAsDataURL", execArgs);
};
/**
@@ -2671,8 +2671,12 @@ FileReader.prototype.readAsDataURL = function(file) {
* @param file {File} File object containing file properties
*/
FileReader.prototype.readAsBinaryString = function(file) {
+ if (initRead(this, file)) {
+ return this._realReader.readAsBinaryString(file);
+ }
// TODO - Can't return binary data to browser.
console.log('method "readAsBinaryString" is not supported at this time.');
+ this.abort();
};
/**
@@ -2681,8 +2685,12 @@ FileReader.prototype.readAsBinaryString = function(file) {
* @param file {File} File object containing file properties
*/
FileReader.prototype.readAsArrayBuffer = function(file) {
+ if (initRead(this, file)) {
+ return this._realReader.readAsArrayBuffer(file);
+ }
// TODO - Can't return binary data to browser.
console.log('This method is not supported at this time.');
+ this.abort();
};
module.exports = FileReader;
@@ -2715,7 +2723,8 @@ module.exports = FileSystem;
// file: lib/common/plugin/FileTransfer.js
define("cordova/plugin/FileTransfer", function(require, exports, module) {
-var exec = require('cordova/exec'),
+var argscheck = require('cordova/argscheck'),
+ exec = require('cordova/exec'),
FileTransferError = require('cordova/plugin/FileTransferError'),
ProgressEvent = require('cordova/plugin/ProgressEvent');
@@ -2749,8 +2758,7 @@ var FileTransfer = function() {
* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
*/
FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
- // sanity parameter checking
- if (!filePath || !server) throw new Error("FileTransfer.upload requires filePath and server URL parameters at the minimum.");
+ argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments);
// check for options
var fileKey = null;
var fileName = null;
@@ -2774,7 +2782,7 @@ FileTransfer.prototype.upload = function(filePath, server, successCallback, erro
}
}
- var fail = function(e) {
+ var fail = errorCallback && function(e) {
var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
errorCallback(error);
};
@@ -2783,10 +2791,10 @@ FileTransfer.prototype.upload = function(filePath, server, successCallback, erro
var win = function(result) {
if (typeof result.lengthComputable != "undefined") {
if (self.onprogress) {
- return self.onprogress(newProgressEvent(result));
+ self.onprogress(newProgressEvent(result));
}
} else {
- return successCallback(result);
+ successCallback && successCallback(result);
}
};
exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id]);
@@ -2801,15 +2809,14 @@ FileTransfer.prototype.upload = function(filePath, server, successCallback, erro
* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
*/
FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts) {
- // sanity parameter checking
- if (!source || !target) throw new Error("FileTransfer.download requires source URI and target URI parameters at the minimum.");
+ argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments);
var self = this;
var win = function(result) {
if (typeof result.lengthComputable != "undefined") {
if (self.onprogress) {
return self.onprogress(newProgressEvent(result));
}
- } else {
+ } else if (successCallback) {
var entry = null;
if (result.isDirectory) {
entry = new (require('cordova/plugin/DirectoryEntry'))();
@@ -2825,7 +2832,7 @@ FileTransfer.prototype.download = function(source, target, successCallback, erro
}
};
- var fail = function(e) {
+ var fail = errorCallback && function(e) {
var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
errorCallback(error);
};
@@ -3221,55 +3228,48 @@ module.exports = GlobalizationError;
define("cordova/plugin/InAppBrowser", function(require, exports, module) {
var exec = require('cordova/exec');
+var channel = require('cordova/channel');
-function InAppBrowser()
-{
- var _channel = require('cordova/channel');
+function InAppBrowser() {
this.channels = {
- 'loadstart': _channel.create('loadstart'),
- 'loadstop' : _channel.create('loadstop'),
- 'exit' : _channel.create('exit')
+ 'loadstart': channel.create('loadstart'),
+ 'loadstop' : channel.create('loadstop'),
+ 'exit' : channel.create('exit')
};
}
-InAppBrowser.prototype._eventHandler = function(event)
-{
- if (event.type in this.channels) {
- this.channels[event.type].fire(event);
+InAppBrowser.prototype = {
+ _eventHandler: function (event) {
+ if (event.type in this.channels) {
+ this.channels[event.type].fire(event);
+ }
+ },
+ close: function (eventname) {
+ exec(null, null, "InAppBrowser", "close", []);
+ },
+ addEventListener: function (eventname,f) {
+ if (eventname in this.channels) {
+ this.channels[eventname].subscribe(f);
+ }
+ },
+ removeEventListener: function(eventname, f) {
+ if (eventname in this.channels) {
+ this.channels[eventname].unsubscribe(f);
+ }
}
-}
+};
-InAppBrowser.open = function(strUrl, strWindowName, strWindowFeatures)
-{
+module.exports = function(strUrl, strWindowName, strWindowFeatures) {
var iab = new InAppBrowser();
var cb = function(eventname) {
iab._eventHandler(eventname);
- }
+ };
exec(cb, null, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]);
return iab;
-}
-
-InAppBrowser.prototype.close = function(eventname, f)
-{
- exec(null, null, "InAppBrowser", "close", []);
-}
-
-InAppBrowser.prototype.addEventListener = function(eventname, f)
-{
- if (eventname in this.channels) {
- this.channels[eventname].subscribe(f);
- }
-}
-
-InAppBrowser.prototype.removeEventListener = function(eventname, f)
-{
- if (eventname in this.channels) {
- this.channels[eventname].unsubscribe(f);
- }
-}
-
-module.exports = InAppBrowser.open;
+};
+//Export the original open so it can be used if needed
+module.exports._orig = window.open;
});
@@ -3295,7 +3295,8 @@ module.exports = LocalFileSystem;
// file: lib/common/plugin/Media.js
define("cordova/plugin/Media", function(require, exports, module) {
-var utils = require('cordova/utils'),
+var argscheck = require('cordova/argscheck'),
+ utils = require('cordova/utils'),
exec = require('cordova/exec');
var mediaObjects = {};
@@ -3313,25 +3314,7 @@ var mediaObjects = {};
* statusCallback(int statusCode) - OPTIONAL
*/
var Media = function(src, successCallback, errorCallback, statusCallback) {
-
- // successCallback optional
- if (successCallback && (typeof successCallback !== "function")) {
- console.log("Media Error: successCallback is not a function");
- return;
- }
-
- // errorCallback optional
- if (errorCallback && (typeof errorCallback !== "function")) {
- console.log("Media Error: errorCallback is not a function");
- return;
- }
-
- // statusCallback optional
- if (statusCallback && (typeof statusCallback !== "function")) {
- console.log("Media Error: statusCallback is not a function");
- return;
- }
-
+ argscheck.checkArgs('SFFF', 'Media', arguments);
this.id = utils.createUUID();
mediaObjects[this.id] = this;
this.src = src;
@@ -3475,12 +3458,12 @@ Media.onStatus = function(id, msgType, value) {
media._position = Number(value);
break;
default :
- console && console.error && console.error("Unhandled Media.onStatus :: " + msgType);
+ console.error && console.error("Unhandled Media.onStatus :: " + msgType);
break;
}
}
else {
- console && console.error && console.error("Received Media.onStatus callback for unknown media :: " + id);
+ console.error && console.error("Received Media.onStatus callback for unknown media :: " + id);
}
};
@@ -5043,99 +5026,6 @@ module.exports = {
});
-// file: lib/ios/plugin/ios/FileReader.js
-define("cordova/plugin/ios/FileReader", function(require, exports, module) {
-
-var exec = require('cordova/exec'),
- FileError = require('cordova/plugin/FileError'),
- FileReader = require('cordova/plugin/FileReader'),
- ProgressEvent = require('cordova/plugin/ProgressEvent');
-
-module.exports = {
- readAsText:function(file, encoding) {
- // Figure out pathing
- this.fileName = '';
- if (typeof file.fullPath === 'undefined') {
- this.fileName = file;
- } else {
- this.fileName = file.fullPath;
- }
-
- // Already loading something
- if (this.readyState == FileReader.LOADING) {
- throw new FileError(FileError.INVALID_STATE_ERR);
- }
-
- // LOADING state
- this.readyState = FileReader.LOADING;
-
- // If loadstart callback
- if (typeof this.onloadstart === "function") {
- this.onloadstart(new ProgressEvent("loadstart", {target:this}));
- }
-
- // Default encoding is UTF-8
- var enc = encoding ? encoding : "UTF-8";
-
- var me = this;
-
- // Read file
- exec(
- // Success callback
- function(r) {
- // If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
- return;
- }
-
- // Save result
- me.result = decodeURIComponent(r);
-
- // If onload callback
- if (typeof me.onload === "function") {
- me.onload(new ProgressEvent("load", {target:me}));
- }
-
- // DONE state
- me.readyState = FileReader.DONE;
-
- // If onloadend callback
- if (typeof me.onloadend === "function") {
- me.onloadend(new ProgressEvent("loadend", {target:me}));
- }
- },
- // Error callback
- function(e) {
- // If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
- return;
- }
-
- // DONE state
- me.readyState = FileReader.DONE;
-
- // null result
- me.result = null;
-
- // Save error
- me.error = new FileError(e);
-
- // If onerror callback
- if (typeof me.onerror === "function") {
- me.onerror(new ProgressEvent("error", {target:me}));
- }
-
- // If onloadend callback
- if (typeof me.onloadend === "function") {
- me.onloadend(new ProgressEvent("loadend", {target:me}));
- }
- },
- "File", "readAsText", [this.fileName, enc]);
- }
-};
-
-});
-
// file: lib/ios/plugin/ios/console.js
define("cordova/plugin/ios/console", function(require, exports, module) {
@@ -5745,16 +5635,28 @@ define("cordova/utils", function(require, exports, module) {
var utils = exports;
/**
- * Defines a property getter for obj[key].
+ * Defines a property getter / setter for obj[key].
*/
-utils.defineGetter = function(obj, key, func) {
+utils.defineGetterSetter = function(obj, key, getFunc, opt_setFunc) {
if (Object.defineProperty) {
- Object.defineProperty(obj, key, { get: func });
+ var desc = {get:getFunc};
+ if (opt_setFunc) {
+ desc.set = opt_setFunc;
+ }
+ Object.defineProperty(obj, key, desc);
} else {
- obj.__defineGetter__(key, func);
+ obj.__defineGetter__(key, getFunc);
+ if (opt_setFunc) {
+ obj.__defineSetter__(key, opt_setFunc);
+ }
}
};
+/**
+ * Defines a property getter for obj[key].
+ */
+utils.defineGetter = utils.defineGetterSetter;
+
utils.arrayIndexOf = function(a, item) {
if (a.indexOf) {
return a.indexOf(item);
@@ -5779,18 +5681,22 @@ utils.arrayRemove = function(a, item) {
return index != -1;
};
+utils.typeName = function(val) {
+ return Object.prototype.toString.call(val).slice(8, -1);
+};
+
/**
* Returns an indication of whether the argument is an array or not
*/
utils.isArray = function(a) {
- return Object.prototype.toString.call(a) == '[object Array]';
+ return utils.typeName(a) == 'Array';
};
/**
* Returns an indication of whether the argument is a Date or not
*/
utils.isDate = function(d) {
- return Object.prototype.toString.call(d) == '[object Date]';
+ return utils.typeName(d) == 'Date';
};
/**
@@ -5975,7 +5881,7 @@ window.cordova = require('cordova');
// Replace navigator before any modules are required(), to ensure it happens as soon as possible.
// We replace it so that properties that can't be clobbered can instead be overridden.
if (context.navigator) {
- function CordovaNavigator() {}
+ var CordovaNavigator = function() {};
CordovaNavigator.prototype = context.navigator;
context.navigator = new CordovaNavigator();
}