SlideShare a Scribd company logo
1 of 35
/*!
* Modernizr v2.0.6
* http://www.modernizr.com
*
* Copyright (c) 2009-2011 Faruk Ates, Paul Irish, Alex Sexton
* Dual-licensed under the BSD or MIT licenses:
www.modernizr.com/license/
*/
/*
* Modernizr tests which native CSS3 and HTML5 features are
available in
* the current UA and makes the results available to you in two
ways:
* as properties on a global Modernizr object, and as classes on
the
* element. This information allows you to progressively
enhance
* your pages with a granular level of control over the
experience.
*
* Modernizr has an optional (not included) conditional resource
loader
* called Modernizr.load(), based on Yepnope.js
(yepnopejs.com).
* To get a build that includes Modernizr.load(), as well as
choosing
* which tests to include, go to www.modernizr.com/download/
*
* Authors Faruk Ates, Paul Irish, Alex Sexton,
* Contributors Ryan Seddon, Ben Alman
*/
window.Modernizr = (function( window, document, undefined )
{
var version = '2.0.6',
Modernizr = {},
// option for enabling the HTML classes to be added
enableClasses = true,
docElement = document.documentElement,
docHead = document.head ||
document.getElementsByTagName('head')[0],
/**
* Create our "modernizr" element that we do most feature
tests on.
*/
mod = 'modernizr',
modElem = document.createElement(mod),
mStyle = modElem.style,
/**
* Create the input element for various Web Forms feature
tests.
*/
inputElem = document.createElement('input'),
smile = ':)',
toString = Object.prototype.toString,
// List of property values to set for css tests. See ticket #21
prefixes = ' -webkit- -moz- -o- -ms- -khtml- '.split(' '),
// Following spec is to expose vendor-specific style
properties as:
// elem.style.WebkitBorderRadius
// and the following would be incorrect:
// elem.style.webkitBorderRadius
// Webkit ghosts their properties in lowercase but Opera &
Moz do not.
// Microsoft foregoes prefixes entirely elements in IE6-9 are
considered 'NoScope' elements and therefore will be removed
// when injected with innerHTML. To get around this you
need to prepend the 'NoScope' element
// with a 'scoped' element, in our case the soft-hyphen entity
as it won't mess with our measurements.
// http://msdn.microsoft.com/en-
us/library/ms533897%28VS.85%29.aspx
style = ['-', ''].join('');
div.id = mod;
div.innerHTML += style;
docElement.appendChild(div);
ret = callback(div, rule);
div.parentNode.removeChild(div);
return !!ret;
},
// adapted from matchMedia polyfill
// by Scott Jehl and Paul Irish
// gist.github.com/786768
testMediaQuery = function( mq ) {
if ( window.matchMedia ) {
return matchMedia(mq).matches;
}
var bool;
injectElementWithStyles('@media ' + mq + ' { #' + mod + '
{ position: absolute; } }', function( node ) {
bool = (window.getComputedStyle ?
getComputedStyle(node, null) :
node.currentStyle)['position'] == 'absolute';
});
return bool;
},
/**
* isEventSupported determines if a given element supports
the given event
* function from
http://yura.thinkweb2.com/isEventSupported/
*/
isEventSupported = (function() {
var TAGNAMES = {
'select': 'input', 'change': 'input',
'submit': 'form', 'reset': 'form',
'error': 'img', 'load': 'img', 'abort': 'img'
};
function isEventSupported( eventName, element ) {
element = element ||
document.createElement(TAGNAMES[eventName] || 'div');
eventName = 'on' + eventName;
// When using `setAttribute`, IE skips "unload", WebKit
skips "unload" and "resize", whereas `in` "catches" those
var isSupported = eventName in element;
if ( !isSupported ) {
// If it has no `setAttribute` (i.e. doesn't implement Node
interface), try generic element
if ( !element.setAttribute ) {
element = document.createElement('div');
}
if ( element.setAttribute && element.removeAttribute ) {
element.setAttribute(eventName, '');
isSupported = is(element[eventName], 'function');
// If property was created, "remove it" (by setting value
to `undefined`)
if ( !is(element[eventName], undefined) ) {
element[eventName] = undefined;
}
element.removeAttribute(eventName);
}
}
element = null;
return isSupported;
}
return isEventSupported;
})();
// hasOwnProperty shim by kangax needed for Safari 2.0
support
var _hasOwnProperty = ({}).hasOwnProperty,
hasOwnProperty;
if ( !is(_hasOwnProperty, undefined) &&
!is(_hasOwnProperty.call, undefined) ) {
hasOwnProperty = function (object, property) {
return _hasOwnProperty.call(object, property);
};
}
else {
hasOwnProperty = function (object, property) { /* yes, this
can give false positives/negatives, but most of the time we don't
care about those */
return ((property in object) &&
is(object.constructor.prototype[property], undefined));
};
}
/**
* setCss applies given styles to the Modernizr DOM node.
*/
function setCss( str ) {
mStyle.cssText = str;
}
/**
* setCssAll extrapolates all vendor-specific css strings.
*/
function setCssAll( str1, str2 ) {
return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));
}
/**
* is returns a boolean for if typeof obj is exactly type.
*/
function is( obj, type ) {
return typeof obj === type;
}
/**
* contains returns a boolean for if substr is found within str.
*/
function contains( str, substr ) {
return !!~('' + str).indexOf(substr);
}
/**
* testProps is a generic CSS / DOM property test; if a
browser supports
* a certain property, it won't return undefined for it.
* A supported CSS property returns empty string when its
not yet set.
*/
function testProps( props, prefixed ) {
for ( var i in props ) {
if ( mStyle[ props[i] ] !== undefined ) {
return prefixed == 'pfx' ? props[i] : true;
}
}
return false;
}
/**
* testPropsAll tests a list of DOM properties we want to
check against.
* We specify literally ALL possible (known and/or likely)
properties on
* the element including the non-vendor prefixed one, for
forward-
* compatibility.
*/
function testPropsAll( prop, prefixed ) {
var ucProp = prop.charAt(0).toUpperCase() +
prop.substr(1),
props = (prop + ' ' + domPrefixes.join(ucProp + ' ') +
ucProp).split(' ');
return testProps(props, prefixed);
}
/**
* testBundle tests a list of CSS features that require element
and style injection.
* By bundling them together we can reduce the need to
touch the DOM multiple times.
*/
/*>>testBundle*/
var testBundle = (function( styles, tests ) {
var style = styles.join(''),
len = tests.length;
injectElementWithStyles(style, function( node, rule ) {
var style =
document.styleSheets[document.styleSheets.length - 1],
// IE8 will bork if you create a custom build that
excludes both fontface and generatedcontent tests.
// So we check for cssRules and that there is a rule
available
// More here:
https://github.com/Modernizr/Modernizr/issues/288 &
https://github.com/Modernizr/Modernizr/issues/293
cssText = style.cssRules && style.cssRules[0] ?
style.cssRules[0].cssText : style.cssText || "",
children = node.childNodes, hash = {};
while ( len-- ) {
hash[children[len].id] = children[len];
}
/*>>touch*/ Modernizr['touch'] = ('ontouchstart'
in window) || hash['touch'].offsetTop === 9; /*>>touch*/
/*>>csstransforms3d*/ Modernizr['csstransforms3d'] =
hash['csstransforms3d'].offsetLeft === 9;
/*>>csstransforms3d*/
/*>>generatedcontent*/Modernizr['generatedcontent'] =
hash['generatedcontent'].offsetHeight >= 1;
/*>>generatedcontent*/
/*>>fontface*/ Modernizr['fontface'] =
/src/i.test(cssText) &&
cssText.indexOf(rule.split(' ')[0]) === 0; /*>>fontface*/
}, len, tests);
})([
// Pass in styles to be injected into document
/*>>fontface*/ '@font-face {font-
family:"font";src:url("https://")}' /*>>fontface*/
/*>>touch*/ ,['@media (',prefixes.join('touch-
enabled),('),mod,')',
'{#touch{top:9px;position:absolute}}'].join('')
/*>>touch*/
/*>>csstransforms3d*/ ,['@media
(',prefixes.join('transform-3d),('),mod,')',
'{#csstransforms3d{left:9px;position:absolute}}'].join('')/*>>cs
stransforms3d*/
/*>>generatedcontent*/,['#generatedcontent:after{content:"',smi
le,'";visibility:hidden}'].join('') /*>>generatedcontent*/
],
[
/*>>fontface*/ 'fontface' /*>>fontface*/
/*>>touch*/ ,'touch' /*>>touch*/
/*>>csstransforms3d*/ ,'csstransforms3d'
/*>>csstransforms3d*/
/*>>generatedcontent*/,'generatedcontent'
/*>>generatedcontent*/
]);/*>>testBundle*/
/**
* Tests
* -----
*/
tests['flexbox'] = function() {
/**
* setPrefixedValueCSS sets the property of a specified
element
* adding vendor prefixes to the VALUE of the property.
* @param {Element} element
* @param {string} property The property name. This will
not be prefixed.
* @param {string} value The value of the property. This
WILL be prefixed.
* @param {string=} extra Additional CSS to append
unmodified to the end of
* the CSS string.
*/
function setPrefixedValueCSS( element, property, value,
extra ) {
property += ':';
element.style.cssText = (property + prefixes.join(value
+ ';' + property)).slice(0, -property.length) + (extra || '');
}
/**
* setPrefixedPropertyCSS sets the property of a specified
element
* adding vendor prefixes to the NAME of the property.
* @param {Element} element
* @param {string} property The property name. This
WILL be prefixed.
* @param {string} value The value of the property. This
will not be prefixed.
* @param {string=} extra Additional CSS to append
unmodified to the end of
* the CSS string.
*/
function setPrefixedPropertyCSS( element, property,
value, extra ) {
element.style.cssText = prefixes.join(property + ':' +
value + ';') + (extra || '');
}
var c = document.createElement('div'),
elem = document.createElement('div');
setPrefixedValueCSS(c, 'display', 'box',
'width:42px;padding:0;');
setPrefixedPropertyCSS(elem, 'box-flex', '1',
'width:10px;');
c.appendChild(elem);
docElement.appendChild(c);
var ret = elem.offsetWidth === 42;
c.removeChild(elem);
docElement.removeChild(c);
return ret;
};
// On the S60 and BB Storm, getContext exists, but always
returns undefined
// http://github.com/Modernizr/Modernizr/issues/issue/97/
tests['canvas'] = function() {
var elem = document.createElement('canvas');
return !!(elem.getContext && elem.getContext('2d'));
};
tests['canvastext'] = function() {
return !!(Modernizr['canvas'] &&
is(document.createElement('canvas').getContext('2d').fillText,
'function'));
};
// This WebGL test may false positive.
// But really it's quite impossible to know whether webgl will
succeed until after you create the context.
// You might have hardware that can support a 100x100
webgl canvas, but will not support a 1000x1000 webgl
// canvas. So this feature inference is weak, but intentionally
so.
// It is known to false positive in FF4 with certain hardware
and the iPad 2.
tests['webgl'] = function() {
return !!window.WebGLRenderingContext;
};
/*
* The Modernizr.touch test only indicates if the browser
supports
* touch events, which does not necessarily reflect a
touchscreen
* device, as evidenced by tablets running Windows 7 or,
alas,
* the Palm Pre / WebOS (touch) phones.
*
* Additionally, Chrome (desktop) used to lie about its
support on this,
* but that has since been rectified: http://crbug.com/36415
*
* We also test for Firefox 4 Multitouch Support.
*
* For more info, see:
http://modernizr.github.com/Modernizr/touch.html
*/
tests['touch'] = function() {
return Modernizr['touch'];
};
/**
* geolocation tests for the new Geolocation API
specification.
* This test is a standards compliant-only test; for more
complete
* testing, including a Google Gears fallback, please see:
* http://code.google.com/p/geo-location-javascript/
* or view a fallback solution using google's geo API:
* http://gist.github.com/366184
*/
tests['geolocation'] = function() {
return !!navigator.geolocation;
};
// Per 1.6:
// This used to be Modernizr.crosswindowmessaging but the
longer
// name has been deprecated in favor of a shorter and
property-matching one.
// The old API is still available in 1.6, but as of 2.0 will
throw a warning,
// and in the first release thereafter disappear entirely.
tests['postmessage'] = function() {
return !!window.postMessage;
};
// Web SQL database detection is tricky:
// In chrome incognito mode, openDatabase is truthy, but
using it will
// throw an exception: http://crbug.com/42380
// We can create a dummy database, but there is no way to
delete it afterwards.
// Meanwhile, Safari users can get prompted on any database
creation.
// If they do, any page with Modernizr will give them a
prompt:
//
http://github.com/Modernizr/Modernizr/issues/closed#issue/113
// We have chosen to allow the Chrome incognito false
positive, so that Modernizr
// doesn't litter the web with these test databases. As a
developer, you'll have
// to account for this gotcha yourself.
tests['websqldatabase'] = function() {
var result = !!window.openDatabase;
/* if (result){
try {
result = !!openDatabase( mod + "testdb", "1.0", mod +
"testdb", 2e4);
} catch(e) {
}
} */
return result;
};
// Vendors had inconsistent prefixing with the experimental
Indexed DB:
// - Webkit's implementation is accessible through
webkitIndexedDB
// - Firefox shipped moz_indexedDB before FF4b9, but since
then has been mozIndexedDB
// For speed, we don't test the legacy (and beta-only)
indexedDB
tests['indexedDB'] = function() {
for ( var i = -1, len = domPrefixes.length; ++i < len; ){
if ( window[domPrefixes[i].toLowerCase() + 'IndexedDB']
){
return true;
}
}
return !!window.indexedDB;
};
// documentMode logic from YUI to filter out IE8 Compat
Mode
// which false positives.
tests['hashchange'] = function() {
return isEventSupported('hashchange', window) &&
(document.documentMode === undefined ||
document.documentMode > 7);
};
// Per 1.6:
// This used to be Modernizr.historymanagement but the
longer
// name has been deprecated in favor of a shorter and
property-matching one.
// The old API is still available in 1.6, but as of 2.0 will
throw a warning,
// and in the first release thereafter disappear entirely.
tests['history'] = function() {
return !!(window.history && history.pushState);
};
tests['draganddrop'] = function() {
return isEventSupported('dragstart') &&
isEventSupported('drop');
};
// Mozilla is targeting to land MozWebSocket for FF6
// bugzil.la/659324
tests['websockets'] = function() {
for ( var i = -1, len = domPrefixes.length; ++i < len; ){
if ( window[domPrefixes[i] + 'WebSocket'] ){
return true;
}
}
return 'WebSocket' in window;
};
// http://css-tricks.com/rgba-browser-support/
tests['rgba'] = function() {
// Set an rgba() color and check the returned value
setCss('background-color:rgba(150,255,150,.5)');
return contains(mStyle.backgroundColor, 'rgba');
};
tests['hsla'] = function() {
// Same as rgba(), in fact, browsers re-map hsla() to rgba()
internally,
// except IE9 who retains it as hsla
setCss('background-color:hsla(120,40%,100%,.5)');
return contains(mStyle.backgroundColor, 'rgba') ||
contains(mStyle.backgroundColor, 'hsla');
};
tests['multiplebgs'] = function() {
// Setting multiple images AND a color on the background
shorthand property
// and then querying the style.background property value
for the number of
// occurrences of "url(" is a reliable method for detecting
ACTUAL support for this!
setCss('background:url(https://),url(https://),red
url(https://)');
// If the UA supports multiple backgrounds, there should
be three occurrences
// of the string "url(" in the return value for
elemStyle.background
return /(urls*(.*?){3}/.test(mStyle.background);
};
// In testing support for a given CSS property, it's legit to
test:
// `elem.style[styleName] !== undefined`
// If the property is supported it will return an empty string,
// if unsupported it will return undefined.
// We'll take advantage of this quick test and skip setting a
style
// on our modernizr element, but instead just testing
undefined vs
// empty string.
tests['backgroundsize'] = function() {
return testPropsAll('backgroundSize');
};
tests['borderimage'] = function() {
return testPropsAll('borderImage');
};
// Super comprehensive table about all the unique
implementations of
// border-radius: http://muddledramblings.com/table-of-css3-
border-radius-compliance
tests['borderradius'] = function() {
return testPropsAll('borderRadius');
};
// WebOS unfortunately false positives on this test.
tests['boxshadow'] = function() {
return testPropsAll('boxShadow');
};
// FF3.0 will false positive on this test
tests['textshadow'] = function() {
return document.createElement('div').style.textShadow
=== '';
};
tests['opacity'] = function() {
// Browsers that actually have CSS Opacity implemented
have done so
// according to spec, which means their return values are
within the
// range of [0.0,1.0] - including the leading zero.
setCssAll('opacity:.55');
// The non-literal . in this regex is intentional:
// German Chrome returns this value as 0,55
//
https://github.com/Modernizr/Modernizr/issues/#issue/59/comm
ent/516632
return /^0.55$/.test(mStyle.opacity);
};
tests['cssanimations'] = function() {
return testPropsAll('animationName');
};
tests['csscolumns'] = function() {
return testPropsAll('columnCount');
};
tests['cssgradients'] = function() {
/**
* For CSS Gradients syntax, please see:
* http://webkit.org/blog/175/introducing-css-gradients/
* https://developer.mozilla.org/en/CSS/-moz-linear-
gradient
* https://developer.mozilla.org/en/CSS/-moz-radial-
gradient
* http://dev.w3.org/csswg/css3-images/#gradients-
*/
var str1 = 'background-image:',
str2 = 'gradient(linear,left top,right
bottom,from(#9f9),to(white));',
str3 = 'linear-gradient(left top,#9f9, white);';
setCss(
(str1 + prefixes.join(str2 + str1) + prefixes.join(str3 +
str1)).slice(0, -str1.length)
);
return contains(mStyle.backgroundImage, 'gradient');
};
tests['cssreflections'] = function() {
return testPropsAll('boxReflect');
};
tests['csstransforms'] = function() {
return !!testProps(['transformProperty', 'WebkitTransform',
'MozTransform', 'OTransform', 'msTransform']);
};
tests['csstransforms3d'] = function() {
var ret = !!testProps(['perspectiveProperty',
'WebkitPerspective', 'MozPerspective', 'OPerspective',
'msPerspective']);
// Webkit’s 3D transforms are passed off to the
browser's own graphics renderer.
// It works fine in Safari on Leopard and Snow Leopard,
but not in Chrome in
// some conditions. As a result, Webkit typically
recognizes the syntax but
// will sometimes throw a false positive, thus we must do
a more thorough check:
if ( ret && 'webkitPerspective' in docElement.style ) {
// Webkit allows this media query to succeed only if the
feature is enabled.
// `@media (transform-3d),(-o-transform-3d),(-moz-
transform-3d),(-ms-transform-3d),(-webkit-transform-
3d),(modernizr){ ... }`
ret = Modernizr['csstransforms3d'];
}
return ret;
};
tests['csstransitions'] = function() {
return testPropsAll('transitionProperty');
};
/*>>fontface*/
// @font-face detection routine by Diego Perini
// http://javascript.nwbox.com/CSSSupport/
tests['fontface'] = function() {
return Modernizr['fontface'];
};
/*>>fontface*/
// CSS generated content detection
tests['generatedcontent'] = function() {
return Modernizr['generatedcontent'];
};
// These tests evaluate support of the video/audio elements,
as well as
// testing what types of content they support.
//
// We're using the Boolean constructor here, so that we can
extend the value
// e.g. Modernizr.video // true
// Modernizr.video.ogg // 'probably'
//
// Codec values from :
http://github.com/NielsLeenheer/html5test/blob/9106a8/index.ht
ml#L845
// thx to NielsLeenheer and zcorpan
// Note: in FF 3.5.1 and 3.5.0, "no" was a return value instead
of empty string.
// Modernizr does not normalize for that.
tests['video'] = function() {
var elem = document.createElement('video'),
bool = false;
// IE9 Running on Windows Server SKU can cause an
exception to be thrown, bug #224
try {
if ( bool = !!elem.canPlayType ) {
bool = new Boolean(bool);
bool.ogg = elem.canPlayType('video/ogg;
codecs="theora"');
// Workaround required for IE9, which doesn't report
video support without audio codec specified.
// bug 599718 @ msft connect
var h264 = 'video/mp4; codecs="avc1.42E01E';
bool.h264 = elem.canPlayType(h264 + '"') ||
elem.canPlayType(h264 + ', mp4a.40.2"');
bool.webm = elem.canPlayType('video/webm;
codecs="vp8, vorbis"');
}
} catch(e) { }
return bool;
};
tests['audio'] = function() {
var elem = document.createElement('audio'),
bool = false;
try {
if ( bool = !!elem.canPlayType ) {
bool = new Boolean(bool);
bool.ogg = elem.canPlayType('audio/ogg;
codecs="vorbis"');
bool.mp3 = elem.canPlayType('audio/mpeg;');
// Mimetypes accepted:
//
https://developer.mozilla.org/En/Media_formats_supported_by_
the_audio_and_video_elements
// http://bit.ly/iphoneoscodecs
bool.wav = elem.canPlayType('audio/wav;
codecs="1"');
bool.m4a = elem.canPlayType('audio/x-m4a;') ||
elem.canPlayType('audio/aac;');
}
} catch(e) { }
return bool;
};
// Firefox has made these tests rather unfun.
// In FF4, if disabled, window.localStorage should === null.
// Normally, we could not test that directly and need to do a
// `('localStorage' in window) && ` test first because
otherwise Firefox will
// throw http://bugzil.la/365772 if cookies are disabled
// However, in Firefox 4 betas, if dom.storage.enabled ==
false, just mentioning
// the property will throw an exception.
http://bugzil.la/599479
// This looks to be fixed for FF4 Final.
// Because we are forced to try/catch this, we'll go
aggressive.
// FWIW: IE8 Compat mode supports these features
completely:
// http://www.quirksmode.org/dom/html5.html
// But IE8 doesn't support either with local files
tests['localstorage'] = function() {
try {
return !!localStorage.getItem;
} catch(e) {
return false;
}
};
tests['sessionstorage'] = function() {
try {
return !!sessionStorage.getItem;
} catch(e){
return false;
}
};
tests['webworkers'] = function() {
return !!window.Worker;
};
tests['applicationcache'] = function() {
return !!window.applicationCache;
};
// Thanks to Erik Dahlstrom
tests['svg'] = function() {
return !!document.createElementNS &&
!!document.createElementNS(ns.svg, 'svg').createSVGRect;
};
// specifically for SVG inline in HTML, not within XHTML
// test page: paulirish.com/demo/inline-svg
tests['inlinesvg'] = function() {
var div = document.createElement('div');
div.innerHTML = '';
return (div.firstChild && div.firstChild.namespaceURI) ==
ns.svg;
};
// Thanks to F1lt3r and lucideer, ticket #35
tests['smil'] = function() {
return !!document.createElementNS &&
/SVG/.test(toString.call(document.createElementNS(ns.svg,
'animate')));
};
tests['svgclippaths'] = function() {
// Possibly returns a false positive in Safari 3.2?
return !!document.createElementNS &&
/SVG/.test(toString.call(document.createElementNS(ns.svg,
'clipPath')));
};
// input features and input types go directly onto the ret
object, bypassing the tests loop.
// Hold this guy to execute in a moment.
function webforms() {
// Run through HTML5's new input attributes to see if the
UA understands any.
// We're using f which is the element created early on
// Mike Taylr has created a comprehensive resource for
testing these attributes
// when applied to all input types:
// http://miketaylr.com/code/input-type-attr.html
// spec: http://www.whatwg.org/specs/web-apps/current-
work/multipage/the-input-element.html#input-type-attr-
summary
// Only input placeholder is tested while textarea's
placeholder is not.
// Currently Safari 4 and Opera 11 have support only for
the input placeholder
// Both tests are available in feature-detects/forms-
placeholder.js
Modernizr['input'] = (function( props ) {
for ( var i = 0, len = props.length; i < len; i++ ) {
attrs[ props[i] ] = !!(props[i] in inputElem);
}
return attrs;
})('autocomplete autofocus list placeholder max min
multiple pattern required step'.split(' '));
// Run through HTML5's new input types to see if the UA
understands any.
// This is put behind the tests runloop because it doesn't
return a
// true/false like all the other tests; instead, it returns an
object
// containing each input type with its corresponding
true/false value
// Big thanks to @miketaylr for the html5 forms expertise.
http://miketaylr.com/
Modernizr['inputtypes'] = (function(props) {
for ( var i = 0, bool, inputElemType, defaultView, len =
props.length; i < len; i++ ) {
inputElem.setAttribute('type', inputElemType =
props[i]);
bool = inputElem.type !== 'text';
// We first check to see if the type we give it sticks..
// If the type does, we feed it a textual value, which
shouldn't be valid.
// If the value doesn't stick, we know there's input
sanitization which infers a custom UI
if ( bool ) {
inputElem.value = smile;
inputElem.style.cssText =
'position:absolute;visibility:hidden;';
if ( /^range$/.test(inputElemType) &&
inputElem.style.WebkitAppearance !== undefined ) {
docElement.appendChild(inputElem);
defaultView = document.defaultView;
// Safari 2-4 allows the smiley as a value, despite
making a slider
bool = defaultView.getComputedStyle &&
defaultView.getComputedStyle(inputElem,
null).WebkitAppearance !== 'textfield' &&
// Mobile android web browser has false
positive, so must
// check the height to see if the widget is
actually there.
(inputElem.offsetHeight !== 0);
docElement.removeChild(inputElem);
} else if ( /^(search|tel)$/.test(inputElemType) ){
// Spec doesnt define any special parsing or
detectable UI
// behaviors so we pass these through as true
// Interestingly, opera fails the earlier test, so it
doesn't
// even make it here.
} else if ( /^(url|email)$/.test(inputElemType) ) {
// Real url and email support comes with
prebaked validation.
bool = inputElem.checkValidity &&
inputElem.checkValidity() === false;
} else if ( /^color$/.test(inputElemType) ) {
// chuck into DOM and force reflow for Opera
bug in 11.00
//
github.com/Modernizr/Modernizr/issues#issue/159
docElement.appendChild(inputElem);
docElement.offsetWidth;
bool = inputElem.value != smile;
docElement.removeChild(inputElem);
} else {
// If the upgraded input compontent rejects the :)
text, we got a winner
bool = inputElem.value != smile;
}
}
inputs[ props[i] ] = !!bool;
}
return inputs;
})('search tel url email datetime date month week time
datetime-local number range color'.split(' '));
}
// End of test definitions
// -----------------------
// Run through all tests and detect their support in the current
UA.
// todo: hypothetically we could be doing an array of tests
and use a basic loop here.
for ( var feature in tests ) {
if ( hasOwnProperty(tests, feature) ) {
// run the test, throw the return value into the
Modernizr,
// then based on that boolean, define an appropriate
className
// and push it into an array of classes we'll join later.
featureName = feature.toLowerCase();
Modernizr[featureName] = tests[feature]();
classes.push((Modernizr[featureName] ? '' : 'no-') +
featureName);
}
}
// input tests need to run.
Modernizr.input || webforms();
/**
* addTest allows the user to define their own feature tests
* the result will be added onto the Modernizr object,
* as well as an appropriate className set on the html
element
*
* @param feature - String naming the feature
* @param test - Function returning true if feature is
supported, false if not
*/
Modernizr.addTest = function ( feature, test ) {
if ( typeof feature == "object" ) {
for ( var key in feature ) {
if ( hasOwnProperty( feature, key ) ) {
Modernizr.addTest( key, feature[ key ] );
}
}
} else {
feature = feature.toLowerCase();
if ( Modernizr[feature] !== undefined ) {
// we're going to quit if you're trying to overwrite an
existing test
// if we were to allow it, we'd do this:
// var re = new RegExp("b(no-)?" + feature + "b");
// docElement.className =
docElement.className.replace( re, '' );
// but, no rly, stuff 'em.
return;
}
test = typeof test == "boolean" ? test : !!test();
docElement.className += ' ' + (test ? '' : 'no-') + feature;
Modernizr[feature] = test;
}
return Modernizr; // allow chaining.
};
// Reset modElem.cssText to nothing to reduce memory
footprint.
setCss('');
modElem = inputElem = null;
//>>BEGIN IEPP
// Enable HTML 5 elements for styling (and printing) in IE.
if ( window.attachEvent && (function(){ var elem =
document.createElement('div');
elem.innerHTML = '';
return elem.childNodes.length !==
1; })() ) {
// iepp v2 by @jon_neal & afarkas :
github.com/aFarkas/iepp/
(function(win, doc) {
win.iepp = win.iepp || {};
var iepp = win.iepp,
elems = iepp.html5elements ||
'abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|
footer|header|hgroup|mark|meter|nav|output|progress|section|su
mmary|time|video',
elemsArr = elems.split('|'),
elemsArrLen = elemsArr.length,
elemRegExp = new RegExp('(^|s)('+elems+')', 'gi'),
tagRegExp = new RegExp(' which is print-safe and
shouldn't conflict since it isn't part of html5
bodyElem.innerHTML =
body.innerHTML.replace(tagRegExp, '>END IEPP
// Assign private properties to the return object with prefix
Modernizr._version = version;
// expose these for the plugin API. Look in the source for
how to join() them against your input
Modernizr._prefixes = prefixes;
Modernizr._domPrefixes = domPrefixes;
// Modernizr.mq tests a given media query, live against the
current state of the window
// A few important notes:
// * If a browser does not support media queries at all (eg.
oldIE) the mq() will always return false
// * A max-width or orientation query will be evaluated
against the current state, which may change later.
// * You must specify values. Eg. If you are testing support
for the min-width media query use:
// Modernizr.mq('(min-width:0)')
// usage:
// Modernizr.mq('only screen and (max-width:768)')
Modernizr.mq = testMediaQuery;
// Modernizr.hasEvent() detects support for a given event,
with an optional element to test on
// Modernizr.hasEvent('gesturestart', elem)
Modernizr.hasEvent = isEventSupported;
// Modernizr.testProp() investigates whether a given style
property is recognized
// Note that the property names must be provided in the
camelCase variant.
// Modernizr.testProp('pointerEvents')
Modernizr.testProp = function(prop){
return testProps([prop]);
};
// Modernizr.testAllProps() investigates whether a given style
property,
// or any of its vendor-prefixed variants, is recognized
// Note that the property names must be provided in the
camelCase variant.
// Modernizr.testAllProps('boxSizing')
Modernizr.testAllProps = testPropsAll;
// Modernizr.testStyles() allows you to add custom styles to
the document and test an element afterwards
// Modernizr.testStyles('#modernizr { position:absolute }',
function(elem, rule){ ... })
Modernizr.testStyles = injectElementWithStyles;
// Modernizr.prefixed() returns the prefixed or nonprefixed
property name variant of your input
// Modernizr.prefixed('boxSizing') // 'MozBoxSizing'
// Properties must be passed as dom-style camelcase, rather
than `box-sizing` hypentated style.
// Return values will also be the camelCase variant, if you
need to translate that to hypenated style use:
//
// str.replace(/([A-Z])/g, function(str,m1){ return '-' +
m1.toLowerCase(); }).replace(/^ms-/,'-ms-');
// If you're trying to ascertain which transition end event to
bind to, you might do something like...
//
// var transEndEventNames = {
// 'WebkitTransition' : 'webkitTransitionEnd',
// 'MozTransition' : 'transitionend',
// 'OTransition' : 'oTransitionEnd',
// 'msTransition' : 'msTransitionEnd', // maybe?
// 'transition' : 'transitionEnd'
// },
// transEndEventName = transEndEventNames[
Modernizr.prefixed('transition') ];
Modernizr.prefixed = function(prop){
return testPropsAll(prop, 'pfx');
};
// Remove "no-js" class from element, if it exists:
docElement.className =
docElement.className.replace(/bno-jsb/, '')
// Add the new classes to the element.
+ (enableClasses ? ' js ' + classes.join(' ') :
'');
return Modernizr;
})(this, this.document);
!  Modernizr v2.0.6  httpwww.modernizr.com   Copyri.docx

More Related Content

Similar to ! Modernizr v2.0.6 httpwww.modernizr.com Copyri.docx

Protractor framework – how to make stable e2e tests for Angular applications
Protractor framework – how to make stable e2e tests for Angular applicationsProtractor framework – how to make stable e2e tests for Angular applications
Protractor framework – how to make stable e2e tests for Angular applicationsLudmila Nesvitiy
 
«От экспериментов с инфраструктурой до внедрения в продакшен»​
«От экспериментов с инфраструктурой до внедрения в продакшен»​«От экспериментов с инфраструктурой до внедрения в продакшен»​
«От экспериментов с инфраструктурой до внедрения в продакшен»​FDConf
 
От экспериментов с инфраструктурой до внедрения в продакшен
От экспериментов с инфраструктурой до внедрения в продакшенОт экспериментов с инфраструктурой до внедрения в продакшен
От экспериментов с инфраструктурой до внедрения в продакшенDmitry Makhnev
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012ghnash
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on AndroidSven Haiges
 
Big Data for each one of us
Big Data for each one of usBig Data for each one of us
Big Data for each one of usOSCON Byrum
 
the next web now
the next web nowthe next web now
the next web nowzulin Gu
 
Modern frontend development with VueJs
Modern frontend development with VueJsModern frontend development with VueJs
Modern frontend development with VueJsTudor Barbu
 
Node.js in action
Node.js in actionNode.js in action
Node.js in actionSimon Su
 
Charla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebCharla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebMikel Torres Ugarte
 
Learn D3.js in 90 minutes
Learn D3.js in 90 minutesLearn D3.js in 90 minutes
Learn D3.js in 90 minutesJos Dirksen
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyDavid Padbury
 
AngularJS Architecture
AngularJS ArchitectureAngularJS Architecture
AngularJS ArchitectureEyal Vardi
 
AngularJS Internal
AngularJS InternalAngularJS Internal
AngularJS InternalEyal Vardi
 
Building Reusable Custom Elements With Angular
Building Reusable Custom Elements With AngularBuilding Reusable Custom Elements With Angular
Building Reusable Custom Elements With AngularIlia Idakiev
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageabilityDaniel Fisher
 
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-Tsuyoshi Yamamoto
 

Similar to ! Modernizr v2.0.6 httpwww.modernizr.com Copyri.docx (20)

Protractor framework – how to make stable e2e tests for Angular applications
Protractor framework – how to make stable e2e tests for Angular applicationsProtractor framework – how to make stable e2e tests for Angular applications
Protractor framework – how to make stable e2e tests for Angular applications
 
«От экспериментов с инфраструктурой до внедрения в продакшен»​
«От экспериментов с инфраструктурой до внедрения в продакшен»​«От экспериментов с инфраструктурой до внедрения в продакшен»​
«От экспериментов с инфраструктурой до внедрения в продакшен»​
 
От экспериментов с инфраструктурой до внедрения в продакшен
От экспериментов с инфраструктурой до внедрения в продакшенОт экспериментов с инфраструктурой до внедрения в продакшен
От экспериментов с инфраструктурой до внедрения в продакшен
 
JavaScript Refactoring
JavaScript RefactoringJavaScript Refactoring
JavaScript Refactoring
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
 
Big Data for each one of us
Big Data for each one of usBig Data for each one of us
Big Data for each one of us
 
the next web now
the next web nowthe next web now
the next web now
 
Modern frontend development with VueJs
Modern frontend development with VueJsModern frontend development with VueJs
Modern frontend development with VueJs
 
Dartprogramming
DartprogrammingDartprogramming
Dartprogramming
 
Node.js in action
Node.js in actionNode.js in action
Node.js in action
 
Charla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebCharla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo Web
 
Learn D3.js in 90 minutes
Learn D3.js in 90 minutesLearn D3.js in 90 minutes
Learn D3.js in 90 minutes
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight Guy
 
AngularJS Architecture
AngularJS ArchitectureAngularJS Architecture
AngularJS Architecture
 
AngularJS Internal
AngularJS InternalAngularJS Internal
AngularJS Internal
 
Building Reusable Custom Elements With Angular
Building Reusable Custom Elements With AngularBuilding Reusable Custom Elements With Angular
Building Reusable Custom Elements With Angular
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
 
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
 
Play!ng with scala
Play!ng with scalaPlay!ng with scala
Play!ng with scala
 

More from MARRY7

Part 1.....InstructionsSelect one of the age groups disc.docx
Part 1.....InstructionsSelect one of the age groups disc.docxPart 1.....InstructionsSelect one of the age groups disc.docx
Part 1.....InstructionsSelect one of the age groups disc.docxMARRY7
 
Part 1 – Add to Website PlanList at least three .docx
Part 1 – Add to Website PlanList at least three .docxPart 1 – Add to Website PlanList at least three .docx
Part 1 – Add to Website PlanList at least three .docxMARRY7
 
Part 1 True or False Questions. (10 questions at 1 point each).docx
Part 1 True or False Questions. (10 questions at 1 point each).docxPart 1 True or False Questions. (10 questions at 1 point each).docx
Part 1 True or False Questions. (10 questions at 1 point each).docxMARRY7
 
Part 11. Why is it so important in system engineering to become .docx
Part 11. Why is it so important in system engineering to become .docxPart 11. Why is it so important in system engineering to become .docx
Part 11. Why is it so important in system engineering to become .docxMARRY7
 
Part 1 Using the internet, search for commercial IDPS systems. What.docx
Part 1 Using the internet, search for commercial IDPS systems. What.docxPart 1 Using the internet, search for commercial IDPS systems. What.docx
Part 1 Using the internet, search for commercial IDPS systems. What.docxMARRY7
 
Part 1- Create an outline of the assignment below thenPart 2-1000 .docx
Part 1- Create an outline of the assignment below thenPart 2-1000 .docxPart 1- Create an outline of the assignment below thenPart 2-1000 .docx
Part 1- Create an outline of the assignment below thenPart 2-1000 .docxMARRY7
 
Part 1 Review QuestionsWhat is the difference between criminal la.docx
Part 1 Review QuestionsWhat is the difference between criminal la.docxPart 1 Review QuestionsWhat is the difference between criminal la.docx
Part 1 Review QuestionsWhat is the difference between criminal la.docxMARRY7
 
Part 1 Review QuestionsWhat is the difference between authenticat.docx
Part 1 Review QuestionsWhat is the difference between authenticat.docxPart 1 Review QuestionsWhat is the difference between authenticat.docx
Part 1 Review QuestionsWhat is the difference between authenticat.docxMARRY7
 
Part 1 SQLDatabase workScenarioDevelopment of a relationa.docx
Part 1 SQLDatabase workScenarioDevelopment of a relationa.docxPart 1 SQLDatabase workScenarioDevelopment of a relationa.docx
Part 1 SQLDatabase workScenarioDevelopment of a relationa.docxMARRY7
 
Part 1 Review QuestionsWhat functions constitute a complete infor.docx
Part 1 Review QuestionsWhat functions constitute a complete infor.docxPart 1 Review QuestionsWhat functions constitute a complete infor.docx
Part 1 Review QuestionsWhat functions constitute a complete infor.docxMARRY7
 
Part 1A persons lifestyle has a significant influence on the p.docx
Part 1A persons lifestyle has a significant influence on the p.docxPart 1A persons lifestyle has a significant influence on the p.docx
Part 1A persons lifestyle has a significant influence on the p.docxMARRY7
 
Part 1 Review QuestionsWhat is the definition of information secu.docx
Part 1 Review QuestionsWhat is the definition of information secu.docxPart 1 Review QuestionsWhat is the definition of information secu.docx
Part 1 Review QuestionsWhat is the definition of information secu.docxMARRY7
 
Part 1 Review QuestionsWhat is a security modelWhat are the es.docx
Part 1 Review QuestionsWhat is a security modelWhat are the es.docxPart 1 Review QuestionsWhat is a security modelWhat are the es.docx
Part 1 Review QuestionsWhat is a security modelWhat are the es.docxMARRY7
 
Part 1 Listed below are several key Supreme Court decisions that .docx
Part 1 Listed below are several key Supreme Court decisions that .docxPart 1 Listed below are several key Supreme Court decisions that .docx
Part 1 Listed below are several key Supreme Court decisions that .docxMARRY7
 
Part 1 Infrastructure DesignCreate an 8–10-page infrastructur.docx
Part 1 Infrastructure DesignCreate an 8–10-page infrastructur.docxPart 1 Infrastructure DesignCreate an 8–10-page infrastructur.docx
Part 1 Infrastructure DesignCreate an 8–10-page infrastructur.docxMARRY7
 
part 1 I attended an international conference on Biotechnology and .docx
part 1 I attended an international conference on Biotechnology and .docxpart 1 I attended an international conference on Biotechnology and .docx
part 1 I attended an international conference on Biotechnology and .docxMARRY7
 
Part 1 Chapter 7 Summary plus end of chapter discussion of Alfred.docx
Part 1 Chapter 7 Summary plus end of chapter discussion of Alfred.docxPart 1 Chapter 7 Summary plus end of chapter discussion of Alfred.docx
Part 1 Chapter 7 Summary plus end of chapter discussion of Alfred.docxMARRY7
 
Parent Involvement Plan This week you will create a Parent Involve.docx
Parent Involvement Plan This week you will create a Parent Involve.docxParent Involvement Plan This week you will create a Parent Involve.docx
Parent Involvement Plan This week you will create a Parent Involve.docxMARRY7
 
Parenting Practices Over GenerationsGeneration 1 Years children.docx
Parenting Practices Over GenerationsGeneration 1 Years children.docxParenting Practices Over GenerationsGeneration 1 Years children.docx
Parenting Practices Over GenerationsGeneration 1 Years children.docxMARRY7
 
ParamsThe interface must be pleasing to look at (a basic form wit.docx
ParamsThe interface must be pleasing to look at (a basic form wit.docxParamsThe interface must be pleasing to look at (a basic form wit.docx
ParamsThe interface must be pleasing to look at (a basic form wit.docxMARRY7
 

More from MARRY7 (20)

Part 1.....InstructionsSelect one of the age groups disc.docx
Part 1.....InstructionsSelect one of the age groups disc.docxPart 1.....InstructionsSelect one of the age groups disc.docx
Part 1.....InstructionsSelect one of the age groups disc.docx
 
Part 1 – Add to Website PlanList at least three .docx
Part 1 – Add to Website PlanList at least three .docxPart 1 – Add to Website PlanList at least three .docx
Part 1 – Add to Website PlanList at least three .docx
 
Part 1 True or False Questions. (10 questions at 1 point each).docx
Part 1 True or False Questions. (10 questions at 1 point each).docxPart 1 True or False Questions. (10 questions at 1 point each).docx
Part 1 True or False Questions. (10 questions at 1 point each).docx
 
Part 11. Why is it so important in system engineering to become .docx
Part 11. Why is it so important in system engineering to become .docxPart 11. Why is it so important in system engineering to become .docx
Part 11. Why is it so important in system engineering to become .docx
 
Part 1 Using the internet, search for commercial IDPS systems. What.docx
Part 1 Using the internet, search for commercial IDPS systems. What.docxPart 1 Using the internet, search for commercial IDPS systems. What.docx
Part 1 Using the internet, search for commercial IDPS systems. What.docx
 
Part 1- Create an outline of the assignment below thenPart 2-1000 .docx
Part 1- Create an outline of the assignment below thenPart 2-1000 .docxPart 1- Create an outline of the assignment below thenPart 2-1000 .docx
Part 1- Create an outline of the assignment below thenPart 2-1000 .docx
 
Part 1 Review QuestionsWhat is the difference between criminal la.docx
Part 1 Review QuestionsWhat is the difference between criminal la.docxPart 1 Review QuestionsWhat is the difference between criminal la.docx
Part 1 Review QuestionsWhat is the difference between criminal la.docx
 
Part 1 Review QuestionsWhat is the difference between authenticat.docx
Part 1 Review QuestionsWhat is the difference between authenticat.docxPart 1 Review QuestionsWhat is the difference between authenticat.docx
Part 1 Review QuestionsWhat is the difference between authenticat.docx
 
Part 1 SQLDatabase workScenarioDevelopment of a relationa.docx
Part 1 SQLDatabase workScenarioDevelopment of a relationa.docxPart 1 SQLDatabase workScenarioDevelopment of a relationa.docx
Part 1 SQLDatabase workScenarioDevelopment of a relationa.docx
 
Part 1 Review QuestionsWhat functions constitute a complete infor.docx
Part 1 Review QuestionsWhat functions constitute a complete infor.docxPart 1 Review QuestionsWhat functions constitute a complete infor.docx
Part 1 Review QuestionsWhat functions constitute a complete infor.docx
 
Part 1A persons lifestyle has a significant influence on the p.docx
Part 1A persons lifestyle has a significant influence on the p.docxPart 1A persons lifestyle has a significant influence on the p.docx
Part 1A persons lifestyle has a significant influence on the p.docx
 
Part 1 Review QuestionsWhat is the definition of information secu.docx
Part 1 Review QuestionsWhat is the definition of information secu.docxPart 1 Review QuestionsWhat is the definition of information secu.docx
Part 1 Review QuestionsWhat is the definition of information secu.docx
 
Part 1 Review QuestionsWhat is a security modelWhat are the es.docx
Part 1 Review QuestionsWhat is a security modelWhat are the es.docxPart 1 Review QuestionsWhat is a security modelWhat are the es.docx
Part 1 Review QuestionsWhat is a security modelWhat are the es.docx
 
Part 1 Listed below are several key Supreme Court decisions that .docx
Part 1 Listed below are several key Supreme Court decisions that .docxPart 1 Listed below are several key Supreme Court decisions that .docx
Part 1 Listed below are several key Supreme Court decisions that .docx
 
Part 1 Infrastructure DesignCreate an 8–10-page infrastructur.docx
Part 1 Infrastructure DesignCreate an 8–10-page infrastructur.docxPart 1 Infrastructure DesignCreate an 8–10-page infrastructur.docx
Part 1 Infrastructure DesignCreate an 8–10-page infrastructur.docx
 
part 1 I attended an international conference on Biotechnology and .docx
part 1 I attended an international conference on Biotechnology and .docxpart 1 I attended an international conference on Biotechnology and .docx
part 1 I attended an international conference on Biotechnology and .docx
 
Part 1 Chapter 7 Summary plus end of chapter discussion of Alfred.docx
Part 1 Chapter 7 Summary plus end of chapter discussion of Alfred.docxPart 1 Chapter 7 Summary plus end of chapter discussion of Alfred.docx
Part 1 Chapter 7 Summary plus end of chapter discussion of Alfred.docx
 
Parent Involvement Plan This week you will create a Parent Involve.docx
Parent Involvement Plan This week you will create a Parent Involve.docxParent Involvement Plan This week you will create a Parent Involve.docx
Parent Involvement Plan This week you will create a Parent Involve.docx
 
Parenting Practices Over GenerationsGeneration 1 Years children.docx
Parenting Practices Over GenerationsGeneration 1 Years children.docxParenting Practices Over GenerationsGeneration 1 Years children.docx
Parenting Practices Over GenerationsGeneration 1 Years children.docx
 
ParamsThe interface must be pleasing to look at (a basic form wit.docx
ParamsThe interface must be pleasing to look at (a basic form wit.docxParamsThe interface must be pleasing to look at (a basic form wit.docx
ParamsThe interface must be pleasing to look at (a basic form wit.docx
 

Recently uploaded

The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13Steve Thomason
 
Biting mechanism of poisonous snakes.pdf
Biting mechanism of poisonous snakes.pdfBiting mechanism of poisonous snakes.pdf
Biting mechanism of poisonous snakes.pdfadityarao40181
 
How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxmanuelaromero2013
 
ENGLISH5 QUARTER4 MODULE1 WEEK1-3 How Visual and Multimedia Elements.pptx
ENGLISH5 QUARTER4 MODULE1 WEEK1-3 How Visual and Multimedia Elements.pptxENGLISH5 QUARTER4 MODULE1 WEEK1-3 How Visual and Multimedia Elements.pptx
ENGLISH5 QUARTER4 MODULE1 WEEK1-3 How Visual and Multimedia Elements.pptxAnaBeatriceAblay2
 
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...Marc Dusseiller Dusjagr
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Sapana Sha
 
internship ppt on smartinternz platform as salesforce developer
internship ppt on smartinternz platform as salesforce developerinternship ppt on smartinternz platform as salesforce developer
internship ppt on smartinternz platform as salesforce developerunnathinaik
 
Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)eniolaolutunde
 
Introduction to AI in Higher Education_draft.pptx
Introduction to AI in Higher Education_draft.pptxIntroduction to AI in Higher Education_draft.pptx
Introduction to AI in Higher Education_draft.pptxpboyjonauth
 
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdfBASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdfSoniaTolstoy
 
Computed Fields and api Depends in the Odoo 17
Computed Fields and api Depends in the Odoo 17Computed Fields and api Depends in the Odoo 17
Computed Fields and api Depends in the Odoo 17Celine George
 
_Math 4-Q4 Week 5.pptx Steps in Collecting Data
_Math 4-Q4 Week 5.pptx Steps in Collecting Data_Math 4-Q4 Week 5.pptx Steps in Collecting Data
_Math 4-Q4 Week 5.pptx Steps in Collecting DataJhengPantaleon
 
Science 7 - LAND and SEA BREEZE and its Characteristics
Science 7 - LAND and SEA BREEZE and its CharacteristicsScience 7 - LAND and SEA BREEZE and its Characteristics
Science 7 - LAND and SEA BREEZE and its CharacteristicsKarinaGenton
 
Science lesson Moon for 4th quarter lesson
Science lesson Moon for 4th quarter lessonScience lesson Moon for 4th quarter lesson
Science lesson Moon for 4th quarter lessonJericReyAuditor
 
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...Krashi Coaching
 
Pharmacognosy Flower 3. Compositae 2023.pdf
Pharmacognosy Flower 3. Compositae 2023.pdfPharmacognosy Flower 3. Compositae 2023.pdf
Pharmacognosy Flower 3. Compositae 2023.pdfMahmoud M. Sallam
 
Alper Gobel In Media Res Media Component
Alper Gobel In Media Res Media ComponentAlper Gobel In Media Res Media Component
Alper Gobel In Media Res Media ComponentInMediaRes1
 

Recently uploaded (20)

The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13
 
Biting mechanism of poisonous snakes.pdf
Biting mechanism of poisonous snakes.pdfBiting mechanism of poisonous snakes.pdf
Biting mechanism of poisonous snakes.pdf
 
How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptx
 
TataKelola dan KamSiber Kecerdasan Buatan v022.pdf
TataKelola dan KamSiber Kecerdasan Buatan v022.pdfTataKelola dan KamSiber Kecerdasan Buatan v022.pdf
TataKelola dan KamSiber Kecerdasan Buatan v022.pdf
 
ENGLISH5 QUARTER4 MODULE1 WEEK1-3 How Visual and Multimedia Elements.pptx
ENGLISH5 QUARTER4 MODULE1 WEEK1-3 How Visual and Multimedia Elements.pptxENGLISH5 QUARTER4 MODULE1 WEEK1-3 How Visual and Multimedia Elements.pptx
ENGLISH5 QUARTER4 MODULE1 WEEK1-3 How Visual and Multimedia Elements.pptx
 
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
 
internship ppt on smartinternz platform as salesforce developer
internship ppt on smartinternz platform as salesforce developerinternship ppt on smartinternz platform as salesforce developer
internship ppt on smartinternz platform as salesforce developer
 
Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)
 
Introduction to AI in Higher Education_draft.pptx
Introduction to AI in Higher Education_draft.pptxIntroduction to AI in Higher Education_draft.pptx
Introduction to AI in Higher Education_draft.pptx
 
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdfBASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdf
 
Computed Fields and api Depends in the Odoo 17
Computed Fields and api Depends in the Odoo 17Computed Fields and api Depends in the Odoo 17
Computed Fields and api Depends in the Odoo 17
 
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
 
_Math 4-Q4 Week 5.pptx Steps in Collecting Data
_Math 4-Q4 Week 5.pptx Steps in Collecting Data_Math 4-Q4 Week 5.pptx Steps in Collecting Data
_Math 4-Q4 Week 5.pptx Steps in Collecting Data
 
9953330565 Low Rate Call Girls In Rohini Delhi NCR
9953330565 Low Rate Call Girls In Rohini  Delhi NCR9953330565 Low Rate Call Girls In Rohini  Delhi NCR
9953330565 Low Rate Call Girls In Rohini Delhi NCR
 
Science 7 - LAND and SEA BREEZE and its Characteristics
Science 7 - LAND and SEA BREEZE and its CharacteristicsScience 7 - LAND and SEA BREEZE and its Characteristics
Science 7 - LAND and SEA BREEZE and its Characteristics
 
Science lesson Moon for 4th quarter lesson
Science lesson Moon for 4th quarter lessonScience lesson Moon for 4th quarter lesson
Science lesson Moon for 4th quarter lesson
 
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
 
Pharmacognosy Flower 3. Compositae 2023.pdf
Pharmacognosy Flower 3. Compositae 2023.pdfPharmacognosy Flower 3. Compositae 2023.pdf
Pharmacognosy Flower 3. Compositae 2023.pdf
 
Alper Gobel In Media Res Media Component
Alper Gobel In Media Res Media ComponentAlper Gobel In Media Res Media Component
Alper Gobel In Media Res Media Component
 

! Modernizr v2.0.6 httpwww.modernizr.com Copyri.docx

  • 1. /*! * Modernizr v2.0.6 * http://www.modernizr.com * * Copyright (c) 2009-2011 Faruk Ates, Paul Irish, Alex Sexton * Dual-licensed under the BSD or MIT licenses: www.modernizr.com/license/ */ /* * Modernizr tests which native CSS3 and HTML5 features are available in * the current UA and makes the results available to you in two ways: * as properties on a global Modernizr object, and as classes on the * element. This information allows you to progressively enhance * your pages with a granular level of control over the experience. * * Modernizr has an optional (not included) conditional resource loader * called Modernizr.load(), based on Yepnope.js (yepnopejs.com). * To get a build that includes Modernizr.load(), as well as choosing * which tests to include, go to www.modernizr.com/download/ * * Authors Faruk Ates, Paul Irish, Alex Sexton, * Contributors Ryan Seddon, Ben Alman */ window.Modernizr = (function( window, document, undefined ) {
  • 2. var version = '2.0.6', Modernizr = {}, // option for enabling the HTML classes to be added enableClasses = true, docElement = document.documentElement, docHead = document.head || document.getElementsByTagName('head')[0], /** * Create our "modernizr" element that we do most feature tests on. */ mod = 'modernizr', modElem = document.createElement(mod), mStyle = modElem.style, /** * Create the input element for various Web Forms feature tests. */ inputElem = document.createElement('input'), smile = ':)', toString = Object.prototype.toString, // List of property values to set for css tests. See ticket #21 prefixes = ' -webkit- -moz- -o- -ms- -khtml- '.split(' '), // Following spec is to expose vendor-specific style properties as: // elem.style.WebkitBorderRadius
  • 3. // and the following would be incorrect: // elem.style.webkitBorderRadius // Webkit ghosts their properties in lowercase but Opera & Moz do not. // Microsoft foregoes prefixes entirely elements in IE6-9 are considered 'NoScope' elements and therefore will be removed // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements. // http://msdn.microsoft.com/en- us/library/ms533897%28VS.85%29.aspx style = ['-', ''].join(''); div.id = mod; div.innerHTML += style; docElement.appendChild(div); ret = callback(div, rule); div.parentNode.removeChild(div); return !!ret; }, // adapted from matchMedia polyfill // by Scott Jehl and Paul Irish // gist.github.com/786768 testMediaQuery = function( mq ) { if ( window.matchMedia ) { return matchMedia(mq).matches; } var bool;
  • 4. injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) { bool = (window.getComputedStyle ? getComputedStyle(node, null) : node.currentStyle)['position'] == 'absolute'; }); return bool; }, /** * isEventSupported determines if a given element supports the given event * function from http://yura.thinkweb2.com/isEventSupported/ */ isEventSupported = (function() { var TAGNAMES = { 'select': 'input', 'change': 'input', 'submit': 'form', 'reset': 'form', 'error': 'img', 'load': 'img', 'abort': 'img' }; function isEventSupported( eventName, element ) { element = element || document.createElement(TAGNAMES[eventName] || 'div'); eventName = 'on' + eventName; // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those var isSupported = eventName in element;
  • 5. if ( !isSupported ) { // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element if ( !element.setAttribute ) { element = document.createElement('div'); } if ( element.setAttribute && element.removeAttribute ) { element.setAttribute(eventName, ''); isSupported = is(element[eventName], 'function'); // If property was created, "remove it" (by setting value to `undefined`) if ( !is(element[eventName], undefined) ) { element[eventName] = undefined; } element.removeAttribute(eventName); } } element = null; return isSupported; } return isEventSupported; })(); // hasOwnProperty shim by kangax needed for Safari 2.0 support var _hasOwnProperty = ({}).hasOwnProperty, hasOwnProperty; if ( !is(_hasOwnProperty, undefined) && !is(_hasOwnProperty.call, undefined) ) { hasOwnProperty = function (object, property) { return _hasOwnProperty.call(object, property); }; }
  • 6. else { hasOwnProperty = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */ return ((property in object) && is(object.constructor.prototype[property], undefined)); }; } /** * setCss applies given styles to the Modernizr DOM node. */ function setCss( str ) { mStyle.cssText = str; } /** * setCssAll extrapolates all vendor-specific css strings. */ function setCssAll( str1, str2 ) { return setCss(prefixes.join(str1 + ';') + ( str2 || '' )); } /** * is returns a boolean for if typeof obj is exactly type. */ function is( obj, type ) { return typeof obj === type; } /** * contains returns a boolean for if substr is found within str. */ function contains( str, substr ) { return !!~('' + str).indexOf(substr); }
  • 7. /** * testProps is a generic CSS / DOM property test; if a browser supports * a certain property, it won't return undefined for it. * A supported CSS property returns empty string when its not yet set. */ function testProps( props, prefixed ) { for ( var i in props ) { if ( mStyle[ props[i] ] !== undefined ) { return prefixed == 'pfx' ? props[i] : true; } } return false; } /** * testPropsAll tests a list of DOM properties we want to check against. * We specify literally ALL possible (known and/or likely) properties on * the element including the non-vendor prefixed one, for forward- * compatibility. */ function testPropsAll( prop, prefixed ) { var ucProp = prop.charAt(0).toUpperCase() + prop.substr(1), props = (prop + ' ' + domPrefixes.join(ucProp + ' ') + ucProp).split(' '); return testProps(props, prefixed); }
  • 8. /** * testBundle tests a list of CSS features that require element and style injection. * By bundling them together we can reduce the need to touch the DOM multiple times. */ /*>>testBundle*/ var testBundle = (function( styles, tests ) { var style = styles.join(''), len = tests.length; injectElementWithStyles(style, function( node, rule ) { var style = document.styleSheets[document.styleSheets.length - 1], // IE8 will bork if you create a custom build that excludes both fontface and generatedcontent tests. // So we check for cssRules and that there is a rule available // More here: https://github.com/Modernizr/Modernizr/issues/288 & https://github.com/Modernizr/Modernizr/issues/293 cssText = style.cssRules && style.cssRules[0] ? style.cssRules[0].cssText : style.cssText || "", children = node.childNodes, hash = {}; while ( len-- ) { hash[children[len].id] = children[len]; } /*>>touch*/ Modernizr['touch'] = ('ontouchstart' in window) || hash['touch'].offsetTop === 9; /*>>touch*/ /*>>csstransforms3d*/ Modernizr['csstransforms3d'] = hash['csstransforms3d'].offsetLeft === 9; /*>>csstransforms3d*/ /*>>generatedcontent*/Modernizr['generatedcontent'] = hash['generatedcontent'].offsetHeight >= 1;
  • 9. /*>>generatedcontent*/ /*>>fontface*/ Modernizr['fontface'] = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0; /*>>fontface*/ }, len, tests); })([ // Pass in styles to be injected into document /*>>fontface*/ '@font-face {font- family:"font";src:url("https://")}' /*>>fontface*/ /*>>touch*/ ,['@media (',prefixes.join('touch- enabled),('),mod,')', '{#touch{top:9px;position:absolute}}'].join('') /*>>touch*/ /*>>csstransforms3d*/ ,['@media (',prefixes.join('transform-3d),('),mod,')', '{#csstransforms3d{left:9px;position:absolute}}'].join('')/*>>cs stransforms3d*/ /*>>generatedcontent*/,['#generatedcontent:after{content:"',smi le,'";visibility:hidden}'].join('') /*>>generatedcontent*/ ], [ /*>>fontface*/ 'fontface' /*>>fontface*/ /*>>touch*/ ,'touch' /*>>touch*/ /*>>csstransforms3d*/ ,'csstransforms3d' /*>>csstransforms3d*/ /*>>generatedcontent*/,'generatedcontent' /*>>generatedcontent*/
  • 10. ]);/*>>testBundle*/ /** * Tests * ----- */ tests['flexbox'] = function() { /** * setPrefixedValueCSS sets the property of a specified element * adding vendor prefixes to the VALUE of the property. * @param {Element} element * @param {string} property The property name. This will not be prefixed. * @param {string} value The value of the property. This WILL be prefixed. * @param {string=} extra Additional CSS to append unmodified to the end of * the CSS string. */ function setPrefixedValueCSS( element, property, value, extra ) { property += ':'; element.style.cssText = (property + prefixes.join(value + ';' + property)).slice(0, -property.length) + (extra || ''); } /** * setPrefixedPropertyCSS sets the property of a specified element * adding vendor prefixes to the NAME of the property. * @param {Element} element * @param {string} property The property name. This WILL be prefixed.
  • 11. * @param {string} value The value of the property. This will not be prefixed. * @param {string=} extra Additional CSS to append unmodified to the end of * the CSS string. */ function setPrefixedPropertyCSS( element, property, value, extra ) { element.style.cssText = prefixes.join(property + ':' + value + ';') + (extra || ''); } var c = document.createElement('div'), elem = document.createElement('div'); setPrefixedValueCSS(c, 'display', 'box', 'width:42px;padding:0;'); setPrefixedPropertyCSS(elem, 'box-flex', '1', 'width:10px;'); c.appendChild(elem); docElement.appendChild(c); var ret = elem.offsetWidth === 42; c.removeChild(elem); docElement.removeChild(c); return ret; }; // On the S60 and BB Storm, getContext exists, but always returns undefined // http://github.com/Modernizr/Modernizr/issues/issue/97/ tests['canvas'] = function() {
  • 12. var elem = document.createElement('canvas'); return !!(elem.getContext && elem.getContext('2d')); }; tests['canvastext'] = function() { return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function')); }; // This WebGL test may false positive. // But really it's quite impossible to know whether webgl will succeed until after you create the context. // You might have hardware that can support a 100x100 webgl canvas, but will not support a 1000x1000 webgl // canvas. So this feature inference is weak, but intentionally so. // It is known to false positive in FF4 with certain hardware and the iPad 2. tests['webgl'] = function() { return !!window.WebGLRenderingContext; }; /* * The Modernizr.touch test only indicates if the browser supports * touch events, which does not necessarily reflect a touchscreen * device, as evidenced by tablets running Windows 7 or, alas, * the Palm Pre / WebOS (touch) phones. * * Additionally, Chrome (desktop) used to lie about its support on this,
  • 13. * but that has since been rectified: http://crbug.com/36415 * * We also test for Firefox 4 Multitouch Support. * * For more info, see: http://modernizr.github.com/Modernizr/touch.html */ tests['touch'] = function() { return Modernizr['touch']; }; /** * geolocation tests for the new Geolocation API specification. * This test is a standards compliant-only test; for more complete * testing, including a Google Gears fallback, please see: * http://code.google.com/p/geo-location-javascript/ * or view a fallback solution using google's geo API: * http://gist.github.com/366184 */ tests['geolocation'] = function() { return !!navigator.geolocation; }; // Per 1.6: // This used to be Modernizr.crosswindowmessaging but the longer // name has been deprecated in favor of a shorter and property-matching one. // The old API is still available in 1.6, but as of 2.0 will throw a warning, // and in the first release thereafter disappear entirely. tests['postmessage'] = function() { return !!window.postMessage;
  • 14. }; // Web SQL database detection is tricky: // In chrome incognito mode, openDatabase is truthy, but using it will // throw an exception: http://crbug.com/42380 // We can create a dummy database, but there is no way to delete it afterwards. // Meanwhile, Safari users can get prompted on any database creation. // If they do, any page with Modernizr will give them a prompt: // http://github.com/Modernizr/Modernizr/issues/closed#issue/113 // We have chosen to allow the Chrome incognito false positive, so that Modernizr // doesn't litter the web with these test databases. As a developer, you'll have // to account for this gotcha yourself. tests['websqldatabase'] = function() { var result = !!window.openDatabase; /* if (result){ try { result = !!openDatabase( mod + "testdb", "1.0", mod + "testdb", 2e4); } catch(e) { } } */ return result; }; // Vendors had inconsistent prefixing with the experimental Indexed DB:
  • 15. // - Webkit's implementation is accessible through webkitIndexedDB // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB // For speed, we don't test the legacy (and beta-only) indexedDB tests['indexedDB'] = function() { for ( var i = -1, len = domPrefixes.length; ++i < len; ){ if ( window[domPrefixes[i].toLowerCase() + 'IndexedDB'] ){ return true; } } return !!window.indexedDB; }; // documentMode logic from YUI to filter out IE8 Compat Mode // which false positives. tests['hashchange'] = function() { return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7); }; // Per 1.6: // This used to be Modernizr.historymanagement but the longer // name has been deprecated in favor of a shorter and property-matching one. // The old API is still available in 1.6, but as of 2.0 will throw a warning, // and in the first release thereafter disappear entirely. tests['history'] = function() { return !!(window.history && history.pushState); };
  • 16. tests['draganddrop'] = function() { return isEventSupported('dragstart') && isEventSupported('drop'); }; // Mozilla is targeting to land MozWebSocket for FF6 // bugzil.la/659324 tests['websockets'] = function() { for ( var i = -1, len = domPrefixes.length; ++i < len; ){ if ( window[domPrefixes[i] + 'WebSocket'] ){ return true; } } return 'WebSocket' in window; }; // http://css-tricks.com/rgba-browser-support/ tests['rgba'] = function() { // Set an rgba() color and check the returned value setCss('background-color:rgba(150,255,150,.5)'); return contains(mStyle.backgroundColor, 'rgba'); }; tests['hsla'] = function() { // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally, // except IE9 who retains it as hsla setCss('background-color:hsla(120,40%,100%,.5)'); return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');
  • 17. }; tests['multiplebgs'] = function() { // Setting multiple images AND a color on the background shorthand property // and then querying the style.background property value for the number of // occurrences of "url(" is a reliable method for detecting ACTUAL support for this! setCss('background:url(https://),url(https://),red url(https://)'); // If the UA supports multiple backgrounds, there should be three occurrences // of the string "url(" in the return value for elemStyle.background return /(urls*(.*?){3}/.test(mStyle.background); }; // In testing support for a given CSS property, it's legit to test: // `elem.style[styleName] !== undefined` // If the property is supported it will return an empty string, // if unsupported it will return undefined. // We'll take advantage of this quick test and skip setting a style // on our modernizr element, but instead just testing undefined vs // empty string. tests['backgroundsize'] = function() {
  • 18. return testPropsAll('backgroundSize'); }; tests['borderimage'] = function() { return testPropsAll('borderImage'); }; // Super comprehensive table about all the unique implementations of // border-radius: http://muddledramblings.com/table-of-css3- border-radius-compliance tests['borderradius'] = function() { return testPropsAll('borderRadius'); }; // WebOS unfortunately false positives on this test. tests['boxshadow'] = function() { return testPropsAll('boxShadow'); }; // FF3.0 will false positive on this test tests['textshadow'] = function() { return document.createElement('div').style.textShadow === ''; }; tests['opacity'] = function() { // Browsers that actually have CSS Opacity implemented have done so // according to spec, which means their return values are within the // range of [0.0,1.0] - including the leading zero.
  • 19. setCssAll('opacity:.55'); // The non-literal . in this regex is intentional: // German Chrome returns this value as 0,55 // https://github.com/Modernizr/Modernizr/issues/#issue/59/comm ent/516632 return /^0.55$/.test(mStyle.opacity); }; tests['cssanimations'] = function() { return testPropsAll('animationName'); }; tests['csscolumns'] = function() { return testPropsAll('columnCount'); }; tests['cssgradients'] = function() { /** * For CSS Gradients syntax, please see: * http://webkit.org/blog/175/introducing-css-gradients/ * https://developer.mozilla.org/en/CSS/-moz-linear- gradient * https://developer.mozilla.org/en/CSS/-moz-radial- gradient * http://dev.w3.org/csswg/css3-images/#gradients- */ var str1 = 'background-image:', str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));', str3 = 'linear-gradient(left top,#9f9, white);';
  • 20. setCss( (str1 + prefixes.join(str2 + str1) + prefixes.join(str3 + str1)).slice(0, -str1.length) ); return contains(mStyle.backgroundImage, 'gradient'); }; tests['cssreflections'] = function() { return testPropsAll('boxReflect'); }; tests['csstransforms'] = function() { return !!testProps(['transformProperty', 'WebkitTransform', 'MozTransform', 'OTransform', 'msTransform']); }; tests['csstransforms3d'] = function() { var ret = !!testProps(['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective']); // Webkit’s 3D transforms are passed off to the browser's own graphics renderer. // It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in // some conditions. As a result, Webkit typically recognizes the syntax but // will sometimes throw a false positive, thus we must do a more thorough check: if ( ret && 'webkitPerspective' in docElement.style ) {
  • 21. // Webkit allows this media query to succeed only if the feature is enabled. // `@media (transform-3d),(-o-transform-3d),(-moz- transform-3d),(-ms-transform-3d),(-webkit-transform- 3d),(modernizr){ ... }` ret = Modernizr['csstransforms3d']; } return ret; }; tests['csstransitions'] = function() { return testPropsAll('transitionProperty'); }; /*>>fontface*/ // @font-face detection routine by Diego Perini // http://javascript.nwbox.com/CSSSupport/ tests['fontface'] = function() { return Modernizr['fontface']; }; /*>>fontface*/ // CSS generated content detection tests['generatedcontent'] = function() { return Modernizr['generatedcontent']; }; // These tests evaluate support of the video/audio elements, as well as // testing what types of content they support. //
  • 22. // We're using the Boolean constructor here, so that we can extend the value // e.g. Modernizr.video // true // Modernizr.video.ogg // 'probably' // // Codec values from : http://github.com/NielsLeenheer/html5test/blob/9106a8/index.ht ml#L845 // thx to NielsLeenheer and zcorpan // Note: in FF 3.5.1 and 3.5.0, "no" was a return value instead of empty string. // Modernizr does not normalize for that. tests['video'] = function() { var elem = document.createElement('video'), bool = false; // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224 try { if ( bool = !!elem.canPlayType ) { bool = new Boolean(bool); bool.ogg = elem.canPlayType('video/ogg; codecs="theora"'); // Workaround required for IE9, which doesn't report video support without audio codec specified. // bug 599718 @ msft connect var h264 = 'video/mp4; codecs="avc1.42E01E'; bool.h264 = elem.canPlayType(h264 + '"') || elem.canPlayType(h264 + ', mp4a.40.2"'); bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"'); }
  • 23. } catch(e) { } return bool; }; tests['audio'] = function() { var elem = document.createElement('audio'), bool = false; try { if ( bool = !!elem.canPlayType ) { bool = new Boolean(bool); bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"'); bool.mp3 = elem.canPlayType('audio/mpeg;'); // Mimetypes accepted: // https://developer.mozilla.org/En/Media_formats_supported_by_ the_audio_and_video_elements // http://bit.ly/iphoneoscodecs bool.wav = elem.canPlayType('audio/wav; codecs="1"'); bool.m4a = elem.canPlayType('audio/x-m4a;') || elem.canPlayType('audio/aac;'); } } catch(e) { } return bool; }; // Firefox has made these tests rather unfun. // In FF4, if disabled, window.localStorage should === null.
  • 24. // Normally, we could not test that directly and need to do a // `('localStorage' in window) && ` test first because otherwise Firefox will // throw http://bugzil.la/365772 if cookies are disabled // However, in Firefox 4 betas, if dom.storage.enabled == false, just mentioning // the property will throw an exception. http://bugzil.la/599479 // This looks to be fixed for FF4 Final. // Because we are forced to try/catch this, we'll go aggressive. // FWIW: IE8 Compat mode supports these features completely: // http://www.quirksmode.org/dom/html5.html // But IE8 doesn't support either with local files tests['localstorage'] = function() { try { return !!localStorage.getItem; } catch(e) { return false; } }; tests['sessionstorage'] = function() { try { return !!sessionStorage.getItem; } catch(e){ return false; } };
  • 25. tests['webworkers'] = function() { return !!window.Worker; }; tests['applicationcache'] = function() { return !!window.applicationCache; }; // Thanks to Erik Dahlstrom tests['svg'] = function() { return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect; }; // specifically for SVG inline in HTML, not within XHTML // test page: paulirish.com/demo/inline-svg tests['inlinesvg'] = function() { var div = document.createElement('div'); div.innerHTML = ''; return (div.firstChild && div.firstChild.namespaceURI) == ns.svg; }; // Thanks to F1lt3r and lucideer, ticket #35 tests['smil'] = function() { return !!document.createElementNS && /SVG/.test(toString.call(document.createElementNS(ns.svg, 'animate'))); }; tests['svgclippaths'] = function() { // Possibly returns a false positive in Safari 3.2? return !!document.createElementNS &&
  • 26. /SVG/.test(toString.call(document.createElementNS(ns.svg, 'clipPath'))); }; // input features and input types go directly onto the ret object, bypassing the tests loop. // Hold this guy to execute in a moment. function webforms() { // Run through HTML5's new input attributes to see if the UA understands any. // We're using f which is the element created early on // Mike Taylr has created a comprehensive resource for testing these attributes // when applied to all input types: // http://miketaylr.com/code/input-type-attr.html // spec: http://www.whatwg.org/specs/web-apps/current- work/multipage/the-input-element.html#input-type-attr- summary // Only input placeholder is tested while textarea's placeholder is not. // Currently Safari 4 and Opera 11 have support only for the input placeholder // Both tests are available in feature-detects/forms- placeholder.js Modernizr['input'] = (function( props ) { for ( var i = 0, len = props.length; i < len; i++ ) { attrs[ props[i] ] = !!(props[i] in inputElem); } return attrs; })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ')); // Run through HTML5's new input types to see if the UA understands any. // This is put behind the tests runloop because it doesn't
  • 27. return a // true/false like all the other tests; instead, it returns an object // containing each input type with its corresponding true/false value // Big thanks to @miketaylr for the html5 forms expertise. http://miketaylr.com/ Modernizr['inputtypes'] = (function(props) { for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) { inputElem.setAttribute('type', inputElemType = props[i]); bool = inputElem.type !== 'text'; // We first check to see if the type we give it sticks.. // If the type does, we feed it a textual value, which shouldn't be valid. // If the value doesn't stick, we know there's input sanitization which infers a custom UI if ( bool ) { inputElem.value = smile; inputElem.style.cssText = 'position:absolute;visibility:hidden;'; if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) { docElement.appendChild(inputElem); defaultView = document.defaultView; // Safari 2-4 allows the smiley as a value, despite making a slider
  • 28. bool = defaultView.getComputedStyle && defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' && // Mobile android web browser has false positive, so must // check the height to see if the widget is actually there. (inputElem.offsetHeight !== 0); docElement.removeChild(inputElem); } else if ( /^(search|tel)$/.test(inputElemType) ){ // Spec doesnt define any special parsing or detectable UI // behaviors so we pass these through as true // Interestingly, opera fails the earlier test, so it doesn't // even make it here. } else if ( /^(url|email)$/.test(inputElemType) ) { // Real url and email support comes with prebaked validation. bool = inputElem.checkValidity && inputElem.checkValidity() === false; } else if ( /^color$/.test(inputElemType) ) { // chuck into DOM and force reflow for Opera bug in 11.00 // github.com/Modernizr/Modernizr/issues#issue/159 docElement.appendChild(inputElem); docElement.offsetWidth; bool = inputElem.value != smile; docElement.removeChild(inputElem);
  • 29. } else { // If the upgraded input compontent rejects the :) text, we got a winner bool = inputElem.value != smile; } } inputs[ props[i] ] = !!bool; } return inputs; })('search tel url email datetime date month week time datetime-local number range color'.split(' ')); } // End of test definitions // ----------------------- // Run through all tests and detect their support in the current UA. // todo: hypothetically we could be doing an array of tests and use a basic loop here. for ( var feature in tests ) { if ( hasOwnProperty(tests, feature) ) { // run the test, throw the return value into the Modernizr, // then based on that boolean, define an appropriate className // and push it into an array of classes we'll join later. featureName = feature.toLowerCase(); Modernizr[featureName] = tests[feature](); classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);
  • 30. } } // input tests need to run. Modernizr.input || webforms(); /** * addTest allows the user to define their own feature tests * the result will be added onto the Modernizr object, * as well as an appropriate className set on the html element * * @param feature - String naming the feature * @param test - Function returning true if feature is supported, false if not */ Modernizr.addTest = function ( feature, test ) { if ( typeof feature == "object" ) { for ( var key in feature ) { if ( hasOwnProperty( feature, key ) ) { Modernizr.addTest( key, feature[ key ] ); } } } else { feature = feature.toLowerCase(); if ( Modernizr[feature] !== undefined ) { // we're going to quit if you're trying to overwrite an existing test // if we were to allow it, we'd do this: // var re = new RegExp("b(no-)?" + feature + "b"); // docElement.className = docElement.className.replace( re, '' ); // but, no rly, stuff 'em.
  • 31. return; } test = typeof test == "boolean" ? test : !!test(); docElement.className += ' ' + (test ? '' : 'no-') + feature; Modernizr[feature] = test; } return Modernizr; // allow chaining. }; // Reset modElem.cssText to nothing to reduce memory footprint. setCss(''); modElem = inputElem = null; //>>BEGIN IEPP // Enable HTML 5 elements for styling (and printing) in IE. if ( window.attachEvent && (function(){ var elem = document.createElement('div'); elem.innerHTML = ''; return elem.childNodes.length !== 1; })() ) { // iepp v2 by @jon_neal & afarkas : github.com/aFarkas/iepp/ (function(win, doc) { win.iepp = win.iepp || {}; var iepp = win.iepp, elems = iepp.html5elements || 'abbr|article|aside|audio|canvas|datalist|details|figcaption|figure| footer|header|hgroup|mark|meter|nav|output|progress|section|su mmary|time|video',
  • 32. elemsArr = elems.split('|'), elemsArrLen = elemsArr.length, elemRegExp = new RegExp('(^|s)('+elems+')', 'gi'), tagRegExp = new RegExp(' which is print-safe and shouldn't conflict since it isn't part of html5 bodyElem.innerHTML = body.innerHTML.replace(tagRegExp, '>END IEPP // Assign private properties to the return object with prefix Modernizr._version = version; // expose these for the plugin API. Look in the source for how to join() them against your input Modernizr._prefixes = prefixes; Modernizr._domPrefixes = domPrefixes; // Modernizr.mq tests a given media query, live against the current state of the window // A few important notes: // * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false // * A max-width or orientation query will be evaluated against the current state, which may change later. // * You must specify values. Eg. If you are testing support for the min-width media query use: // Modernizr.mq('(min-width:0)') // usage: // Modernizr.mq('only screen and (max-width:768)') Modernizr.mq = testMediaQuery; // Modernizr.hasEvent() detects support for a given event, with an optional element to test on // Modernizr.hasEvent('gesturestart', elem) Modernizr.hasEvent = isEventSupported; // Modernizr.testProp() investigates whether a given style
  • 33. property is recognized // Note that the property names must be provided in the camelCase variant. // Modernizr.testProp('pointerEvents') Modernizr.testProp = function(prop){ return testProps([prop]); }; // Modernizr.testAllProps() investigates whether a given style property, // or any of its vendor-prefixed variants, is recognized // Note that the property names must be provided in the camelCase variant. // Modernizr.testAllProps('boxSizing') Modernizr.testAllProps = testPropsAll; // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... }) Modernizr.testStyles = injectElementWithStyles; // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input // Modernizr.prefixed('boxSizing') // 'MozBoxSizing' // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style. // Return values will also be the camelCase variant, if you need to translate that to hypenated style use: // // str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');
  • 34. // If you're trying to ascertain which transition end event to bind to, you might do something like... // // var transEndEventNames = { // 'WebkitTransition' : 'webkitTransitionEnd', // 'MozTransition' : 'transitionend', // 'OTransition' : 'oTransitionEnd', // 'msTransition' : 'msTransitionEnd', // maybe? // 'transition' : 'transitionEnd' // }, // transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ]; Modernizr.prefixed = function(prop){ return testPropsAll(prop, 'pfx'); }; // Remove "no-js" class from element, if it exists: docElement.className = docElement.className.replace(/bno-jsb/, '') // Add the new classes to the element. + (enableClasses ? ' js ' + classes.join(' ') : ''); return Modernizr; })(this, this.document);