welsonjs/node_modules/modernizr/feature-detects/audio/autoplay.js

84 lines
2.6 KiB
JavaScript

/*!
{
"name": "Audio Autoplay",
"property": "audioautoplay",
"authors": ["Jordy van Dortmont"],
"tags": ["audio"],
"async": true
}
!*/
/* DOC
Checks for support of the autoplay attribute of the audio element.
*/
define(['Modernizr', 'addTest', 'docElement', 'createElement', 'test/audio'], function(Modernizr, addTest, docElement, createElement) {
Modernizr.addAsyncTest(function() {
var timeout;
var waitTime = 200;
var retries = 5;
var currentTry = 0;
var elem = createElement('audio');
var elemStyle = elem.style;
function testAutoplay(arg) {
currentTry++;
clearTimeout(timeout);
var result = arg && arg.type === 'playing' || elem.currentTime !== 0;
if (!result && currentTry < retries) {
// Detection can be flaky if the browser is slow, so lets retry in a little bit
timeout = setTimeout(testAutoplay, waitTime);
return;
}
elem.removeEventListener('playing', testAutoplay, false);
addTest('audioautoplay', result);
// Cleanup, but don't assume elem is still in the page -
// an extension may already have removed it.
if (elem.parentNode) {
elem.parentNode.removeChild(elem);
}
}
// Skip the test if audio itself, or the autoplay element on it isn't supported
if (!Modernizr.audio || !('autoplay' in elem)) {
addTest('audioautoplay', false);
return;
}
elemStyle.position = 'absolute';
elemStyle.height = 0;
elemStyle.width = 0;
try {
if (Modernizr.audio.mp3) {
elem.src = 'data:audio/mpeg;base64,/+MYxAAAAANIAUAAAASEEB/jwOFM/0MM/90b/+RhST//w4NFwOjf///PZu////9lns5GFDv//l9GlUIEEIAAAgIg8Ir/JGq3/+MYxDsLIj5QMYcoAP0dv9HIjUcH//yYSg+CIbkGP//8w0bLVjUP///3Z0x5QCAv/yLjwtGKTEFNRTMuOTeqqqqqqqqqqqqq/+MYxEkNmdJkUYc4AKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq';
}
else if (Modernizr.audio.wav) {
elem.src = 'data:audio/wav;base64,UklGRjQAAABXQVZFZm10IBAAAAABAAEAEAAAABAAAAABAAgAZGF0YRAAAAB/f39/f39/f39/f39/f39/';
}
else {
addTest('audioautoplay', false);
return;
}
}
catch (e) {
addTest('audioautoplay', false);
return;
}
elem.setAttribute('autoplay', '');
elemStyle.cssText = 'display:none';
docElement.appendChild(elem);
// Wait for the next tick to add the listener, otherwise the element may
// not have time to play in high load situations (e.g. the test suite)
setTimeout(function() {
elem.addEventListener('playing', testAutoplay, false);
timeout = setTimeout(testAutoplay, waitTime);
}, 0);
});
});