2 * Create a blob builder even when vendor prefixes exist
\r
5 var BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder :
\r
6 typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder :
\r
7 typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder :
\r
8 typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder :
\r
12 * Check if Blob constructor is supported
\r
15 var blobSupported = (function() {
\r
17 var a = new Blob(['hi']);
\r
18 return a.size === 2;
\r
25 * Check if Blob constructor supports ArrayBufferViews
\r
26 * Fails in Safari 6, so we need to map to ArrayBuffers there.
\r
29 var blobSupportsArrayBufferView = blobSupported && (function() {
\r
31 var b = new Blob([new Uint8Array([1,2])]);
\r
32 return b.size === 2;
\r
39 * Check if BlobBuilder is supported
\r
42 var blobBuilderSupported = BlobBuilder
\r
43 && BlobBuilder.prototype.append
\r
44 && BlobBuilder.prototype.getBlob;
\r
47 * Helper function that maps ArrayBufferViews to ArrayBuffers
\r
48 * Used by BlobBuilder constructor and old browsers that didn't
\r
49 * support it in the Blob constructor.
\r
52 function mapArrayBufferViews(ary) {
\r
53 return ary.map(function(chunk) {
\r
54 if (chunk.buffer instanceof ArrayBuffer) {
\r
55 var buf = chunk.buffer;
\r
57 // if this is a subarray, make a copy so we only
\r
58 // include the subarray region from the underlying buffer
\r
59 if (chunk.byteLength !== buf.byteLength) {
\r
60 var copy = new Uint8Array(chunk.byteLength);
\r
61 copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));
\r
72 function BlobBuilderConstructor(ary, options) {
\r
73 options = options || {};
\r
75 var bb = new BlobBuilder();
\r
76 mapArrayBufferViews(ary).forEach(function(part) {
\r
80 return (options.type) ? bb.getBlob(options.type) : bb.getBlob();
\r
83 function BlobConstructor(ary, options) {
\r
84 return new Blob(mapArrayBufferViews(ary), options || {});
\r
87 if (typeof Blob !== 'undefined') {
\r
88 BlobBuilderConstructor.prototype = Blob.prototype;
\r
89 BlobConstructor.prototype = Blob.prototype;
\r
92 module.exports = (function() {
\r
93 if (blobSupported) {
\r
94 return blobSupportsArrayBufferView ? Blob : BlobConstructor;
\r
95 } else if (blobBuilderSupported) {
\r
96 return BlobBuilderConstructor;
\r