diff --git a/jszip.js b/jszip.js index f609aceb..f2282220 100644 --- a/jszip.js +++ b/jszip.js @@ -1120,12 +1120,36 @@ JSZip.support = { var chunk = 65536; var result = [], len = array.length, type = JSZip.utils.getTypeOf(array), k = 0; + var canUseApply = true; + try { + switch(type) { + case "uint8array": + String.fromCharCode.apply(null, new Uint8Array(0)); + break; + case "nodebuffer": + String.fromCharCode.apply(null, new Buffer(0)); + break; + } + } catch(e) { + canUseApply = false; + } + + // no apply : slow and painful algorithm + // default browser on android 4.* + if (!canUseApply) { + var resultStr = ""; + for(var i = 0; i < array.length;i++) { + resultStr += String.fromCharCode(array[i]); + } + return resultStr; + } + while (k < len && chunk > 1) { try { if (type === "array" || type === "nodebuffer") { - result.push(String.fromCharCode.apply(null, array.slice(k, Math.max(k + chunk, len)))); + result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len)))); } else { - result.push(String.fromCharCode.apply(null, array.subarray(k, k + chunk))); + result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len)))); } k += chunk; } catch (e) { diff --git a/test/test.js b/test/test.js index 31268690..2424e121 100644 --- a/test/test.js +++ b/test/test.js @@ -446,7 +446,7 @@ var _actualTestFileDataGetters = { if (JSZip.support.arraybuffer) { var buffer = opts.zip.file("file.txt").asArrayBuffer(); ok(buffer instanceof ArrayBuffer, opts.name + " : the result is a instance of ArrayBuffer"); - var actual = String.fromCharCode.apply(null, new Uint8Array(buffer)); + var actual = JSZip.utils.transformTo("string", buffer); equal(actual, opts.rawData, opts.name + " : asArrayBuffer()"); } else { try { @@ -461,7 +461,7 @@ var _actualTestFileDataGetters = { if (JSZip.support.uint8array) { var bufferView = opts.zip.file("file.txt").asUint8Array(); ok(bufferView instanceof Uint8Array, opts.name + " : the result is a instance of Uint8Array"); - var actual = String.fromCharCode.apply(null, bufferView); + var actual = JSZip.utils.transformTo("string", bufferView); equal(actual, opts.rawData, opts.name + " : asUint8Array()"); } else { try { @@ -476,7 +476,7 @@ var _actualTestFileDataGetters = { if (JSZip.support.nodebuffer) { var buffer = opts.zip.file("file.txt").asNodeBuffer(); ok(buffer instanceof Buffer, opts.name + " : the result is a instance of Buffer"); - var actual = String.fromCharCode.apply(null, buffer); + var actual = JSZip.utils.transformTo("string", buffer); equal(actual, opts.rawData, opts.name + " : .asNodeBuffer()"); } else { try { @@ -665,7 +665,7 @@ if (JSZip.support.uint8array) { ok(array instanceof Uint8Array, "The result is a instance of Uint8Array"); equal(array.length, expected.length); - var actual = String.fromCharCode.apply(null, array); + var actual = JSZip.utils.transformTo("string", array); ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP"); }); @@ -689,7 +689,7 @@ if (JSZip.support.arraybuffer) { var buffer = zip.generate({type:"arraybuffer"}); ok(buffer instanceof ArrayBuffer, "The result is a instance of ArrayBuffer"); - var actual = String.fromCharCode.apply(null, new Uint8Array(buffer)); + var actual = JSZip.utils.transformTo("string", buffer); ok(similar(actual, expected, 18) , "Generated ZIP matches reference ZIP"); });