https://www.allianztravelinsurance.com/v_40103979927851/system/master/core_js/vendorlib/modernizr.js
1/* Modernizr 2.6.3 (Custom Build) | MIT & BSD 2 * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderradius-boxshadow-flexbox-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-input-inputtypes-touch-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-cookies-css_backgroundposition_shorthand-css_backgroundposition_xy-css_backgroundrepeat-css_backgroundsizecover-css_boxsizing-css_lastchild-css_mediaqueries-css_resize-css_scrollbars-css_userselect-forms_fileinput-forms_formattribute-forms_placeholder-forms_speechinput-forms_validation 3 */ 4; 5window.Modernizr = (function( window, document, undefined ) { 6 7 var version = '2.6.3', 8 9 Modernizr = {}, 10 11 enableClasses = true, 12 13 docElement = document.documentElement, 14 15 mod = 'modernizr', 16 modElem = document.createElement(mod), 17 mStyle = modElem.style, 18 19 inputElem = document.createElement('input') , 20 21 smile = ':)', 22 23 toString = {}.toString, 24 25 prefixes = ' -webkit- -moz- -o- -ms- '.split(' '), 26 27 28 29 omPrefixes = 'Webkit Moz O ms', 30 31 cssomPrefixes = omPrefixes.split(' '), 32 33 domPrefixes = omPrefixes.toLowerCase().split(' '), 34 35 36 tests = {}, 37 inputs = {}, 38 attrs = {}, 39 40 classes = [], 41 42 slice = classes.slice, 43 44 featureName, 45 46 47 injectElementWithStyles = function( rule, callback, nodes, testnames ) { 48 49 var style, ret, node, docOverflow, 50 div = document.createElement('div'), 51 body = document.body, 52 fakeBody = body || document.createElement('body'); 53 54 if ( parseInt(nodes, 10) ) { 55 while ( nodes-- ) { 56 node = document.createElement('div'); 57 node.id = testnames ? testnames[nodes] : mod + (nodes + 1); 58 div.appendChild(node); 59 } 60 } 61 62 style = ['­','<style id="s', mod, '">', rule, '</style>'].join(''); 63 div.id = mod; 64 (body ? div : fakeBody).innerHTML += style; 65 fakeBody.appendChild(div); 66 if ( !body ) { 67 fakeBody.style.background = ''; 68 fakeBody.style.overflow = 'hidden'; 69 docOverflow = docElement.style.overflow; 70 docElement.style.overflow = 'hidden'; 71 docElement.appendChild(fakeBody); 72 } 73 74 ret = callback(div, rule); 75 if ( !body ) { 76 fakeBody.parentNode.removeChild(fakeBody); 77 docElement.style.overflow = docOverflow; 78 } else { 79 div.parentNode.removeChild(div); 80 } 81 82 return !!ret; 83 84 }, 85 86 testMediaQuery = function( mq ) { 87 88 var matchMedia = window.matchMedia || window.msMatchMedia; 89 if ( matchMedia ) { 90 return matchMedia(mq).matches; 91 } 92 93 var bool; 94 95 injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) { 96 bool = (window.getComputedStyle ? 97 getComputedStyle(node, null) : 98 node.currentStyle)['position'] == 'absolute'; 99 }); 100 101 return bool; 102 103 }, 104 105 106 isEventSupported = (function() { 107 108 var TAGNAMES = { 109 'select': 'input', 'change': 'input', 110 'submit': 'form', 'reset': 'form', 111 'error': 'img', 'load': 'img', 'abort': 'img' 112 }; 113 114 function isEventSupported( eventName, element ) { 115 116 element = element || document.createElement(TAGNAMES[eventName] || 'div'); 117 eventName = 'on' + eventName; 118 119 var isSupported = eventName in element; 120 121 if ( !isSupported ) { 122 if ( !element.setAttribute ) { 123 element = document.createElement('div'); 124 } 125 if ( element.setAttribute && element.removeAttribute ) { 126 element.setAttribute(eventName, ''); 127 isSupported = is(element[eventName], 'function'); 128 129 if ( !is(element[eventName], 'undefined') ) { 130 element[eventName] = undefined; 131 } 132 element.removeAttribute(eventName); 133 } 134 } 135 136 element = null; 137 return isSupported; 138 } 139 return isEventSupported; 140 })(), 141 142 143 _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp; 144 145 if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) { 146 hasOwnProp = function (object, property) { 147 return _hasOwnProperty.call(object, property); 148 }; 149 } 150 else { 151 hasOwnProp = function (object, property) { 152 return ((property in object) && is(object.constructor.prototype[property], 'undefined')); 153 }; 154 } 155 156 157 if (!Function.prototype.bind) { 158 Function.prototype.bind = function bind(that) { 159 160 var target = this; 161 162 if (typeof target != "function") { 163 throw new TypeError(); 164 } 165 166 var args = slice.call(arguments, 1), 167 bound = function () { 168 169 if (this instanceof bound) { 170 171 var F = function(){}; 172 F.prototype = target.prototype; 173 var self = new F(); 174 175 var result = target.apply( 176 self, 177 args.concat(slice.call(arguments)) 178 ); 179 if (Object(result) === result) { 180 return result; 181 } 182 return self; 183 184 } else { 185 186 return target.apply( 187 that, 188 args.concat(slice.call(arguments)) 189 ); 190 191 } 192 193 }; 194 195 return bound; 196 }; 197 } 198 199 function setCss( str ) { 200 mStyle.cssText = str; 201 } 202 203 function setCssAll( str1, str2 ) { 204 return setCss(prefixes.join(str1 + ';') + ( str2 || '' )); 205 } 206 207 function is( obj, type ) { 208 return typeof obj === type; 209 } 210 211 function contains( str, substr ) {
212 return !!~('' + str).indexOf(substr); 213 } 214 215 function testProps( props, prefixed ) { 216 for ( var i in props ) { 217 var prop = props[i]; 218 if ( !contains(prop, "-") && mStyle[prop] !== undefined ) { 219 return prefixed == 'pfx' ? prop : true; 220 } 221 } 222 return false; 223 } 224 225 function testDOMProps( props, obj, elem ) { 226 for ( var i in props ) { 227 var item = obj[props[i]]; 228 if ( item !== undefined) { 229 230 if (elem === false) return props[i]; 231 232 if (is(item, 'function')){ 233 return item.bind(elem || obj); 234 } 235 236 return item; 237 } 238 } 239 return false; 240 } 241 242 function testPropsAll( prop, prefixed, elem ) { 243 244 var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1), 245 props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' '); 246 247 if(is(prefixed, "string") || is(prefixed, "undefined")) { 248 return testProps(props, prefixed); 249 250 } else { 251 props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' '); 252 return testDOMProps(props, prefixed, elem); 253 } 254 } tests['flexbox'] = function() { 255 return testPropsAll('flexWrap'); 256 }; 257 tests['touch'] = function() { 258 var bool; 259 260 if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) { 261 bool = true; 262 } else { 263 injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) { 264 bool = node.offsetTop === 9; 265 }); 266 } 267 268 return bool; 269 }; tests['rgba'] = function() { 270 setCss('background-color:rgba(150,255,150,.5)'); 271 272 return contains(mStyle.backgroundColor, 'rgba'); 273 }; 274 275 276 tests['multiplebgs'] = function() { 277 setCss('background:url(https://),url(https://),red url(https://)'); 278 279 return (/(url\s*\(.*?){3}/).test(mStyle.background); 280 }; tests['backgroundsize'] = function() { 281 return testPropsAll('backgroundSize'); 282 };
282 tests['borderradius'] = function() { 283 return testPropsAll('borderRadius'); 284 }; 285 286 tests['boxshadow'] = function() { 287 return testPropsAll('boxShadow'); 288 }; 289 290 tests['textshadow'] = function() { 291 return document.createElement('div').style.textShadow === ''; 292 }; 293 294 295 tests['opacity'] = function() { 296 setCssAll('opacity:.55'); 297 298 return (/^0.55$/).test(mStyle.opacity); 299 }; 300 301 302 tests['cssanimations'] = function() { 303 return testPropsAll('animationName'); 304 }; 305 306 307 tests['csscolumns'] = function() { 308 return testPropsAll('columnCount'); 309 }; 310 311 312 tests['cssgradients'] = function() { 313 var str1 = 'background-image:', 314 str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));', 315 str3 = 'linear-gradient(left top,#9f9, white);'; 316 317 setCss( 318 (str1 + '-webkit- '.split(' ').join(str2 + str1) + 319 prefixes.join(str3 + str1)).slice(0, -str1.length) 320 ); 321 322 return contains(mStyle.backgroundImage, 'gradient'); 323 }; 324 325 326 tests['cssreflections'] = function() { 327 return testPropsAll('boxReflect'); 328 }; 329 330 331 tests['csstransforms'] = function() { 332 return !!testPropsAll('transform'); 333 }; 334 335 336 tests['csstransforms3d'] = function() { 337 338 var ret = !!testPropsAll('perspective'); 339 340 if ( ret && 'webkitPerspective' in docElement.style ) { 341 342 injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) { 343 ret = node.offsetLeft === 9 && node.offsetHeight === 3; 344 }); 345 } 346 return ret; 347 }; 348 349 350 tests['csstransitions'] = function() { 351 return testPropsAll('transition'); 352 }; 353 354 355 356 tests['fontface'] = function() { 357 var bool; 358 359 injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) { 360 var style = document.getElementById('smodernizr'), 361 sheet = style.sheet || style.styleSheet, 362 cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : ''; 363 364 bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0; 365 }); 366 367 return bool; 368 }; 369 370 tests['generatedcontent'] = function() { 371 var bool; 372 373 injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1 a}'].join(''), function( node ) { 374 bool = node.offsetHeight >= 3; 375 }); 376 377 return bool; 378 }; 379 function webforms() { 380 Modernizr['input'] = (function( props ) { 381 for ( var i = 0, len = props.length; i < len; i++ ) { 382 attrs[ props[i] ] = !!(props[i] in inputElem); 383 } 384 if (attrs.list){ 385 attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement); 386 } 387 return attrs; 388 })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ')); 389 Modernizr['inputtypes'] = (function(props) { 390 391 for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) { 392 393 inputElem.setAttribute('type', inputElemType = props[i]); 394 bool = inputElem.type !== 'text'; 395 396 if ( bool ) { 397 398 inputElem.value = smile; 399 inputElem.style.cssText = 'position:absolute;visibility:hidden;'; 400 401 if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) { 402 403 docElement.appendChild(inputElem); 404 defaultView = document.defaultView; 405 406 bool = defaultView.getComputedStyle && 407 defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' && 408 (inputElem.offsetHeight !== 0); 409 410 docElement.removeChild(inputElem); 411 412 } else if ( /^(search|tel)$/.test(inputElemType) ){ 413 } else if ( /^(url|email)$/.test(inputElemType) ) { 414 bool = inputElem.checkValidity && inputElem.checkValidity() === false; 415 416 } else { 417 bool = inputElem.value != smile; 418 } 419 } 420 421 inputs[ props[i] ] = !!bool; 422 }
423 return inputs; 424 })('search tel url email datetime date month week time datetime-local number range color'.split(' ')); 425 } 426 for ( var feature in tests ) { 427 if ( hasOwnProp(tests, feature) ) { 428 featureName = feature.toLowerCase(); 429 Modernizr[featureName] = tests[feature](); 430 431 classes.push((Modernizr[featureName] ? '' : 'no-') + featureName); 432 } 433 } 434 435 Modernizr.input || webforms(); 436 437 438 Modernizr.addTest = function ( feature, test ) { 439 if ( typeof feature == 'object' ) { 440 for ( var key in feature ) { 441 if ( hasOwnProp( feature, key ) ) { 442 Modernizr.addTest( key, feature[ key ] ); 443 } 444 } 445 } else { 446 447 feature = feature.toLowerCase(); 448 449 if ( Modernizr[feature] !== undefined ) { 450 return Modernizr; 451 } 452 453 test = typeof test == 'function' ? test() : test; 454 455 if (typeof enableClasses !== "undefined" && enableClasses) { 456 docElement.className += ' ' + (test ? '' : 'no-') + feature; 457 } 458 Modernizr[feature] = test; 459 460 } 461 462 return Modernizr; 463 }; 464 465 466 setCss(''); 467 modElem = inputElem = null; 468 469 470 Modernizr._version = version; 471 472 Modernizr._prefixes = prefixes; 473 Modernizr._domPrefixes = domPrefixes; 474 Modernizr._cssomPrefixes = cssomPrefixes; 475 476 Modernizr.mq = testMediaQuery; 477 478 Modernizr.hasEvent = isEventSupported; 479 480 Modernizr.testProp = function(prop){ 481 return testProps([prop]); 482 }; 483 484 Modernizr.testAllProps = testPropsAll; 485 486 487 Modernizr.testStyles = injectElementWithStyles; 488 Modernizr.prefixed = function(prop, obj, elem){ 489 if(!obj) { 490 return testPropsAll(prop, 'pfx'); 491 } else { 492 return testPropsAll(prop, obj, elem); 493 } 494 }; 495 496 497 docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') + 498 499 (enableClasses ? ' js ' + classes.join(' ') : ''); 500 501 return Modernizr; 502 503})(this, this.document); 504 505// by tauren 506// https://github.com/Modernizr/Modernizr/issues/191 507 508Modernizr.addTest('cookies', function () { 509 // Quick test if browser has cookieEnabled host property 510 if (navigator.cookieEnabled) return true; 511 // Create cookie 512 document.cookie = "cookietest=1"; 513 var ret = document.cookie.indexOf("cookietest=") != -1; 514 // Delete cookie 515 document.cookie = "cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT"; 516 return ret; 517}); 518 519/* 520 https://developer.mozilla.org/en/CSS/background-position 521 http://www.w3.org/TR/css3-background/#background-position 522 523 Example: http://jsfiddle.net/Blink/bBXvt/ 524*/ 525 526(function() { 527 528 var elem = document.createElement('a'), 529 eStyle = elem.style, 530 val = "right 10px bottom 10px"; 531 532 Modernizr.addTest('bgpositionshorthand', function(){ 533 eStyle.cssText = "background-position: " + val + ";"; 534 return (eStyle.backgroundPosition === val); 535 }); 536 537}()); 538// developer.mozilla.org/en/CSS/background-repeat 539 540// test page: jsbin.com/uzesun/ 541// http://jsfiddle.net/ryanseddon/yMLTQ/6/ 542 543(function(){ 544 545 546function getBgRepeatValue(elem){ 547 return (window.getComputedStyle ? 548 getComputedStyle(elem, null).getPropertyValue('background') : 549 elem.currentStyle['background']); 550} 551 552 553Modernizr.testStyles(' #modernizr { background-repeat: round; } ', function(elem, rule){ 554 555 Modernizr.addTest('bgrepeatround', getBgRepeatValue(elem) == 'round'); 556 557}); 558 559 560 561Modernizr.testStyles(' #modernizr { background-repeat: space; } ', function(elem, rule){ 562 563 Modernizr.addTest('bgrepeatspace', getBgRepeatValue(elem) == 'space'); 564 565}); 566 567 568})(); 569/* 570 Allan Lei https://github.com/allanlei 571 572 Check adapted from https://github.com/brandonaaron/jquery-cssHooks/blob/master/bgpos.js 573 574 Test: http://jsfiddle.net/allanlei/R8AYS/ 575*/ 576Modernizr.addTest('bgpositionxy', function() { 577 return Modernizr.testStyles('#modernizr {background-position: 3px 5px;}', function(elem) { 578 var cssStyleDeclaration = window.getComputedStyle ? getComputedStyle(elem, null) : elem.currentStyle; 579 var xSupport = (cssStyleDeclaration.backgroundPositionX == '3px') || (cssStyleDeclaration['background-position-x'] == '3px'); 580 var ySupport = (cssStyleDeclaration.backgroundPositionY == '5px') || (cssStyleDeclaration['background-position-y'] == '5px'); 581 return xSupport && ySupport; 582 }); 583}); 584// developer.mozilla.org/en/CSS/background-size 585 586Modernizr.testStyles( '#modernizr{background-size:cover}', function( elem ) { 587 var style = window.getComputedStyle ? 588 window.getComputedStyle( elem, null ) 589 : elem.currentStyle; 590 591 Modernizr.addTest( 'bgsizecover', style.backgroundSize == 'cover' ); 592}); 593// developer.mozilla.org/en/CSS/box-sizing 594// github.com/Modernizr/Modernizr/issues/248 595 596Modernizr.addTest("boxsizing",function(){ 597 return Modernizr.testAllProps("boxSizing") && (document.documentMode === undefined || document.documentMode > 7); 598}); 599 600 601// last-child pseudo selector
602// https://github.com/Modernizr/Modernizr/pull/304 603 604 605Modernizr.addTest('lastchild', function(){ 606 607 return Modernizr.testStyles("#modernizr div {width:100px} #modernizr :last-child{width:200px;display:block}", function (elem) { 608 return elem.lastChild.offsetWidth > elem.firstChild.offsetWidth; 609 }, 2); 610 611}); 612 613 614// Detects whether input type="file" is available on the platform 615// E.g. iOS < 6 and some android version don't support this 616 617// It's useful if you want to hide the upload feature of your app on devices that 618// don't support it (iphone, ipad, etc). 619 620Modernizr.addTest('fileinput', function() { 621 var elem = document.createElement('input'); 622 elem.type = 'file'; 623 return !elem.disabled; 624}); 625 626 627Modernizr.addTest('mediaqueries', Modernizr.mq('only all')); 628// Test for CSS 3 UI "resize" property 629// http://www.w3.org/TR/css3-ui/#resize 630// https://developer.mozilla.org/en/CSS/resize 631 632Modernizr.addTest('cssresize', Modernizr.testAllProps('resize')); 633 634 635// -moz-user-select:none test. 636 637// by ryan seddon 638//https://github.com/Modernizr/Modernizr/issues/250 639 640 641Modernizr.addTest("userselect",function(){ 642 return Modernizr.testAllProps("user-select"); 643}); 644 645// Detects whether input form="form_id" is available on the platform 646// E.g. IE 10 (and below), don't support this 647Modernizr.addTest("formattribute", function() { 648 var form = document.createElement("form"), 649 input = document.createElement("input"), 650 div = document.createElement("div"), 651 id = "formtest"+(new Date().getTime()), 652 attr, 653 bool = false;
654 655 form.id = id; 656 657 //IE6/7 confuses the form idl attribute and the form content attribute 658 if(document.createAttribute){ 659 attr = document.createAttribute("form"); 660 attr.nodeValue = id; 661 input.setAttributeNode(attr); 662 div.appendChild(form); 663 div.appendChild(input); 664 665 document.documentElement.appendChild(div); 666 667 bool = form.elements.length === 1 && input.form == form; 668 669 div.parentNode.removeChild(div); 670 } 671 672 return bool; 673});// Stylable scrollbars detection 674Modernizr.addTest('cssscrollbar', function() { 675 676 var bool, 677 678 styles = "#modernizr{overflow: scroll; width: 40px }#" + 679 Modernizr._prefixes 680 .join("scrollbar{width:0px}"+' #modernizr::') 681 .split('#') 682 .slice(1) 683 .join('#') + "scrollbar{width:0px}"; 684 685 Modernizr.testStyles(styles, function(node) { 686 bool = 'scrollWidth' in node && node.scrollWidth == 40; 687 }); 688 689 return bool; 690 691}); 692// speech input for inputs 693// by @alrra 694 695 696// `webkitSpeech` in elem 697// doesn`t work correctly in all versions of Chromium based browsers. 698// It can return false even if they have support for speech i.imgur.com/2Y40n.png 699// Testing with 'onwebkitspeechchange' seems to fix this problem 700 701// this detect only checks the webkit version because
702// the speech attribute is likely to be deprecated in favor of a JavaScript API. 703// http://lists.w3.org/Archives/Public/public-webapps/2011OctDec/att-1696/speechapi.html 704 705// FIXME: add support for detecting the new spec'd behavior 706 707Modernizr.addTest('speechinput', function(){ 708 var elem = document.createElement('input'); 709 return 'speech' in elem || 'onwebkitspeechchange' in elem; 710});// This implementation only tests support for interactive form validation. 711// To check validation for a specific type or a specific other constraint, 712// the test can be combined: 713// - Modernizr.inputtypes.numer && Modernizr.formvalidation (browser supports rangeOverflow, typeMismatch etc. for type=number) 714// - Modernizr.input.required && Modernizr.formvalidation (browser supports valueMissing) 715// 716(function(document, Modernizr){ 717 718 719Modernizr.formvalidationapi = false; 720Modernizr.formvalidationmessage = false; 721 722Modernizr.addTest('formvalidation', function(){ 723 var form = document.createElement('form'); 724 if ( !('checkValidity' in form) ) { 725 return false; 726 } 727 var body = document.body, 728 729 html = document.documentElement, 730 731 bodyFaked = false, 732 733 invaildFired = false, 734 735 input; 736 737 Modernizr.formvalidationapi = true; 738 739 // Prevent form from being submitted 740 form.onsubmit = function(e) { 741 //Opera does not validate form, if submit is prevented 742 if ( !window.opera ) { 743 e.preventDefault(); 744 } 745 e.stopPropagation(); 746 }; 747 748 // Calling form.submit() doesn't trigger interactive validation, 749 // use a submit button instead 750 //older opera browsers need a name attribute 751 form.innerHTML = '<input name="modTest" required><button></button>'; 752 753 // FF4 doesn't trigger "invalid" event if form is not in the DOM tree 754 // Chrome throws error if invalid input is not visible when submitting 755 form.style.position = 'absolute'; 756 form.style.top = '-99999em'; 757 758 // We might in <head> in which case we need to create body manually 759 if ( !body ) { 760 bodyFaked = true; 761 body = document.createElement('body'); 762 //avoid crashing IE8, if background image is used 763 body.style.background = ""; 764 html.appendChild(body); 765 } 766 767 body.appendChild(form); 768 769 input = form.getElementsByTagName('input')[0]; 770 771 // Record whether "invalid" event is fired 772 input.oninvalid = function(e) { 773 invaildFired = true; 774 e.preventDefault(); 775 e.stopPropagation(); 776 }; 777 778 //Opera does not fully support the validationMessage property 779 Modernizr.formvalidationmessage = !!input.validationMessage; 780 781 // Submit form by clicking submit button 782 form.getElementsByTagName('button')[0].click(); 783 784 // Don't forget to clean up 785 body.removeChild(form); 786 bodyFaked && html.removeChild(body); 787 788 return invaildFired; 789}); 790 791 792})(document, window.Modernizr);// testing for placeholder attribute in inputs and textareas 793// re-using Modernizr.input if available 794 795Modernizr.addTest('placeholder', function(){ 796 797 return !!( 'placeholder' in ( Modernizr.input || document.createElement('input') ) && 798 'placeholder' in ( Modernizr.textarea || document.createElement('textarea') ) 799 ); 800 801}); 802;
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.