diff --git a/.zuul.yml b/.zuul.yml index 38bc342e..fb9da14d 100644 --- a/.zuul.yml +++ b/.zuul.yml @@ -14,3 +14,5 @@ browsers: version: [6..9, latest] - name: iphone version: oldest..latest + - name: android + version: latest diff --git a/lib/browser.js b/lib/browser.js index 6c3c16b7..95cb94b3 100644 --- a/lib/browser.js +++ b/lib/browser.js @@ -7,6 +7,15 @@ var sliceBuffer = require('arraybuffer.slice'); var base64encoder = require('base64-arraybuffer'); var after = require('after'); +/** + * Check if we are running an android browser. That requires us to use + * ArrayBuffer with polling transports... + * + * http://ghinda.net/jpeg-blob-ajax-android/ + */ + +var isAndroid = navigator.userAgent.match(/Android/i); + /** * Current protocol version. */ @@ -69,7 +78,7 @@ exports.encodePacket = function (packet, supportsBinary, callback) { if (global.ArrayBuffer && data instanceof ArrayBuffer) { return encodeArrayBuffer(packet, supportsBinary, callback); - } else if (Blob && data instanceof Blob) { + } else if (Blob && data instanceof global.Blob) { return encodeBlob(packet, supportsBinary, callback); } @@ -124,6 +133,10 @@ function encodeBlob(packet, supportsBinary, callback) { return exports.encodeBase64Packet(packet, callback); } + if (isAndroid) { + return encodeBlobAsArrayBuffer(packet, supportsBinary, callback); + } + var length = new Uint8Array(1); length[0] = packets[packet.type]; var blob = new Blob([length.buffer, packet.data]); @@ -246,9 +259,10 @@ exports.encodePayload = function (packets, supportsBinary, callback) { } if (supportsBinary) { - if (Blob) { + if (Blob && !isAndroid) { return exports.encodePayloadAsBlob(packets, callback); } + return exports.encodePayloadAsArrayBuffer(packets, callback); }