You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
252 lines
5.9 KiB
252 lines
5.9 KiB
/* Modernizr 2.8.3 (Custom Build) | MIT & BSD |
|
* Build: http://modernizr.com/download/#-indexeddb-localstorage-websockets-geolocation-prefixed-testprop-testallprops-domprefixes-css_objectfit |
|
*/ |
|
; |
|
|
|
|
|
|
|
window.Modernizr = (function( window, document, undefined ) { |
|
|
|
var version = '2.8.3', |
|
|
|
Modernizr = {}, |
|
|
|
|
|
docElement = document.documentElement, |
|
|
|
mod = 'modernizr', |
|
modElem = document.createElement(mod), |
|
mStyle = modElem.style, |
|
|
|
inputElem , |
|
|
|
|
|
toString = {}.toString, omPrefixes = 'Webkit Moz O ms', |
|
|
|
cssomPrefixes = omPrefixes.split(' '), |
|
|
|
domPrefixes = omPrefixes.toLowerCase().split(' '), |
|
|
|
|
|
tests = {}, |
|
inputs = {}, |
|
attrs = {}, |
|
|
|
classes = [], |
|
|
|
slice = classes.slice, |
|
|
|
featureName, |
|
|
|
|
|
|
|
_hasOwnProperty = ({}).hasOwnProperty, hasOwnProp; |
|
|
|
if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) { |
|
hasOwnProp = function (object, property) { |
|
return _hasOwnProperty.call(object, property); |
|
}; |
|
} |
|
else { |
|
hasOwnProp = function (object, property) { |
|
return ((property in object) && is(object.constructor.prototype[property], 'undefined')); |
|
}; |
|
} |
|
|
|
|
|
if (!Function.prototype.bind) { |
|
Function.prototype.bind = function bind(that) { |
|
|
|
var target = this; |
|
|
|
if (typeof target != "function") { |
|
throw new TypeError(); |
|
} |
|
|
|
var args = slice.call(arguments, 1), |
|
bound = function () { |
|
|
|
if (this instanceof bound) { |
|
|
|
var F = function(){}; |
|
F.prototype = target.prototype; |
|
var self = new F(); |
|
|
|
var result = target.apply( |
|
self, |
|
args.concat(slice.call(arguments)) |
|
); |
|
if (Object(result) === result) { |
|
return result; |
|
} |
|
return self; |
|
|
|
} else { |
|
|
|
return target.apply( |
|
that, |
|
args.concat(slice.call(arguments)) |
|
); |
|
|
|
} |
|
|
|
}; |
|
|
|
return bound; |
|
}; |
|
} |
|
|
|
function setCss( str ) { |
|
mStyle.cssText = str; |
|
} |
|
|
|
function setCssAll( str1, str2 ) { |
|
return setCss(prefixes.join(str1 + ';') + ( str2 || '' )); |
|
} |
|
|
|
function is( obj, type ) { |
|
return typeof obj === type; |
|
} |
|
|
|
function contains( str, substr ) { |
|
return !!~('' + str).indexOf(substr); |
|
} |
|
|
|
function testProps( props, prefixed ) { |
|
for ( var i in props ) { |
|
var prop = props[i]; |
|
if ( !contains(prop, "-") && mStyle[prop] !== undefined ) { |
|
return prefixed == 'pfx' ? prop : true; |
|
} |
|
} |
|
return false; |
|
} |
|
|
|
function testDOMProps( props, obj, elem ) { |
|
for ( var i in props ) { |
|
var item = obj[props[i]]; |
|
if ( item !== undefined) { |
|
|
|
if (elem === false) return props[i]; |
|
|
|
if (is(item, 'function')){ |
|
return item.bind(elem || obj); |
|
} |
|
|
|
return item; |
|
} |
|
} |
|
return false; |
|
} |
|
|
|
function testPropsAll( prop, prefixed, elem ) { |
|
|
|
var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1), |
|
props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' '); |
|
|
|
if(is(prefixed, "string") || is(prefixed, "undefined")) { |
|
return testProps(props, prefixed); |
|
|
|
} else { |
|
props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' '); |
|
return testDOMProps(props, prefixed, elem); |
|
} |
|
} |
|
|
|
|
|
tests['geolocation'] = function() { |
|
return 'geolocation' in navigator; |
|
}; |
|
tests['indexedDB'] = function() { |
|
return !!testPropsAll("indexedDB", window); |
|
}; tests['websockets'] = function() { |
|
return 'WebSocket' in window || 'MozWebSocket' in window; |
|
}; |
|
|
|
tests['localstorage'] = function() { |
|
try { |
|
localStorage.setItem(mod, mod); |
|
localStorage.removeItem(mod); |
|
return true; |
|
} catch(e) { |
|
return false; |
|
} |
|
}; |
|
|
|
|
|
for ( var feature in tests ) { |
|
if ( hasOwnProp(tests, feature) ) { |
|
featureName = feature.toLowerCase(); |
|
Modernizr[featureName] = tests[feature](); |
|
|
|
classes.push((Modernizr[featureName] ? '' : 'no-') + featureName); |
|
} |
|
} |
|
|
|
|
|
|
|
Modernizr.addTest = function ( feature, test ) { |
|
if ( typeof feature == 'object' ) { |
|
for ( var key in feature ) { |
|
if ( hasOwnProp( feature, key ) ) { |
|
Modernizr.addTest( key, feature[ key ] ); |
|
} |
|
} |
|
} else { |
|
|
|
feature = feature.toLowerCase(); |
|
|
|
if ( Modernizr[feature] !== undefined ) { |
|
return Modernizr; |
|
} |
|
|
|
test = typeof test == 'function' ? test() : test; |
|
|
|
if (typeof enableClasses !== "undefined" && enableClasses) { |
|
docElement.className += ' ' + (test ? '' : 'no-') + feature; |
|
} |
|
Modernizr[feature] = test; |
|
|
|
} |
|
|
|
return Modernizr; |
|
}; |
|
|
|
|
|
setCss(''); |
|
modElem = inputElem = null; |
|
|
|
|
|
Modernizr._version = version; |
|
|
|
Modernizr._domPrefixes = domPrefixes; |
|
Modernizr._cssomPrefixes = cssomPrefixes; |
|
|
|
|
|
|
|
Modernizr.testProp = function(prop){ |
|
return testProps([prop]); |
|
}; |
|
|
|
Modernizr.testAllProps = testPropsAll; |
|
|
|
|
|
Modernizr.prefixed = function(prop, obj, elem){ |
|
if(!obj) { |
|
return testPropsAll(prop, 'pfx'); |
|
} else { |
|
return testPropsAll(prop, obj, elem); |
|
} |
|
}; |
|
|
|
|
|
|
|
return Modernizr; |
|
|
|
})(this, this.document); |
|
|
|
// dev.opera.com/articles/view/css3-object-fit-object-position/ |
|
|
|
Modernizr.addTest('object-fit', |
|
!!Modernizr.prefixed('objectFit') |
|
);; |