welsonjs/node_modules/modernizr/feature-detects/flash.js

120 lines
3.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*!
{
"name": "Flash",
"property": "flash",
"tags": ["flash"],
"polyfills": ["shumway"]
}
!*/
/* DOC
Detects Flash support as well as Flash-blocking plugins
*/
define(['Modernizr', 'createElement', 'docElement', 'addTest', 'getBody', 'isSVG'], function(Modernizr, createElement, docElement, addTest, getBody, isSVG) {
Modernizr.addAsyncTest(function() {
var attachBody = function(body) {
if (!docElement.contains(body)) {
docElement.appendChild(body);
}
};
var removeFakeBody = function(body) {
// If were rockin an attached fake body, clean it up
if (body.fake && body.parentNode) {
body.parentNode.removeChild(body);
}
};
var runTest = function(result, embed) {
var bool = !!result;
if (bool) {
bool = new Boolean(bool);
bool.blocked = (result === 'blocked');
}
addTest('flash', function() { return bool; });
if (embed && body.contains(embed)) {
// in case embed has been wrapped, as with ClickToPlugin
while (embed.parentNode !== body) {
embed = embed.parentNode;
}
body.removeChild(embed);
}
};
var easy_detect;
var activex;
// we wrap activex in a try/catch because when Flash is disabled through
// ActiveX controls, it throws an error.
try {
// Pan is an API that exists for Flash objects.
activex = 'ActiveXObject' in window && 'Pan' in new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash');
} catch (e) {}
easy_detect = !(('plugins' in navigator && 'Shockwave Flash' in navigator.plugins) || activex);
if (easy_detect || isSVG) {
runTest(false);
}
else {
// Flash seems to be installed, but it might be blocked. We have to
// actually create an element to see what happens to it.
var embed = createElement('embed');
var body = getBody();
var blockedDetect;
var inline_style;
embed.type = 'application/x-shockwave-flash';
// Need to do this in the body (fake or otherwise) otherwise IE8 complains
body.appendChild(embed);
// Pan doesn't exist in the embed if its IE (its on the ActiveXObject)
// so this check is for all other browsers.
if (!('Pan' in embed) && !activex) {
attachBody(body);
runTest('blocked', embed);
removeFakeBody(body);
return;
}
blockedDetect = function() {
// if we used a fake body originally, we need to restart this test, since
// we haven't been attached to the DOM, and therefore none of the blockers
// have had time to work.
attachBody(body);
if (!docElement.contains(body)) {
body = document.body || body;
embed = createElement('embed');
embed.type = 'application/x-shockwave-flash';
body.appendChild(embed);
return setTimeout(blockedDetect, 1000);
}
if (!docElement.contains(embed)) {
runTest('blocked');
}
else {
inline_style = embed.style.cssText;
if (inline_style !== '') {
// the style of the element has changed automatically. This is a
// really poor heuristic, but for lower end Flash blocks, it the
// only change they can make.
runTest('blocked', embed);
}
else {
runTest(true, embed);
}
}
removeFakeBody(body);
};
// If we have got this far, there is still a chance a userland plugin
// is blocking us (either changing the styles, or automatically removing
// the element). Both of these require us to take a step back for a moment
// to allow for them to get time of the thread, hence a setTimeout.
//
setTimeout(blockedDetect, 10);
}
});
});