├── .gitignore ├── lib ├── tests.js ├── classes.js ├── cssomPrefixes.js ├── docElement.js ├── isSVG.js ├── slice.js ├── mStyle.js ├── inputElem.js ├── toStringFn.js ├── Modernizr.js ├── modElem.js ├── is.js ├── roundedEquals.js ├── contains.js ├── domToCSS.js ├── cssToDOM.js ├── fnBind.js ├── omPrefixes.js ├── testXhrType.js ├── getBody.js ├── domPrefixes.js ├── createElement.js └── hasOwnProp.js ├── test ├── video │ ├── loop.js │ ├── preload.js │ └── crossorigin.js ├── webgl.js ├── css │ ├── mediaqueries.js │ ├── reflections.js │ ├── transitions.js │ ├── escape.js │ ├── ellipsis.js │ ├── textshadow.js │ ├── focuswithin.js │ ├── borderimage.js │ ├── boxshadow.js │ ├── flexboxlegacy.js │ ├── transformslevel2.js │ ├── borderradius.js │ ├── objectfit.js │ ├── will-change.js │ ├── all.js │ ├── transforms3d.js │ ├── backgroundsize.js │ ├── hsla.js │ ├── backgroundsizecover.js │ ├── transforms.js │ ├── flexboxtweener.js │ ├── rgba.js │ ├── userselect.js │ ├── resize.js │ ├── overflow-scrolling.js │ ├── textalignlast.js │ ├── variablefonts.js │ ├── lastchild.js │ ├── shapes.js │ ├── fontdisplay.js │ ├── scrollbars.js │ ├── customproperties.js │ ├── displayrunin.js │ ├── chunit.js │ ├── exunit.js │ ├── siblinggeneral.js │ ├── scrollsnappoints.js │ ├── boxdecorationbreak.js │ ├── flexbox.js │ ├── boxsizing.js │ ├── supports.js │ ├── calc.js │ ├── animations.js │ ├── valid.js │ ├── cssgrid.js │ ├── backgroundblendmode.js │ ├── appearance.js │ ├── hairline.js │ ├── invalid.js │ ├── backgroundposition-xy.js │ ├── target.js │ ├── backdropfilter.js │ ├── checked.js │ ├── opacity.js │ ├── cubicbezierrange.js │ ├── backgroundcliptext.js │ ├── vwunit.js │ ├── vhunit.js │ ├── multiplebgs.js │ ├── backgroundrepeat.js │ ├── generatedcontent.js │ ├── mask.js │ ├── remunit.js │ ├── pseudoanimations.js │ ├── subpixelfont.js │ ├── displaytable.js │ ├── positionsticky.js │ ├── pointerevents.js │ ├── pseudotransitions.js │ ├── textdecoration.js │ ├── filters.js │ ├── backgroundposition-shorthand.js │ ├── flexwrap.js │ └── columns.js ├── mediaquery │ ├── hovermq.js │ └── pointermq.js ├── dom │ ├── microdata.js │ ├── classlist.js │ ├── dataset.js │ ├── mutationObserver.js │ ├── hidden.js │ ├── intersection-observer.js │ ├── createElement-attrs.js │ ├── documentfragment.js │ └── passiveeventlisteners.js ├── window │ ├── framed.js │ ├── matchmedia.js │ └── atob-btoa.js ├── storage │ ├── websqldatabase.js │ └── sessionstorage.js ├── audio │ ├── loop.js │ └── webaudio.js ├── es6 │ ├── contains.js │ ├── generators.js │ ├── arrow.js │ ├── object.js │ ├── collections.js │ ├── string.js │ ├── array.js │ ├── number.js │ └── math.js ├── speech │ ├── speech-synthesis.js │ └── speech-recognition.js ├── webrtc │ ├── peerconnection.js │ ├── getusermedia.js │ └── datachannel.js ├── dart.js ├── network │ ├── fetch.js │ ├── eventsource.js │ ├── xhr-responsetype-blob.js │ ├── xhr-responsetype-text.js │ ├── xhr-responsetype-document.js │ ├── xhr-responsetype-arraybuffer.js │ ├── beacon.js │ ├── xhr-responsetype.js │ ├── xhr-responsetype-json.js │ ├── connection-effectivetype.js │ └── xhr2.js ├── elem │ ├── time.js │ ├── output.js │ ├── picture.js │ ├── template.js │ ├── progress-meter.js │ ├── datalist.js │ ├── unknown.js │ ├── bdi.js │ ├── details.js │ └── track.js ├── forms │ ├── placeholder.js │ ├── capture.js │ ├── requestautocomplete.js │ ├── fileinput.js │ └── fileinputdirectory.js ├── script │ ├── async.js │ └── defer.js ├── ligatures.js ├── eventlistener.js ├── xdomainrequest.js ├── custom-elements.js ├── serviceworker.js ├── workers │ ├── sharedworkers.js │ └── webworkers.js ├── ambientlight.js ├── lists-reversed.js ├── iframe │ ├── srcdoc.js │ ├── seamless.js │ └── sandbox.js ├── svg │ ├── smil.js │ ├── foreignobject.js │ ├── filters.js │ ├── clippaths.js │ ├── inline.js │ └── asimg.js ├── es5 │ ├── strictmode.js │ ├── string.js │ ├── function.js │ ├── specification.js │ ├── date.js │ ├── array.js │ ├── object.js │ └── undefined.js ├── queryselector.js ├── json.js ├── userdata.js ├── canvastext.js ├── svg.js ├── ie8compat.js ├── textarea │ └── maxlength.js ├── cors.js ├── dataview-api.js ├── img │ ├── crossorigin.js │ ├── srcset.js │ ├── jpegxr.js │ ├── jpeg2000.js │ ├── webp-lossless.js │ ├── webp-animation.js │ └── webp-alpha.js ├── vibration.js ├── media-source-extension-api.js ├── file │ ├── filesystem.js │ └── api.js ├── pointerlock-api.js ├── webanimations.js ├── crypto.js ├── gamepad.js ├── customevent.js ├── url │ ├── bloburls.js │ ├── urlsearchparams.js │ └── parser.js ├── intl.js ├── style │ └── scoped.js ├── inputsearchevent.js ├── input │ ├── formmethod.js │ ├── formaction.js │ ├── formtarget.js │ ├── formenctype.js │ └── formnovalidate.js ├── contextmenu.js ├── a │ └── download.js ├── fullscreen-api.js ├── blob.js ├── battery.js ├── quota-management-api.js ├── applicationcache.js ├── canvas.js ├── requestanimationframe.js ├── battery │ └── lowbattery.js ├── performance.js ├── emoji.js ├── htmlimports.js ├── messagechannel.js ├── templatestrings.js ├── canvas │ ├── winding.js │ ├── blending.js │ └── todataurl.js ├── websockets │ └── binary.js ├── webauthn │ └── publickeycredential.js ├── pagevisibility-api.js ├── websockets.js ├── web-intents.js ├── hiddenscroll.js ├── hashchange.js ├── event │ └── deviceorientation-motion.js ├── postmessage.js ├── typed-arrays.js ├── mathml.js ├── vml.js ├── contenteditable.js ├── geolocation.js └── cookies.js ├── package.json ├── index.js └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /lib/tests.js: -------------------------------------------------------------------------------- 1 | 2 | var tests = []; 3 | module.exports = tests; 4 | 5 | -------------------------------------------------------------------------------- /lib/classes.js: -------------------------------------------------------------------------------- 1 | 2 | var classes = []; 3 | module.exports = classes; 4 | 5 | -------------------------------------------------------------------------------- /lib/cssomPrefixes.js: -------------------------------------------------------------------------------- 1 | var ModernizrProto = require('./ModernizrProto.js'); 2 | var omPrefixes = require('./omPrefixes.js'); 3 | var cssomPrefixes = (ModernizrProto._config.usePrefixes ? omPrefixes.split(' ') : []); 4 | ModernizrProto._cssomPrefixes = cssomPrefixes; 5 | module.exports = cssomPrefixes; 6 | 7 | -------------------------------------------------------------------------------- /lib/docElement.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * docElement is a convenience wrapper to grab the root element of the document 4 | * 5 | * @access private 6 | * @returns {HTMLElement|SVGElement} The root element of the document 7 | */ 8 | var docElement = document.documentElement; 9 | module.exports = docElement; 10 | 11 | -------------------------------------------------------------------------------- /lib/isSVG.js: -------------------------------------------------------------------------------- 1 | var docElement = require('./docElement.js'); 2 | /** 3 | * A convenience helper to check if the document we are running in is an SVG document 4 | * 5 | * @access private 6 | * @returns {boolean} 7 | */ 8 | var isSVG = docElement.nodeName.toLowerCase() === 'svg'; 9 | 10 | module.exports = isSVG; 11 | 12 | -------------------------------------------------------------------------------- /test/video/loop.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "Video Loop Attribute", 4 | "property": "videoloop", 5 | "tags": ["video", "media"] 6 | } 7 | !*/ 8 | var Modernizr = require('./../../lib/Modernizr.js'); 9 | var createElement = require('./../../lib/createElement.js'); 10 | Modernizr.addTest('videoloop', 'loop' in createElement('video')); 11 | 12 | -------------------------------------------------------------------------------- /test/video/preload.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "Video Preload Attribute", 4 | "property": "videopreload", 5 | "tags": ["video", "media"] 6 | } 7 | !*/ 8 | var Modernizr = require('./../../lib/Modernizr.js'); 9 | var createElement = require('./../../lib/createElement.js'); 10 | Modernizr.addTest('videopreload', 'preload' in createElement('video')); 11 | 12 | -------------------------------------------------------------------------------- /test/webgl.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "WebGL", 4 | "property": "webgl", 5 | "caniuse": "webgl", 6 | "tags": ["webgl", "graphics"], 7 | "polyfills": ["jebgl", "cwebgl", "iewebgl"] 8 | } 9 | !*/ 10 | var Modernizr = require('./../lib/Modernizr.js'); 11 | Modernizr.addTest('webgl', function() { 12 | return 'WebGLRenderingContext' in window; 13 | }); 14 | 15 | -------------------------------------------------------------------------------- /test/css/mediaqueries.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "CSS Media Queries", 4 | "caniuse": "css-mediaqueries", 5 | "property": "mediaqueries", 6 | "tags": ["css"], 7 | "builderAliases": ["css_mediaqueries"] 8 | } 9 | !*/ 10 | var Modernizr = require('./../../lib/Modernizr.js'); 11 | var mq = require('./../../lib/mq.js'); 12 | Modernizr.addTest('mediaqueries', mq('only all')); 13 | 14 | -------------------------------------------------------------------------------- /test/css/reflections.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "CSS Reflections", 4 | "caniuse": "css-reflections", 5 | "property": "cssreflections", 6 | "tags": ["css"] 7 | } 8 | !*/ 9 | var Modernizr = require('./../../lib/Modernizr.js'); 10 | var testAllProps = require('./../../lib/testAllProps.js'); 11 | Modernizr.addTest('cssreflections', testAllProps('boxReflect', 'above', true)); 12 | 13 | -------------------------------------------------------------------------------- /test/css/transitions.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "CSS Transitions", 4 | "property": "csstransitions", 5 | "caniuse": "css-transitions", 6 | "tags": ["css"] 7 | } 8 | !*/ 9 | var Modernizr = require('./../../lib/Modernizr.js'); 10 | var testAllProps = require('./../../lib/testAllProps.js'); 11 | Modernizr.addTest('csstransitions', testAllProps('transition', 'all', true)); 12 | 13 | -------------------------------------------------------------------------------- /lib/slice.js: -------------------------------------------------------------------------------- 1 | var classes = require('./classes.js'); 2 | /** 3 | * slice exposes Array.prototype.slice to convert array-like objects to actual 4 | * arrays in a compact format without recreating new arrays over and over again 5 | * (which leads to decreased performance) 6 | * 7 | * @access private 8 | */ 9 | var slice = classes.slice; 10 | module.exports = slice; 11 | 12 | -------------------------------------------------------------------------------- /test/mediaquery/hovermq.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "Hover Media Query", 4 | "property": "hovermq" 5 | } 6 | !*/ 7 | /* DOC 8 | Detect support for Hover based media queries 9 | */ 10 | var Modernizr = require('./../../lib/Modernizr.js'); 11 | var addTest = require('./../../lib/addTest.js'); 12 | var mq = require('./../../lib/mq.js'); 13 | Modernizr.addTest('hovermq', mq('(hover)')); 14 | 15 | -------------------------------------------------------------------------------- /test/css/escape.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "CSS.escape()", 4 | "property": "cssescape", 5 | "polyfills": ["css-escape"], 6 | "tags": ["css", "cssom"] 7 | } 8 | !*/ 9 | /* DOC 10 | Tests for `CSS.escape()` support. 11 | */ 12 | var Modernizr = require('./../../lib/Modernizr.js'); 13 | var CSS = window.CSS; 14 | Modernizr.addTest('cssescape', CSS ? typeof CSS.escape === 'function' : false); 15 | 16 | -------------------------------------------------------------------------------- /test/dom/microdata.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "microdata", 4 | "property": "microdata", 5 | "tags": ["dom"], 6 | "builderAliases": ["dom_microdata"], 7 | "notes": [{ 8 | "name": "W3C Spec", 9 | "href": "https://www.w3.org/TR/microdata/" 10 | }] 11 | } 12 | !*/ 13 | var Modernizr = require('./../../lib/Modernizr.js'); 14 | Modernizr.addTest('microdata', 'getItems' in document); 15 | 16 | -------------------------------------------------------------------------------- /lib/mStyle.js: -------------------------------------------------------------------------------- 1 | var Modernizr = require('./Modernizr.js'); 2 | var modElem = require('./modElem.js'); 3 | var mStyle = { 4 | style: modElem.elem.style 5 | }; 6 | 7 | // kill ref for gc, must happen before mod.elem is removed, so we unshift on to 8 | // the front of the queue. 9 | Modernizr._q.unshift(function() { 10 | delete mStyle.style; 11 | }); 12 | 13 | module.exports = mStyle; 14 | 15 | -------------------------------------------------------------------------------- /test/window/framed.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "Framed window", 4 | "property": "framed", 5 | "tags": ["window"], 6 | "builderAliases": ["window_framed"] 7 | } 8 | !*/ 9 | /* DOC 10 | Tests if page is iframed. 11 | */ 12 | var Modernizr = require('./../../lib/Modernizr.js'); 13 | // github.com/Modernizr/Modernizr/issues/242 14 | 15 | Modernizr.addTest('framed', window.location !== top.location); 16 | 17 | -------------------------------------------------------------------------------- /test/css/ellipsis.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "CSS text-overflow ellipsis", 4 | "property": "ellipsis", 5 | "caniuse": "text-overflow", 6 | "polyfills": ["text-overflow"], 7 | "tags": ["css"] 8 | } 9 | !*/ 10 | var Modernizr = require('./../../lib/Modernizr.js'); 11 | var testAllProps = require('./../../lib/testAllProps.js'); 12 | Modernizr.addTest('ellipsis', testAllProps('textOverflow', 'ellipsis')); 13 | 14 | -------------------------------------------------------------------------------- /test/css/textshadow.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "CSS textshadow", 4 | "property": "textshadow", 5 | "caniuse": "css-textshadow", 6 | "tags": ["css"], 7 | "knownBugs": ["FF3.0 will false positive on this test"] 8 | } 9 | !*/ 10 | var Modernizr = require('./../../lib/Modernizr.js'); 11 | var testProp = require('./../../lib/testProp.js'); 12 | Modernizr.addTest('textshadow', testProp('textShadow', '1px 1px')); 13 | 14 | -------------------------------------------------------------------------------- /test/storage/websqldatabase.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "Web SQL Database", 4 | "property": "websqldatabase", 5 | "caniuse": "sql-storage", 6 | "tags": ["storage"] 7 | } 8 | !*/ 9 | var Modernizr = require('./../../lib/Modernizr.js'); 10 | // Chrome incognito mode used to throw an exception when using openDatabase 11 | // It doesn't anymore. 12 | Modernizr.addTest('websqldatabase', 'openDatabase' in window); 13 | 14 | -------------------------------------------------------------------------------- /lib/inputElem.js: -------------------------------------------------------------------------------- 1 | var createElement = require('./createElement.js'); 2 | /** 3 | * since we have a fairly large number of input tests that don't mutate the input 4 | * we create a single element that can be shared with all of those tests for a 5 | * minor perf boost 6 | * 7 | * @access private 8 | * @returns {HTMLInputElement} 9 | */ 10 | var inputElem = createElement('input'); 11 | module.exports = inputElem; 12 | 13 | -------------------------------------------------------------------------------- /test/audio/loop.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "Audio Loop Attribute", 4 | "property": "audioloop", 5 | "tags": ["audio", "media"] 6 | } 7 | !*/ 8 | /* DOC 9 | Detects if an audio element can automatically restart, once it has finished 10 | */ 11 | var Modernizr = require('./../../lib/Modernizr.js'); 12 | var createElement = require('./../../lib/createElement.js'); 13 | Modernizr.addTest('audioloop', 'loop' in createElement('audio')); 14 | 15 | -------------------------------------------------------------------------------- /test/mediaquery/pointermq.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "Pointer Media Query", 4 | "property": "pointermq" 5 | } 6 | !*/ 7 | /* DOC 8 | Detect support for Pointer based media queries 9 | */ 10 | var Modernizr = require('./../../lib/Modernizr.js'); 11 | var addTest = require('./../../lib/addTest.js'); 12 | var mq = require('./../../lib/mq.js'); 13 | Modernizr.addTest('pointermq', mq(('(pointer:coarse),(pointer:fine),(pointer:none)'))); 14 | 15 | -------------------------------------------------------------------------------- /lib/toStringFn.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Object.prototype.toString can be used with every object and allows you to 4 | * get its class easily. Abstracting it off of an object prevents situations 5 | * where the toString property has been overridden 6 | * 7 | * @access private 8 | * @function toStringFn 9 | * @returns {function} An abstracted toString function 10 | */ 11 | var toStringFn = ({}).toString; 12 | module.exports = toStringFn; 13 | 14 | -------------------------------------------------------------------------------- /lib/Modernizr.js: -------------------------------------------------------------------------------- 1 | var ModernizrProto = require('./ModernizrProto.js'); 2 | // Fake some of Object.create so we can force non test results to be non "own" properties. 3 | var Modernizr = function() {}; 4 | Modernizr.prototype = ModernizrProto; 5 | 6 | // Leak modernizr globally when you `require` it rather than force it here. 7 | // Overwrite name so constructor name is nicer :D 8 | Modernizr = new Modernizr(); 9 | 10 | module.exports = Modernizr; 11 | 12 | -------------------------------------------------------------------------------- /test/css/focuswithin.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "CSS :focus-within pseudo-selector", 4 | "caniuse": "css-focus-visible", 5 | "property": "focuswithin", 6 | "tags": ["css"] 7 | } 8 | !*/ 9 | var Modernizr = require('./../../lib/Modernizr.js'); 10 | Modernizr.addTest('focuswithin', function() { 11 | try { 12 | document.querySelector(':focus-within'); 13 | } catch (error) { 14 | return false; 15 | } 16 | return true; 17 | }); 18 | 19 | -------------------------------------------------------------------------------- /lib/modElem.js: -------------------------------------------------------------------------------- 1 | var Modernizr = require('./Modernizr.js'); 2 | var createElement = require('./createElement.js'); 3 | /** 4 | * Create our "modernizr" element that we do most feature tests on. 5 | * 6 | * @access private 7 | */ 8 | var modElem = { 9 | elem: createElement('modernizr') 10 | }; 11 | 12 | // Clean up this element 13 | Modernizr._q.push(function() { 14 | delete modElem.elem; 15 | }); 16 | 17 | module.exports = modElem; 18 | 19 | -------------------------------------------------------------------------------- /test/es6/contains.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "ES5 String.prototype.contains", 4 | "property": "contains", 5 | "authors": ["Robert Kowalski"], 6 | "tags": ["es6"] 7 | } 8 | !*/ 9 | /* DOC 10 | Check if browser implements ECMAScript 6 `String.prototype.contains` per specification. 11 | */ 12 | var Modernizr = require('./../../lib/Modernizr.js'); 13 | var is = require('./../../lib/is.js'); 14 | Modernizr.addTest('contains', is(String.prototype.contains, 'function')); 15 | 16 | -------------------------------------------------------------------------------- /test/css/borderimage.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "Border Image", 4 | "property": "borderimage", 5 | "caniuse": "border-image", 6 | "polyfills": ["css3pie"], 7 | "knownBugs": ["Android < 2.0 is true, but has a broken implementation"], 8 | "tags": ["css"] 9 | } 10 | !*/ 11 | var Modernizr = require('./../../lib/Modernizr.js'); 12 | var testAllProps = require('./../../lib/testAllProps.js'); 13 | Modernizr.addTest('borderimage', testAllProps('borderImage', 'url() 1', true)); 14 | 15 | -------------------------------------------------------------------------------- /test/speech/speech-synthesis.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "property": "speechsynthesis", 4 | "tags": ["input", "speech"], 5 | "authors": ["Cătălin Mariș"], 6 | "name": "Speech Synthesis API", 7 | "notes": [{ 8 | "name": "W3C Spec", 9 | "href": "https://w3c.github.io/speech-api/speechapi.html#tts-section" 10 | }] 11 | } 12 | !*/ 13 | 14 | var Modernizr = require('./../../lib/Modernizr.js'); 15 | Modernizr.addTest('speechsynthesis', 'SpeechSynthesisUtterance' in window); 16 | 17 | -------------------------------------------------------------------------------- /test/webrtc/peerconnection.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "RTC Peer Connection", 4 | "property": "peerconnection", 5 | "tags": ["webrtc"], 6 | "authors": ["Ankur Oberoi"], 7 | "notes": [{ 8 | "name": "W3C Spec", 9 | "href": "https://www.w3.org/TR/webrtc/" 10 | }] 11 | } 12 | !*/ 13 | var Modernizr = require('./../../lib/Modernizr.js'); 14 | var prefixed = require('./../../lib/prefixed.js'); 15 | Modernizr.addTest('peerconnection', !!prefixed('RTCPeerConnection', window)); 16 | 17 | -------------------------------------------------------------------------------- /test/css/boxshadow.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "Box Shadow", 4 | "property": "boxshadow", 5 | "caniuse": "css-boxshadow", 6 | "tags": ["css"], 7 | "knownBugs": [ 8 | "WebOS false positives on this test.", 9 | "The Kindle Silk browser false positives" 10 | ] 11 | } 12 | !*/ 13 | var Modernizr = require('./../../lib/Modernizr.js'); 14 | var testAllProps = require('./../../lib/testAllProps.js'); 15 | Modernizr.addTest('boxshadow', testAllProps('boxShadow', '1px 1px', true)); 16 | 17 | -------------------------------------------------------------------------------- /test/dart.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "Dart", 4 | "property": "dart", 5 | "authors": ["Theodoor van Donge"], 6 | "notes": [{ 7 | "name": "Language website", 8 | "href": "https://www.dartlang.org/" 9 | }] 10 | } 11 | !*/ 12 | /* DOC 13 | Detects native support for the Dart programming language. 14 | */ 15 | var Modernizr = require('./../lib/Modernizr.js'); 16 | var prefixed = require('./../lib/prefixed.js'); 17 | Modernizr.addTest('dart', !!prefixed('startDart', navigator)); 18 | 19 | -------------------------------------------------------------------------------- /test/network/fetch.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "Fetch API", 4 | "property": "fetch", 5 | "tags": ["network"], 6 | "caniuse": "fetch", 7 | "notes": [{ 8 | "name": "WHATWG Spec", 9 | "href": "https://fetch.spec.whatwg.org/" 10 | }], 11 | "polyfills": ["fetch"] 12 | } 13 | !*/ 14 | /* DOC 15 | Detects support for the fetch API, a modern replacement for XMLHttpRequest. 16 | */ 17 | var Modernizr = require('./../../lib/Modernizr.js'); 18 | Modernizr.addTest('fetch', 'fetch' in window); 19 | 20 | -------------------------------------------------------------------------------- /lib/is.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * is returns a boolean if the typeof an obj is exactly type. 4 | * 5 | * @access private 6 | * @function is 7 | * @param {*} obj - A thing we want to check the type of 8 | * @param {string} type - A string to compare the typeof against 9 | * @returns {boolean} true if the typeof the first parameter is exactly the specified type, false otherwise 10 | */ 11 | function is(obj, type) { 12 | return typeof obj === type; 13 | } 14 | 15 | module.exports = is; 16 | 17 | -------------------------------------------------------------------------------- /test/dom/classlist.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "classList", 4 | "caniuse": "classlist", 5 | "property": "classlist", 6 | "tags": ["dom"], 7 | "builderAliases": ["dataview_api"], 8 | "notes": [{ 9 | "name": "MDN Docs", 10 | "href": "https://developer.mozilla.org/en/DOM/element.classList" 11 | }] 12 | } 13 | !*/ 14 | var Modernizr = require('./../../lib/Modernizr.js'); 15 | var docElement = require('./../../lib/docElement.js'); 16 | Modernizr.addTest('classlist', 'classList' in docElement); 17 | 18 | -------------------------------------------------------------------------------- /test/css/flexboxlegacy.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "Flexbox (legacy)", 4 | "property": "flexboxlegacy", 5 | "tags": ["css"], 6 | "polyfills": ["flexie"], 7 | "notes": [{ 8 | "name": "The _old_ flexbox", 9 | "href": "https://www.w3.org/TR/2009/WD-css3-flexbox-20090723/" 10 | }] 11 | } 12 | !*/ 13 | var Modernizr = require('./../../lib/Modernizr.js'); 14 | var testAllProps = require('./../../lib/testAllProps.js'); 15 | Modernizr.addTest('flexboxlegacy', testAllProps('boxDirection', 'reverse', true)); 16 | 17 | -------------------------------------------------------------------------------- /test/elem/time.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "time Element", 4 | "property": "time", 5 | "tags": ["elem"], 6 | "builderAliases": ["elem_time"], 7 | "notes": [{ 8 | "name": "WHATWG Spec", 9 | "href": "https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-time-element" 10 | }] 11 | } 12 | !*/ 13 | var Modernizr = require('./../../lib/Modernizr.js'); 14 | var createElement = require('./../../lib/createElement.js'); 15 | Modernizr.addTest('time', 'valueAsDate' in createElement('time')); 16 | 17 | -------------------------------------------------------------------------------- /test/elem/output.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "output Element", 4 | "property": "outputelem", 5 | "tags": ["elem"], 6 | "builderAliases": ["elem_output"], 7 | "notes": [{ 8 | "name": "WhatWG Spec", 9 | "href": "https://html.spec.whatwg.org/multipage/form-elements.html#the-output-element" 10 | }] 11 | } 12 | !*/ 13 | var Modernizr = require('./../../lib/Modernizr.js'); 14 | var createElement = require('./../../lib/createElement.js'); 15 | Modernizr.addTest('outputelem', 'value' in createElement('output')); 16 | 17 | -------------------------------------------------------------------------------- /lib/roundedEquals.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * roundedEquals takes two integers and checks if the first is within 1 of the second 4 | * 5 | * @access private 6 | * @function roundedEquals 7 | * @param {number} a - first integer 8 | * @param {number} b - second integer 9 | * @returns {boolean} true if the first integer is within 1 of the second, false otherwise 10 | */ 11 | function roundedEquals(a, b) { 12 | return a - 1 === b || a === b || a + 1 === b; 13 | } 14 | 15 | module.exports = roundedEquals; 16 | 17 | -------------------------------------------------------------------------------- /test/es6/generators.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "ES6 Generators", 4 | "property": "generators", 5 | "authors": ["Michael Kachanovskyi"], 6 | "tags": ["es6"] 7 | } 8 | !*/ 9 | /* DOC 10 | Check if browser implements ECMAScript 6 Generators per specification. 11 | */ 12 | var Modernizr = require('./../../lib/Modernizr.js'); 13 | Modernizr.addTest('generators', function() { 14 | try { 15 | new Function('function* test() {}')(); 16 | } catch (e) { 17 | return false; 18 | } 19 | return true; 20 | }); 21 | 22 | -------------------------------------------------------------------------------- /test/es6/arrow.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "ES6 Arrow Functions", 4 | "property": "arrow", 5 | "authors": ["Vincent Riemer"], 6 | "tags": ["es6"] 7 | } 8 | !*/ 9 | /* DOC 10 | Check if browser implements ECMAScript 6 Arrow Functions per specification. 11 | */ 12 | var Modernizr = require('./../../lib/Modernizr.js'); 13 | Modernizr.addTest('arrow', function() { 14 | try { 15 | // eslint-disable-next-line 16 | eval('()=>{}'); 17 | } catch (e) { 18 | return false; 19 | } 20 | return true; 21 | }); 22 | 23 | -------------------------------------------------------------------------------- /test/forms/placeholder.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "placeholder attribute", 4 | "property": "placeholder", 5 | "tags": ["forms", "attribute"], 6 | "builderAliases": ["forms_placeholder"] 7 | } 8 | !*/ 9 | /* DOC 10 | Tests for placeholder attribute in inputs and textareas 11 | */ 12 | var Modernizr = require('./../../lib/Modernizr.js'); 13 | var createElement = require('./../../lib/createElement.js'); 14 | Modernizr.addTest('placeholder', ('placeholder' in createElement('input') && 'placeholder' in createElement('textarea'))); 15 | 16 | -------------------------------------------------------------------------------- /test/script/async.js: -------------------------------------------------------------------------------- 1 | /*! 2 | { 3 | "name": "script[async]", 4 | "property": "scriptasync", 5 | "caniuse": "script-async", 6 | "tags": ["script"], 7 | "builderAliases": ["script_async"], 8 | "authors": ["Theodoor van Donge"] 9 | } 10 | !*/ 11 | /* DOC 12 | Detects support for the `async` attribute on the `