welsonjs/node_modules/modernizr/feature-detects/workers/transferables.js

73 lines
1.9 KiB
JavaScript

/*!
{
"name": "Transferables Objects",
"property": "transferables",
"tags": ["performance", "workers"],
"builderAliases": ["transferables"],
"notes": [{
"name": "Transferable Objects: Lightning Fast!",
"href": "https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast"
}],
"async": true
}
!*/
/* DOC
Detects whether web workers can use `transferables` objects.
*/
define(['Modernizr', 'addTest', 'test/blob', 'test/url/bloburls', 'test/workers/webworkers', 'test/typed-arrays'], function(Modernizr, addTest) {
Modernizr.addAsyncTest(function() {
var prerequisites = !!(Modernizr.blobconstructor &&
Modernizr.bloburls &&
Modernizr.webworkers &&
Modernizr.typedarrays);
// Early exit
if (!prerequisites) {
return addTest('transferables', false);
}
// Proper test if prerequisites are met
try {
var buffer,
scriptText = 'var hello = "world"',
blob = new Blob([scriptText], {type: 'text/javascript'}),
url = URL.createObjectURL(blob),
worker = new Worker(url),
timeout;
// Just in case...
worker.onerror = fail;
timeout = setTimeout(fail, 200);
// Building an minimal array buffer to send to the worker
buffer = new ArrayBuffer(1);
// Sending the buffer to the worker
worker.postMessage(buffer, [buffer]);
// If length of buffer is now 0, transferables are working
addTest('transferables', buffer.byteLength === 0);
cleanup();
} catch (e) {
fail();
}
function fail() {
addTest('transferables', false);
cleanup();
}
function cleanup() {
if (url) {
URL.revokeObjectURL(url);
}
if (worker) {
worker.terminate();
}
if (timeout) {
clearTimeout(timeout);
}
}
});
});