@ -1,15 +1,16 @@
@@ -1,15 +1,16 @@
/ * M o d e r n i z r 2 . 8 . 1 ( C u s t o m B u i l d ) | M I T & B S D
* Build : http : //modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video- indexeddb-input-inputtypes- localstorage-postmessage-sessionstorage- websockets-websqldatabase-webworkers- geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest- prefixed-teststyles-test prop-testallprops-hasevent-prefixe s-domprefixes-css_objectfit
/ * M o d e r n i z r 2 . 8 . 3 ( C u s t o m B u i l d ) | M I T & B S D
* 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.0 ' ,
var version = '2.8.3 ' ,
Modernizr = { } ,
enableClasses = true ,
docElement = document . documentElement ,
@ -17,23 +18,15 @@ window.Modernizr = (function( window, document, undefined ) {
@@ -17,23 +18,15 @@ window.Modernizr = (function( window, document, undefined ) {
modElem = document . createElement ( mod ) ,
mStyle = modElem . style ,
inputElem = document . createElement ( 'input' ) ,
smile = ':)' ,
toString = { } . toString ,
inputElem ,
prefixes = ' -webkit- -moz- -o- -ms- ' . split ( ' ' ) ,
omPrefixes = 'Webkit Moz O ms' ,
toString = { } . toString , omPrefixes = 'Webkit Moz O ms' ,
cssomPrefixes = omPrefixes . split ( ' ' ) ,
domPrefixes = omPrefixes . toLowerCase ( ) . split ( ' ' ) ,
ns = { 'svg' : 'http://www.w3.org/2000/svg' } ,
tests = { } ,
inputs = { } ,
@ -46,101 +39,6 @@ window.Modernizr = (function( window, document, undefined ) {
@@ -46,101 +39,6 @@ window.Modernizr = (function( window, document, undefined ) {
featureName ,
injectElementWithStyles = function ( rule , callback , nodes , testnames ) {
var style , ret , node , docOverflow ,
div = document . createElement ( 'div' ) ,
body = document . body ,
fakeBody = body || document . createElement ( 'body' ) ;
if ( parseInt ( nodes , 10 ) ) {
while ( nodes -- ) {
node = document . createElement ( 'div' ) ;
node . id = testnames ? testnames [ nodes ] : mod + ( nodes + 1 ) ;
div . appendChild ( node ) ;
}
}
style = [ '­' , '<style id="s' , mod , '">' , rule , '</style>' ] . join ( '' ) ;
div . id = mod ;
( body ? div : fakeBody ) . innerHTML += style ;
fakeBody . appendChild ( div ) ;
if ( ! body ) {
fakeBody . style . background = '' ;
fakeBody . style . overflow = 'hidden' ;
docOverflow = docElement . style . overflow ;
docElement . style . overflow = 'hidden' ;
docElement . appendChild ( fakeBody ) ;
}
ret = callback ( div , rule ) ;
if ( ! body ) {
fakeBody . parentNode . removeChild ( fakeBody ) ;
docElement . style . overflow = docOverflow ;
} else {
div . parentNode . removeChild ( div ) ;
}
return ! ! ret ;
} ,
testMediaQuery = function ( mq ) {
var matchMedia = window . matchMedia || window . msMatchMedia ;
if ( matchMedia ) {
return matchMedia ( mq ) && matchMedia ( mq ) . matches || false ;
}
var bool ;
injectElementWithStyles ( '@media ' + mq + ' { #' + mod + ' { position: absolute; } }' , function ( node ) {
bool = ( window . getComputedStyle ?
getComputedStyle ( node , null ) :
node . currentStyle ) [ 'position' ] == 'absolute' ;
} ) ;
return bool ;
} ,
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 ;
var isSupported = eventName in element ;
if ( ! isSupported ) {
if ( ! element . setAttribute ) {
element = document . createElement ( 'div' ) ;
}
if ( element . setAttribute && element . removeAttribute ) {
element . setAttribute ( eventName , '' ) ;
isSupported = is ( element [ eventName ] , 'function' ) ;
if ( ! is ( element [ eventName ] , 'undefined' ) ) {
element [ eventName ] = undefined ;
}
element . removeAttribute ( eventName ) ;
}
}
element = null ;
return isSupported ;
}
return isEventSupported ;
} ) ( ) ,
_hasOwnProperty = ( { } ) . hasOwnProperty , hasOwnProp ;
@ -253,238 +151,18 @@ window.Modernizr = (function( window, document, undefined ) {
@@ -253,238 +151,18 @@ window.Modernizr = (function( window, document, undefined ) {
props = ( prop + ' ' + ( domPrefixes ) . join ( ucProp + ' ' ) + ucProp ) . split ( ' ' ) ;
return testDOMProps ( props , prefixed , elem ) ;
}
} tests [ 'flexbox' ] = function ( ) {
return testPropsAll ( 'flexWrap' ) ;
} ; 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' ) ) ;
} ;
tests [ 'webgl' ] = function ( ) {
return ! ! window . WebGLRenderingContext ;
} ;
tests [ 'touch' ] = function ( ) {
var bool ;
if ( ( 'ontouchstart' in window ) || window . DocumentTouch && document instanceof DocumentTouch ) {
bool = true ;
} else {
injectElementWithStyles ( [ '@media (' , prefixes . join ( 'touch-enabled),(' ) , mod , ')' , '{#modernizr{top:9px;position:absolute}}' ] . join ( '' ) , function ( node ) {
bool = node . offsetTop === 9 ;
} ) ;
}
return bool ;
} ;
}
tests [ 'geolocation' ] = function ( ) {
return 'geolocation' in navigator ;
} ;
tests [ 'postmessage' ] = function ( ) {
return ! ! window . postMessage ;
} ;
tests [ 'websqldatabase' ] = function ( ) {
return ! ! window . openDatabase ;
} ;
tests [ 'indexedDB' ] = function ( ) {
return ! ! testPropsAll ( "indexedDB" , window ) ;
} ;
tests [ 'hashchange' ] = function ( ) {
return isEventSupported ( 'hashchange' , window ) && ( document . documentMode === undefined || document . documentMode > 7 ) ;
} ;
tests [ 'history' ] = function ( ) {
return ! ! ( window . history && history . pushState ) ;
} ;
tests [ 'draganddrop' ] = function ( ) {
var div = document . createElement ( 'div' ) ;
return ( 'draggable' in div ) || ( 'ondragstart' in div && 'ondrop' in div ) ;
} ;
tests [ 'websockets' ] = function ( ) {
} ; tests [ 'websockets' ] = function ( ) {
return 'WebSocket' in window || 'MozWebSocket' in window ;
} ;
tests [ 'rgba' ] = function ( ) {
setCss ( 'background-color:rgba(150,255,150,.5)' ) ;
return contains ( mStyle . backgroundColor , 'rgba' ) ;
} ;
tests [ 'hsla' ] = function ( ) {
setCss ( 'background-color:hsla(120,40%,100%,.5)' ) ;
return contains ( mStyle . backgroundColor , 'rgba' ) || contains ( mStyle . backgroundColor , 'hsla' ) ;
} ;
tests [ 'multiplebgs' ] = function ( ) {
setCss ( 'background:url(https://),url(https://),red url(https://)' ) ;
return ( /(url\s*\(.*?){3}/ ) . test ( mStyle . background ) ;
} ; tests [ 'backgroundsize' ] = function ( ) {
return testPropsAll ( 'backgroundSize' ) ;
} ;
tests [ 'borderimage' ] = function ( ) {
return testPropsAll ( 'borderImage' ) ;
} ;
tests [ 'borderradius' ] = function ( ) {
return testPropsAll ( 'borderRadius' ) ;
} ;
tests [ 'boxshadow' ] = function ( ) {
return testPropsAll ( 'boxShadow' ) ;
} ;
tests [ 'textshadow' ] = function ( ) {
return document . createElement ( 'div' ) . style . textShadow === '' ;
} ;
tests [ 'opacity' ] = function ( ) {
setCssAll ( 'opacity:.55' ) ;
return ( /^0.55$/ ) . test ( mStyle . opacity ) ;
} ;
tests [ 'cssanimations' ] = function ( ) {
return testPropsAll ( 'animationName' ) ;
} ;
tests [ 'csscolumns' ] = function ( ) {
return testPropsAll ( 'columnCount' ) ;
} ;
tests [ 'cssgradients' ] = function ( ) {
var str1 = 'background-image:' ,
str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));' ,
str3 = 'linear-gradient(left top,#9f9, white);' ;
setCss (
( str1 + '-webkit- ' . split ( ' ' ) . 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 ! ! testPropsAll ( 'transform' ) ;
} ;
tests [ 'csstransforms3d' ] = function ( ) {
var ret = ! ! testPropsAll ( 'perspective' ) ;
if ( ret && 'webkitPerspective' in docElement . style ) {
injectElementWithStyles ( '@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}' , function ( node , rule ) {
ret = node . offsetLeft === 9 && node . offsetHeight === 3 ;
} ) ;
}
return ret ;
} ;
tests [ 'csstransitions' ] = function ( ) {
return testPropsAll ( 'transition' ) ;
} ;
tests [ 'fontface' ] = function ( ) {
var bool ;
injectElementWithStyles ( '@font-face {font-family:"font";src:url("https://")}' , function ( node , rule ) {
var style = document . getElementById ( 'smodernizr' ) ,
sheet = style . sheet || style . styleSheet ,
cssText = sheet ? ( sheet . cssRules && sheet . cssRules [ 0 ] ? sheet . cssRules [ 0 ] . cssText : sheet . cssText || '' ) : '' ;
bool = /src/i . test ( cssText ) && cssText . indexOf ( rule . split ( ' ' ) [ 0 ] ) === 0 ;
} ) ;
return bool ;
} ;
tests [ 'generatedcontent' ] = function ( ) {
var bool ;
injectElementWithStyles ( [ '#' , mod , '{font:0/0 a}#' , mod , ':after{content:"' , smile , '";visibility:hidden;font:3px/1 a}' ] . join ( '' ) , function ( node ) {
bool = node . offsetHeight >= 3 ;
} ) ;
return bool ;
} ;
tests [ 'video' ] = function ( ) {
var elem = document . createElement ( 'video' ) ,
bool = false ;
try {
if ( bool = ! ! elem . canPlayType ) {
bool = new Boolean ( bool ) ;
bool . ogg = elem . canPlayType ( 'video/ogg; codecs="theora"' ) . replace ( /^no$/ , '' ) ;
bool . h264 = elem . canPlayType ( 'video/mp4; codecs="avc1.42E01E"' ) . replace ( /^no$/ , '' ) ;
bool . webm = elem . canPlayType ( 'video/webm; codecs="vp8, vorbis"' ) . replace ( /^no$/ , '' ) ;
}
} 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"' ) . replace ( /^no$/ , '' ) ;
bool . mp3 = elem . canPlayType ( 'audio/mpeg;' ) . replace ( /^no$/ , '' ) ;
bool . wav = elem . canPlayType ( 'audio/wav; codecs="1"' ) . replace ( /^no$/ , '' ) ;
bool . m4a = ( elem . canPlayType ( 'audio/x-m4a;' ) ||
elem . canPlayType ( 'audio/aac;' ) ) . replace ( /^no$/ , '' ) ;
}
} catch ( e ) { }
return bool ;
} ;
tests [ 'localstorage' ] = function ( ) {
try {
localStorage . setItem ( mod , mod ) ;
@ -495,93 +173,7 @@ window.Modernizr = (function( window, document, undefined ) {
@@ -495,93 +173,7 @@ window.Modernizr = (function( window, document, undefined ) {
}
} ;
tests [ 'sessionstorage' ] = function ( ) {
try {
sessionStorage . setItem ( mod , mod ) ;
sessionStorage . removeItem ( mod ) ;
return true ;
} catch ( e ) {
return false ;
}
} ;
tests [ 'webworkers' ] = function ( ) {
return ! ! window . Worker ;
} ;
tests [ 'applicationcache' ] = function ( ) {
return ! ! window . applicationCache ;
} ;
tests [ 'svg' ] = function ( ) {
return ! ! document . createElementNS && ! ! document . createElementNS ( ns . svg , 'svg' ) . createSVGRect ;
} ;
tests [ 'inlinesvg' ] = function ( ) {
var div = document . createElement ( 'div' ) ;
div . innerHTML = '<svg/>' ;
return ( div . firstChild && div . firstChild . namespaceURI ) == ns . svg ;
} ;
tests [ 'smil' ] = function ( ) {
return ! ! document . createElementNS && /SVGAnimate/ . test ( toString . call ( document . createElementNS ( ns . svg , 'animate' ) ) ) ;
} ;
tests [ 'svgclippaths' ] = function ( ) {
return ! ! document . createElementNS && /SVGClipPath/ . test ( toString . call ( document . createElementNS ( ns . svg , 'clipPath' ) ) ) ;
} ;
function webforms ( ) {
Modernizr [ 'input' ] = ( function ( props ) {
for ( var i = 0 , len = props . length ; i < len ; i ++ ) {
attrs [ props [ i ] ] = ! ! ( props [ i ] in inputElem ) ;
}
if ( attrs . list ) {
attrs . list = ! ! ( document . createElement ( 'datalist' ) && window . HTMLDataListElement ) ;
}
return attrs ;
} ) ( 'autocomplete autofocus list placeholder max min multiple pattern required step' . split ( ' ' ) ) ;
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' ;
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 ;
bool = defaultView . getComputedStyle &&
defaultView . getComputedStyle ( inputElem , null ) . WebkitAppearance !== 'textfield' &&
( inputElem . offsetHeight !== 0 ) ;
docElement . removeChild ( inputElem ) ;
} else if ( /^(search|tel)$/ . test ( inputElemType ) ) {
} else if ( /^(url|email)$/ . test ( inputElemType ) ) {
bool = inputElem . checkValidity && inputElem . checkValidity ( ) === false ;
} else {
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 ( ' ' ) ) ;
}
for ( var feature in tests ) {
if ( hasOwnProp ( tests , feature ) ) {
featureName = feature . toLowerCase ( ) ;
@ -591,7 +183,6 @@ window.Modernizr = (function( window, document, undefined ) {
@@ -591,7 +183,6 @@ window.Modernizr = (function( window, document, undefined ) {
}
}
Modernizr . input || webforms ( ) ;
Modernizr . addTest = function ( feature , test ) {
@ -625,195 +216,13 @@ window.Modernizr = (function( window, document, undefined ) {
@@ -625,195 +216,13 @@ window.Modernizr = (function( window, document, undefined ) {
setCss ( '' ) ;
modElem = inputElem = null ;
; ( function ( window , document ) {
var version = '3.7.0' ;
var options = window . html5 || { } ;
var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i ;
var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i ;
var supportsHtml5Styles ;
var expando = '_html5shiv' ;
var expanID = 0 ;
var expandoData = { } ;
var supportsUnknownElements ;
( function ( ) {
try {
var a = document . createElement ( 'a' ) ;
a . innerHTML = '<xyz></xyz>' ;
supportsHtml5Styles = ( 'hidden' in a ) ;
supportsUnknownElements = a . childNodes . length == 1 || ( function ( ) {
( document . createElement ) ( 'a' ) ;
var frag = document . createDocumentFragment ( ) ;
return (
typeof frag . cloneNode == 'undefined' ||
typeof frag . createDocumentFragment == 'undefined' ||
typeof frag . createElement == 'undefined'
) ;
} ( ) ) ;
} catch ( e ) {
supportsHtml5Styles = true ;
supportsUnknownElements = true ;
}
} ( ) ) ;
function addStyleSheet ( ownerDocument , cssText ) {
var p = ownerDocument . createElement ( 'p' ) ,
parent = ownerDocument . getElementsByTagName ( 'head' ) [ 0 ] || ownerDocument . documentElement ;
p . innerHTML = 'x<style>' + cssText + '</style>' ;
return parent . insertBefore ( p . lastChild , parent . firstChild ) ;
}
function getElements ( ) {
var elements = html5 . elements ;
return typeof elements == 'string' ? elements . split ( ' ' ) : elements ;
}
function getExpandoData ( ownerDocument ) {
var data = expandoData [ ownerDocument [ expando ] ] ;
if ( ! data ) {
data = { } ;
expanID ++ ;
ownerDocument [ expando ] = expanID ;
expandoData [ expanID ] = data ;
}
return data ;
}
function createElement ( nodeName , ownerDocument , data ) {
if ( ! ownerDocument ) {
ownerDocument = document ;
}
if ( supportsUnknownElements ) {
return ownerDocument . createElement ( nodeName ) ;
}
if ( ! data ) {
data = getExpandoData ( ownerDocument ) ;
}
var node ;
if ( data . cache [ nodeName ] ) {
node = data . cache [ nodeName ] . cloneNode ( ) ;
} else if ( saveClones . test ( nodeName ) ) {
node = ( data . cache [ nodeName ] = data . createElem ( nodeName ) ) . cloneNode ( ) ;
} else {
node = data . createElem ( nodeName ) ;
}
return node . canHaveChildren && ! reSkip . test ( nodeName ) && ! node . tagUrn ? data . frag . appendChild ( node ) : node ;
}
function createDocumentFragment ( ownerDocument , data ) {
if ( ! ownerDocument ) {
ownerDocument = document ;
}
if ( supportsUnknownElements ) {
return ownerDocument . createDocumentFragment ( ) ;
}
data = data || getExpandoData ( ownerDocument ) ;
var clone = data . frag . cloneNode ( ) ,
i = 0 ,
elems = getElements ( ) ,
l = elems . length ;
for ( ; i < l ; i ++ ) {
clone . createElement ( elems [ i ] ) ;
}
return clone ;
}
function shivMethods ( ownerDocument , data ) {
if ( ! data . cache ) {
data . cache = { } ;
data . createElem = ownerDocument . createElement ;
data . createFrag = ownerDocument . createDocumentFragment ;
data . frag = data . createFrag ( ) ;
}
ownerDocument . createElement = function ( nodeName ) {
if ( ! html5 . shivMethods ) {
return data . createElem ( nodeName ) ;
}
return createElement ( nodeName , ownerDocument , data ) ;
} ;
ownerDocument . createDocumentFragment = Function ( 'h,f' , 'return function(){' +
'var n=f.cloneNode(),c=n.createElement;' +
'h.shivMethods&&(' +
getElements ( ) . join ( ) . replace ( /[\w\-]+/g , function ( nodeName ) {
data . createElem ( nodeName ) ;
data . frag . createElement ( nodeName ) ;
return 'c("' + nodeName + '")' ;
} ) +
');return n}'
) ( html5 , data . frag ) ;
}
function shivDocument ( ownerDocument ) {
if ( ! ownerDocument ) {
ownerDocument = document ;
}
var data = getExpandoData ( ownerDocument ) ;
if ( html5 . shivCSS && ! supportsHtml5Styles && ! data . hasCSS ) {
data . hasCSS = ! ! addStyleSheet ( ownerDocument ,
'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +
'mark{background:#FF0;color:#000}' +
'template{display:none}'
) ;
}
if ( ! supportsUnknownElements ) {
shivMethods ( ownerDocument , data ) ;
}
return ownerDocument ;
}
var html5 = {
'elements' : options . elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video' ,
'version' : version ,
'shivCSS' : ( options . shivCSS !== false ) ,
'supportsUnknownElements' : supportsUnknownElements ,
'shivMethods' : ( options . shivMethods !== false ) ,
'type' : 'default' ,
'shivDocument' : shivDocument ,
createElement : createElement ,
createDocumentFragment : createDocumentFragment
} ;
window . html5 = html5 ;
shivDocument ( document ) ;
} ( this , document ) ) ;
Modernizr . _version = version ;
Modernizr . _prefixes = prefixes ;
Modernizr . _domPrefixes = domPrefixes ;
Modernizr . _cssomPrefixes = cssomPrefixes ;
Modernizr . mq = testMediaQuery ;
Modernizr . hasEvent = isEventSupported ;
Modernizr . testProp = function ( prop ) {
return testProps ( [ prop ] ) ;
@ -822,7 +231,6 @@ window.Modernizr = (function( window, document, undefined ) {
@@ -822,7 +231,6 @@ window.Modernizr = (function( window, document, undefined ) {
Modernizr . testAllProps = testPropsAll ;
Modernizr . testStyles = injectElementWithStyles ;
Modernizr . prefixed = function ( prop , obj , elem ) {
if ( ! obj ) {
return testPropsAll ( prop , 'pfx' ) ;
@ -832,9 +240,6 @@ window.Modernizr = (function( window, document, undefined ) {
@@ -832,9 +240,6 @@ window.Modernizr = (function( window, document, undefined ) {
} ;
docElement . className = docElement . className . replace ( /(^|\s)no-js(\s|$)/ , '$1$2' ) +
( enableClasses ? ' js ' + classes . join ( ' ' ) : '' ) ;
return Modernizr ;