Add support for Blob constructor in blobworkers test since BlobBuilder is deprecated and has been removed from firefox

whitespace change

fix cleanup for blobworker; ensure worker termination, ensure url revocation, and ensure addTest is only called once.

style fixes.

factor out cleanup & fail functions
This commit is contained in:
Chris Agerton
2013-12-06 15:22:36 -08:00
parent 61e72d2408
commit 456b648cf8

View File

@@ -25,36 +25,57 @@ define(['Modernizr', 'addTest'], function( Modernizr, addTest ) {
// these guys are notoriously peculiar.
var BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder || window.MSBlobBuilder || window.OBlobBuilder || window.BlobBuilder;
var URL = window.MozURL || window.webkitURL || window.MSURL || window.OURL || window.URL;
var data = 'Modernizr';
var bb = new BlobBuilder();
var data = 'Modernizr',
blob,
bb,
worker,
url,
timeout,
scriptText = 'this.onmessage=function(e){postMessage(e.data)}';
bb.append('this.onmessage=function(e){postMessage(e.data)}');
try {
blob = new Blob([scriptText], {type:'text/javascript'});
} catch(e) {
// we'll fall back to the deprecated BlobBuilder
}
if (!blob) {
bb = new BlobBuilder();
bb.append(scriptText);
blob = bb.getBlob();
}
var url = URL.createObjectURL(bb.getBlob());
var worker = new Worker(url);
bb = null;
url = URL.createObjectURL(blob);
worker = new Worker(url);
worker.onmessage = function(e) {
worker.terminate();
URL.revokeObjectURL(url);
addTest('blobworkers', data === e.data);
worker = null;
cleanup();
};
// Just in case...
worker.onerror = function() {
addTest('blobworkers', false);
worker = null;
};
setTimeout(function() {
addTest('blobworkers', false);
}, 200);
worker.onerror = fail;
timeout = setTimeout(fail, 200);
worker.postMessage(data);
} catch (e) {
fail();
}
function fail() {
addTest('blobworkers', false);
cleanup();
}
function cleanup() {
if (url) {
URL.revokeObjectURL(url);
}
if (worker) {
worker.terminate();
}
if (timeout) {
clearTimeout(timeout);
}
}
});
});