webshims-rails 1.14.4 → 1.14.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Rakefile +58 -0
  4. data/lib/webshims-rails/version.rb +2 -2
  5. data/vendor/assets/javascripts/webshims/polyfiller.js +45 -26
  6. data/vendor/assets/javascripts/webshims/shims/combos/1.js +18 -5
  7. data/vendor/assets/javascripts/webshims/shims/combos/10.js +26 -22
  8. data/vendor/assets/javascripts/webshims/shims/combos/11.js +24 -21
  9. data/vendor/assets/javascripts/webshims/shims/combos/12.js +4 -0
  10. data/vendor/assets/javascripts/webshims/shims/combos/13.js +4 -0
  11. data/vendor/assets/javascripts/webshims/shims/combos/14.js +0 -1
  12. data/vendor/assets/javascripts/webshims/shims/combos/15.js +17 -7
  13. data/vendor/assets/javascripts/webshims/shims/combos/16.js +21 -7
  14. data/vendor/assets/javascripts/webshims/shims/combos/17.js +24 -22
  15. data/vendor/assets/javascripts/webshims/shims/combos/18.js +122 -97
  16. data/vendor/assets/javascripts/webshims/shims/combos/2.js +20 -6
  17. data/vendor/assets/javascripts/webshims/shims/combos/21.js +4 -3
  18. data/vendor/assets/javascripts/webshims/shims/combos/23.js +4 -0
  19. data/vendor/assets/javascripts/webshims/shims/combos/25.js +7 -5
  20. data/vendor/assets/javascripts/webshims/shims/combos/26.js +1 -1
  21. data/vendor/assets/javascripts/webshims/shims/combos/27.js +29 -9
  22. data/vendor/assets/javascripts/webshims/shims/combos/28.js +1 -2
  23. data/vendor/assets/javascripts/webshims/shims/combos/29.js +0 -1
  24. data/vendor/assets/javascripts/webshims/shims/combos/3.js +16 -6
  25. data/vendor/assets/javascripts/webshims/shims/combos/30.js +16 -6
  26. data/vendor/assets/javascripts/webshims/shims/combos/31.js +16 -6
  27. data/vendor/assets/javascripts/webshims/shims/combos/33.js +0 -1
  28. data/vendor/assets/javascripts/webshims/shims/combos/34.js +2 -1
  29. data/vendor/assets/javascripts/webshims/shims/combos/4.js +2 -1
  30. data/vendor/assets/javascripts/webshims/shims/combos/5.js +24 -22
  31. data/vendor/assets/javascripts/webshims/shims/combos/6.js +24 -22
  32. data/vendor/assets/javascripts/webshims/shims/combos/7.js +20 -6
  33. data/vendor/assets/javascripts/webshims/shims/combos/8.js +20 -6
  34. data/vendor/assets/javascripts/webshims/shims/combos/9.js +26 -22
  35. data/vendor/assets/javascripts/webshims/shims/combos/97.js +0 -24
  36. data/vendor/assets/javascripts/webshims/shims/combos/98.js +22 -25
  37. data/vendor/assets/javascripts/webshims/shims/combos/99.js +22 -25
  38. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +2 -1
  39. data/vendor/assets/javascripts/webshims/shims/filereader.js +1 -1
  40. data/vendor/assets/javascripts/webshims/shims/form-core.js +14 -5
  41. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +8 -4
  42. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +0 -1
  43. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +24 -21
  44. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1 -1
  45. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +28 -8
  46. data/vendor/assets/javascripts/webshims/shims/form-validation.js +17 -20
  47. data/vendor/assets/javascripts/webshims/shims/form-validators.js +17 -10
  48. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +3 -3
  49. data/vendor/assets/javascripts/webshims/shims/jme/base.js +0 -24
  50. data/vendor/assets/javascripts/webshims/shims/jme/controls.css +23 -9
  51. data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +21 -3
  52. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +13 -4
  53. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols.js +22 -1
  54. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +4 -0
  55. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +4 -3
  56. data/vendor/assets/javascripts/webshims/shims/picture.js +122 -97
  57. data/vendor/assets/javascripts/webshims/shims/plugins/jquery.ui.position.js +470 -452
  58. data/vendor/assets/javascripts/webshims/shims/sizzle.js +35 -27
  59. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +10 -2
  60. data/vendor/assets/javascripts/webshims/shims/styles/forms-picker.css +1 -1
  61. data/vendor/assets/javascripts/webshims/shims/styles/scss/_api-forms-ext.scss +10 -0
  62. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +4 -2
  63. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-picker.scss +1 -1
  64. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +6 -24
  65. data/vendor/assets/javascripts/webshims/shims/styles/shim-ext.css +15 -21
  66. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +5 -19
  67. data/vendor/assets/javascripts/webshims/shims/track-ui.js +2 -2
  68. metadata +2 -3
  69. data/vendor/assets/javascripts/webshims/shims/promise.js +0 -684
@@ -754,6 +754,10 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
754
754
  webshims.ready(swfType, initMediaElements);
755
755
  }
756
756
  webshims.ready('track', loadTrackUi);
757
+
758
+ if(document.readyState == 'complete'){
759
+ webshims.isReady('WINDOWLOAD', true);
760
+ }
757
761
  });
758
762
 
759
763
  })(webshims);
@@ -531,6 +531,10 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
531
531
  webshims.ready(swfType, initMediaElements);
532
532
  }
533
533
  webshims.ready('track', loadTrackUi);
534
+
535
+ if(document.readyState == 'complete'){
536
+ webshims.isReady('WINDOWLOAD', true);
537
+ }
534
538
  });
535
539
 
536
540
  })(webshims);
@@ -553,7 +553,6 @@ webshims.register('form-native-extend', function($, webshims, window, doc, undef
553
553
  }
554
554
 
555
555
  var nan = parseInt('NaN', 10),
556
- doc = document,
557
556
  typeModels = webshims.inputTypes,
558
557
  isNumber = function(string){
559
558
  return (typeof string == 'number' || (string && string == string * 1));
@@ -549,8 +549,9 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
549
549
  webshims.warn(type +' already implemented for element #'+elem.id);
550
550
  return false;
551
551
  }
552
+
552
553
  data[type] = true;
553
- return true;
554
+ return !$(elem).hasClass('ws-nopolyfill');
554
555
  },
555
556
  extendUNDEFProp: function(obj, props){
556
557
  $.each(props, function(name, prop){
@@ -1239,6 +1240,9 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1239
1240
  };
1240
1241
  var lazyLoad = function(){
1241
1242
  var toLoad = ['form-validation'];
1243
+
1244
+ $(document).off('.lazyloadvalidation');
1245
+
1242
1246
  if(options.lazyCustomMessages){
1243
1247
  options.customMessages = true;
1244
1248
  toLoad.push('form-message');
@@ -1253,7 +1257,6 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1253
1257
  toLoad.push('form-validators');
1254
1258
  }
1255
1259
  webshims.reTest(toLoad);
1256
- $(document).off('.lazyloadvalidation');
1257
1260
  };
1258
1261
  /*
1259
1262
  * Selectors for all browsers
@@ -1310,11 +1313,11 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1310
1313
  };
1311
1314
  $.extend(exp, {
1312
1315
  "enabled": function( elem ) {
1313
- return elem.disabled === false && !$(elem).is('fieldset[disabled] *');
1316
+ return 'disabled' in elem && elem.disabled === false && !$.find.matchesSelector(elem, 'fieldset[disabled] *');
1314
1317
  },
1315
1318
 
1316
1319
  "disabled": function( elem ) {
1317
- return elem.disabled === true || ('disabled' in elem && $(elem).is('fieldset[disabled] *'));
1320
+ return elem.disabled === true || ('disabled' in elem && $.find.matchesSelector(elem, 'fieldset[disabled] *'));
1318
1321
  }
1319
1322
  });
1320
1323
  }
@@ -1493,8 +1496,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1493
1496
  };
1494
1497
 
1495
1498
 
1496
-
1497
- $(document).on('focusin.lazyloadvalidation', function(e){
1499
+ $(document).on('focusin.lazyloadvalidation mousedown.lazyloadvalidation touchstart.lazyloadvalidation', function(e){
1498
1500
  if('form' in e.target){
1499
1501
  lazyLoad();
1500
1502
  }
@@ -1525,6 +1527,14 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1525
1527
  });
1526
1528
  }
1527
1529
  });
1530
+
1531
+ if(options.addValidators && options.fastValidators){
1532
+ webshims.reTest(['form-validators', 'form-validation']);
1533
+ }
1534
+
1535
+ if(document.readyState == 'complete'){
1536
+ webshims.isReady('WINDOWLOAD', true);
1537
+ }
1528
1538
  });
1529
1539
  ;webshims.register('form-shim-extend', function($, webshims, window, document, undefined, options){
1530
1540
  "use strict";
@@ -1920,7 +1930,7 @@ var rsubmittable = /^(?:select|textarea|input)/i;
1920
1930
  ;
1921
1931
  return function(){
1922
1932
  var elem = $(this).getNativeElement()[0];
1923
- return !!(!elem.readOnly && !types[elem.type] && !$(elem).is(':disabled') );
1933
+ return !!(!elem.readOnly && !types[elem.type] && !$.find.matchesSelector(elem, ':disabled') );
1924
1934
  };
1925
1935
  })()
1926
1936
  },
@@ -772,8 +772,9 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
772
772
  webshims.warn(type +' already implemented for element #'+elem.id);
773
773
  return false;
774
774
  }
775
+
775
776
  data[type] = true;
776
- return true;
777
+ return !$(elem).hasClass('ws-nopolyfill');
777
778
  },
778
779
  extendUNDEFProp: function(obj, props){
779
780
  $.each(props, function(name, prop){
@@ -1462,6 +1463,9 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1462
1463
  };
1463
1464
  var lazyLoad = function(){
1464
1465
  var toLoad = ['form-validation'];
1466
+
1467
+ $(document).off('.lazyloadvalidation');
1468
+
1465
1469
  if(options.lazyCustomMessages){
1466
1470
  options.customMessages = true;
1467
1471
  toLoad.push('form-message');
@@ -1476,7 +1480,6 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1476
1480
  toLoad.push('form-validators');
1477
1481
  }
1478
1482
  webshims.reTest(toLoad);
1479
- $(document).off('.lazyloadvalidation');
1480
1483
  };
1481
1484
  /*
1482
1485
  * Selectors for all browsers
@@ -1533,11 +1536,11 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1533
1536
  };
1534
1537
  $.extend(exp, {
1535
1538
  "enabled": function( elem ) {
1536
- return elem.disabled === false && !$(elem).is('fieldset[disabled] *');
1539
+ return 'disabled' in elem && elem.disabled === false && !$.find.matchesSelector(elem, 'fieldset[disabled] *');
1537
1540
  },
1538
1541
 
1539
1542
  "disabled": function( elem ) {
1540
- return elem.disabled === true || ('disabled' in elem && $(elem).is('fieldset[disabled] *'));
1543
+ return elem.disabled === true || ('disabled' in elem && $.find.matchesSelector(elem, 'fieldset[disabled] *'));
1541
1544
  }
1542
1545
  });
1543
1546
  }
@@ -1716,8 +1719,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1716
1719
  };
1717
1720
 
1718
1721
 
1719
-
1720
- $(document).on('focusin.lazyloadvalidation', function(e){
1722
+ $(document).on('focusin.lazyloadvalidation mousedown.lazyloadvalidation touchstart.lazyloadvalidation', function(e){
1721
1723
  if('form' in e.target){
1722
1724
  lazyLoad();
1723
1725
  }
@@ -1748,6 +1750,14 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1748
1750
  });
1749
1751
  }
1750
1752
  });
1753
+
1754
+ if(options.addValidators && options.fastValidators){
1755
+ webshims.reTest(['form-validators', 'form-validation']);
1756
+ }
1757
+
1758
+ if(document.readyState == 'complete'){
1759
+ webshims.isReady('WINDOWLOAD', true);
1760
+ }
1751
1761
  });
1752
1762
  ;webshims.register('form-shim-extend', function($, webshims, window, document, undefined, options){
1753
1763
  "use strict";
@@ -2143,7 +2153,7 @@ var rsubmittable = /^(?:select|textarea|input)/i;
2143
2153
  ;
2144
2154
  return function(){
2145
2155
  var elem = $(this).getNativeElement()[0];
2146
- return !!(!elem.readOnly && !types[elem.type] && !$(elem).is(':disabled') );
2156
+ return !!(!elem.readOnly && !types[elem.type] && !$.find.matchesSelector(elem, ':disabled') );
2147
2157
  };
2148
2158
  })()
2149
2159
  },
@@ -3698,6 +3708,10 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
3698
3708
  webshims.ready(swfType, initMediaElements);
3699
3709
  }
3700
3710
  webshims.ready('track', loadTrackUi);
3711
+
3712
+ if(document.readyState == 'complete'){
3713
+ webshims.isReady('WINDOWLOAD', true);
3714
+ }
3701
3715
  });
3702
3716
 
3703
3717
  })(webshims);
@@ -30,7 +30,6 @@ webshims.register('form-number-date-api', function($, webshims, window, document
30
30
  }
31
31
 
32
32
  var nan = parseInt('NaN', 10),
33
- doc = document,
34
33
  typeModels = webshims.inputTypes,
35
34
  isNumber = function(string){
36
35
  return (typeof string == 'number' || (string && string == string * 1));
@@ -1420,9 +1419,11 @@ webshims.register('form-number-date-api', function($, webshims, window, document
1420
1419
  $(element).attr({'aria-labelledby': labels.map(getId).get().join(' ')});
1421
1420
  if(!noFocus){
1422
1421
  labels.on('click', function(e){
1423
- element.getShadowFocusElement().focus();
1424
- e.preventDefault();
1425
- return false;
1422
+ if(!e.isDefaultPrevented()){
1423
+ element.getShadowFocusElement().focus();
1424
+ e.preventDefault();
1425
+ return false;
1426
+ }
1426
1427
  });
1427
1428
  }
1428
1429
  };
@@ -3080,7 +3081,7 @@ webshims.register('form-number-date-api', function($, webshims, window, document
3080
3081
  });
3081
3082
  });
3082
3083
  }
3083
-
3084
+
3084
3085
  if(opts.calculateWidth){
3085
3086
  sizeInput(data.shim);
3086
3087
  } else {
@@ -3110,28 +3111,28 @@ webshims.register('form-number-date-api', function($, webshims, window, document
3110
3111
  }
3111
3112
 
3112
3113
  var replace = {};
3113
-
3114
-
3114
+
3115
3115
  if(options.replaceUI){
3116
- if( $.isPlainObject(options.replaceUI) ){
3117
- $.extend(replace, options.replaceUI);
3118
- } else {
3119
- $.extend(replace, {
3120
- 'range': 1,
3121
- 'number': 1,
3122
- 'time': 1,
3123
- 'month': 1,
3124
- 'date': 1,
3125
- 'color': 1,
3126
- 'datetime-local': 1
3127
- });
3128
- }
3116
+ $.each($.extend(replace, $.isPlainObject(options.replaceUI) ? options.replaceUI : {
3117
+ 'range': 1,
3118
+ 'number': 1,
3119
+ 'time': 1,
3120
+ 'month': 1,
3121
+ 'date': 1,
3122
+ 'color': 1,
3123
+ 'datetime-local': 1
3124
+ }), function(name, val){
3125
+ if(supportInputTypes[name] && val == 'auto'){
3126
+ replace[name] = webshims._getAutoEnhance(val);
3127
+ }
3128
+ });
3129
3129
  }
3130
+
3130
3131
  if(supportInputTypes.number && navigator.userAgent.indexOf('Touch') == -1 && ((/MSIE 1[0|1]\.\d/.test(navigator.userAgent)) || (/Trident\/7\.0/.test(navigator.userAgent)))){
3131
3132
  replace.number = 1;
3132
3133
  }
3133
3134
 
3134
- if(!supportInputTypes.range || replace.range){
3135
+ if(replace.range !== false && (!supportInputTypes.range || replace.range)){
3135
3136
  extendType('range', {
3136
3137
  _create: function(opts, set){
3137
3138
  var data = $('<span />').insertAfter(opts.orig).rangeUI(opts).data('rangeUi');
@@ -3142,12 +3143,13 @@ webshims.register('form-number-date-api', function($, webshims, window, document
3142
3143
 
3143
3144
 
3144
3145
  ['number', 'time', 'month', 'date', 'color', 'datetime-local'].forEach(function(name){
3145
- if(!supportInputTypes[name] || replace[name]){
3146
+ if(replace[name] !== false && (!supportInputTypes[name] || replace[name])){
3146
3147
  extendType(name, {
3147
3148
  _create: function(opts, set){
3148
3149
  if(opts.monthSelect || opts.daySelect || opts.yearSelect){
3149
3150
  opts.splitInput = true;
3150
3151
  }
3152
+
3151
3153
  if(opts.splitInput && !splitInputs[name]){
3152
3154
  webshims.warn('splitInput not supported for '+ name);
3153
3155
  opts.splitInput = false;
@@ -10,23 +10,65 @@
10
10
 
11
11
  webshim.isReady('picture', true);
12
12
  setTimeout(function(){
13
- webshim.ready('matchMedia', function(){
14
- if(window.picturefill){
15
- var sel = 'picture, img[srcset]';
16
- webshim.addReady(function(context){
17
- if(context.querySelector(sel)){
18
- window.picturefill();
19
- }
20
- });
21
- }
22
- });
13
+ if(window.picturefill){
14
+ var sel = 'picture, img[srcset]';
15
+ webshim.addReady(function(context){
16
+ if(context.querySelector(sel)){
17
+ window.picturefill();
18
+ }
19
+ });
20
+ }
23
21
  });
24
22
  })();
25
-
26
- /*! Picturefill - v2.1.0-beta - 2014-06-03
23
+ /*! Picturefill - v2.1.0-beta - 2014-07-15
27
24
  * http://scottjehl.github.io/picturefill
28
25
  * Copyright (c) 2014 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT */
26
+ /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */
27
+
28
+ window.matchMedia || (window.matchMedia = function() {
29
+ "use strict";
30
+
31
+ // For browsers that support matchMedium api such as IE 9 and webkit
32
+ var styleMedia = (window.styleMedia || window.media);
33
+
34
+ // For those that don't support matchMedium
35
+ if (!styleMedia) {
36
+ var style = document.createElement('style'),
37
+ script = document.getElementsByTagName('script')[0],
38
+ info = null;
39
+
40
+ style.type = 'text/css';
41
+ style.id = 'matchmediajs-test';
29
42
 
43
+ script.parentNode.insertBefore(style, script);
44
+
45
+ // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers
46
+ info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle;
47
+
48
+ styleMedia = {
49
+ matchMedium: function(media) {
50
+ var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';
51
+
52
+ // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers
53
+ if (style.styleSheet) {
54
+ style.styleSheet.cssText = text;
55
+ } else {
56
+ style.textContent = text;
57
+ }
58
+
59
+ // Test if media query is true or false
60
+ return info.width === '1px';
61
+ }
62
+ };
63
+ }
64
+
65
+ return function(media) {
66
+ return {
67
+ matches: styleMedia.matchMedium(media || 'all'),
68
+ media: media || 'all'
69
+ };
70
+ };
71
+ }());
30
72
  /*! Picturefill - Responsive Images that work today.
31
73
  * Author: Scott Jehl, Filament Group, 2012 ( new proposal implemented by Shawn Jansepar )
32
74
  * License: MIT/GPLv2
@@ -38,6 +80,7 @@
38
80
 
39
81
  // If picture is supported, well, that's awesome. Let's get outta here...
40
82
  if ( w.HTMLPictureElement ) {
83
+ w.picturefill = function() { };
41
84
  return;
42
85
  }
43
86
 
@@ -51,7 +94,8 @@
51
94
  pf.ns = "picturefill";
52
95
 
53
96
  // srcset support test
54
- pf.srcsetSupported = new w.Image().srcset !== undefined;
97
+ pf.srcsetSupported = "srcset" in doc.createElement( "img" );
98
+ pf.sizesSupported = w.HTMLImageElement.sizes;
55
99
 
56
100
  // just a string trim workaround
57
101
  pf.trim = function( str ) {
@@ -82,8 +126,8 @@
82
126
  * http://dev.w3.org/csswg/css-values-3/#length-value
83
127
  */
84
128
  pf.getWidthFromLength = function( length ) {
85
- // If no length was specified, or it is 0, default to `100vw` (per the spec).
86
- length = length && parseFloat( length ) > 0 ? length : "100vw";
129
+ // If no length was specified, or it is 0 or negative, default to `100vw` (per the spec).
130
+ length = length && ( parseFloat( length ) > 0 || length.indexOf( "calc(" ) > -1 ) ? length : "100vw";
87
131
 
88
132
  /**
89
133
  * If length is specified in `vw` units, use `%` instead since the div we’re measuring
@@ -101,7 +145,12 @@
101
145
 
102
146
  // Positioning styles help prevent padding/margin/width on `html` from throwing calculations off.
103
147
  pf.lengthEl.style.cssText = "position: absolute; left: 0; width: " + length + ";";
104
- // Using offsetWidth to get width from CSS
148
+
149
+ if ( pf.lengthEl.offsetWidth <= 0 ) {
150
+ // Something has gone wrong. `calc()` is in use and unsupported, most likely. Default to `100vw` (`100%`, for broader support.):
151
+ pf.lengthEl.style.cssText = "width: 100%;";
152
+ }
153
+
105
154
  return pf.lengthEl.offsetWidth;
106
155
  };
107
156
 
@@ -263,38 +312,32 @@
263
312
  return candidates;
264
313
  };
265
314
 
266
- pf.parseDescriptor = function( descriptor, sizes ) {
315
+ pf.parseDescriptor = function( descriptor, sizesattr ) {
267
316
  // 11. Descriptor parser: Let candidates be an initially empty source set. The order of entries in the list
268
317
  // is the order in which entries are added to the list.
269
- var sizeDescriptor = descriptor && descriptor.replace(/(^\s+|\s+$)/g, ""),
270
- widthInCssPixels = sizes ? pf.findWidthFromSourceSize( sizes ) : "100%",
318
+ var sizes = sizesattr || "100vw",
319
+ sizeDescriptor = descriptor && descriptor.replace(/(^\s+|\s+$)/g, ""),
320
+ widthInCssPixels = pf.findWidthFromSourceSize( sizes ),
271
321
  resCandidate;
272
322
 
273
323
  if ( sizeDescriptor ) {
274
324
  var splitDescriptor = sizeDescriptor.split(" ");
275
325
 
276
326
  for (var i = splitDescriptor.length + 1; i >= 0; i--) {
277
-
278
- var curr = splitDescriptor[ i ],
279
- lastchar = curr && curr.slice( curr.length - 1 );
280
-
281
- if ( lastchar === "w" || lastchar === "x" ) {
282
- resCandidate = curr;
283
- }
284
- if ( sizes && resCandidate ) {
285
- // get the dpr by taking the length / width in css pixels
286
- resCandidate = parseFloat( ( parseInt( curr, 10 ) / widthInCssPixels ) );
287
- } else {
288
- // get the dpr by grabbing the value of Nx
289
- var res = curr && parseFloat( curr, 10 );
290
-
291
- resCandidate = res && !isNaN( res ) && lastchar === "x" || lastchar === "w" ? res : 1;
327
+ if ( splitDescriptor[ i ] !== undefined ) {
328
+ var curr = splitDescriptor[ i ],
329
+ lastchar = curr && curr.slice( curr.length - 1 );
330
+
331
+ if ( ( lastchar === "h" || lastchar === "w" ) && !pf.sizesSupported ) {
332
+ resCandidate = parseFloat( ( parseInt( curr, 10 ) / widthInCssPixels ) );
333
+ } else if ( lastchar === "x" ) {
334
+ var res = curr && parseFloat( curr, 10 );
335
+ resCandidate = res && !isNaN( res ) ? res : 1;
336
+ }
292
337
  }
293
338
  }
294
- } else {
295
- resCandidate = 1;
296
339
  }
297
- return resCandidate;
340
+ return resCandidate || 1;
298
341
  };
299
342
 
300
343
  /**
@@ -372,7 +415,7 @@
372
415
  }
373
416
  }
374
417
 
375
- if ( !pf.endsWith( picImg.src, bestCandidate.url ) ) {
418
+ if ( bestCandidate && !pf.endsWith( picImg.src, bestCandidate.url ) ) {
376
419
  picImg.src = bestCandidate.url;
377
420
  // currentSrc attribute and property to match
378
421
  // http://picture.responsiveimages.org/#the-img-element
@@ -405,32 +448,26 @@
405
448
  };
406
449
 
407
450
  /*
408
- * Find all picture elements and,
409
- * in browsers that don't natively support srcset, find all img elements
410
- * with srcset attrs that don't have picture parents
451
+ * Find all `img` elements, and add them to the candidate list if they have
452
+ * a `picture` parent, a `sizes` attribute in basic `srcset` supporting browsers,
453
+ * a `srcset` attribute at all, and they haven’t been evaluated already.
411
454
  */
412
455
  pf.getAllElements = function() {
413
- var pictures = doc.getElementsByTagName( "picture" ),
414
- elems = [],
456
+ var elems = [],
415
457
  imgs = doc.getElementsByTagName( "img" );
416
458
 
417
- for ( var h = 0, len = pictures.length + imgs.length; h < len; h++ ) {
418
- if ( h < pictures.length ) {
419
- elems[ h ] = pictures[ h ];
420
- } else {
421
- var currImg = imgs[ h - pictures.length ];
459
+ for ( var h = 0, len = imgs.length; h < len; h++ ) {
460
+ var currImg = imgs[ h ];
422
461
 
423
- if ( currImg.parentNode.nodeName.toUpperCase() !== "PICTURE" &&
424
- ( ( pf.srcsetSupported && currImg.getAttribute( "sizes" ) ) ||
425
- currImg.getAttribute( "srcset" ) !== null ) ) {
426
- elems.push( currImg );
427
- }
462
+ if ( currImg.parentNode.nodeName.toUpperCase() === "PICTURE" ||
463
+ ( currImg.getAttribute( "srcset" ) !== null ) || currImg[ pf.ns ] && currImg[ pf.ns ].srcset !== null ) {
464
+ elems.push( currImg );
428
465
  }
429
466
  }
430
467
  return elems;
431
468
  };
432
469
 
433
- pf.getMatch = function( picture ) {
470
+ pf.getMatch = function( img, picture ) {
434
471
  var sources = picture.childNodes,
435
472
  match;
436
473
 
@@ -443,9 +480,9 @@
443
480
  continue;
444
481
  }
445
482
 
446
- // Hitting an `img` element stops the search for `sources`.
483
+ // Hitting the `img` element that started everything stops the search for `sources`.
447
484
  // If no previous `source` matches, the `img` itself is evaluated later.
448
- if ( source.nodeName.toUpperCase() === "IMG" ) {
485
+ if ( source === img ) {
449
486
  return match;
450
487
  }
451
488
 
@@ -477,24 +514,22 @@
477
514
  return match;
478
515
  };
479
516
 
480
- function picturefill( options ) {
517
+ function picturefill( opt ) {
481
518
  var elements,
482
519
  element,
483
- elemType,
520
+ parent,
484
521
  firstMatch,
485
522
  candidates,
486
- picImg;
487
523
 
488
- options = options || {};
524
+ options = opt || {};
489
525
  elements = options.elements || pf.getAllElements();
490
526
 
491
527
  // Loop through all elements
492
528
  for ( var i = 0, plen = elements.length; i < plen; i++ ) {
493
529
  element = elements[ i ];
494
- elemType = element.nodeName.toUpperCase();
530
+ parent = element.parentNode;
495
531
  firstMatch = undefined;
496
532
  candidates = undefined;
497
- picImg = undefined;
498
533
 
499
534
  // expando for caching data on the img
500
535
  if ( !element[ pf.ns ] ) {
@@ -508,16 +543,16 @@
508
543
  continue;
509
544
  }
510
545
 
511
- // if element is a picture element
512
- if ( elemType === "PICTURE" ) {
546
+ // if `img` is in a `picture` element
547
+ if ( parent.nodeName.toUpperCase() === "PICTURE" ) {
513
548
 
514
549
  // IE9 video workaround
515
- pf.removeVideoShim( element );
550
+ pf.removeVideoShim( parent );
516
551
 
517
552
  // return the first match which might undefined
518
553
  // returns false if there is a pending source
519
554
  // TODO the return type here is brutal, cleanup
520
- firstMatch = pf.getMatch( element );
555
+ firstMatch = pf.getMatch( element, parent );
521
556
 
522
557
  // if any sources are pending in this picture due to async type test(s)
523
558
  // remove the evaluated attr and skip for now ( the pending test will
@@ -525,43 +560,32 @@
525
560
  if ( firstMatch === false ) {
526
561
  continue;
527
562
  }
528
-
529
- // Find any existing img element in the picture element
530
- picImg = element.getElementsByTagName( "img" )[ 0 ];
531
563
  } else {
532
- // if it's an img element
533
564
  firstMatch = undefined;
534
- picImg = element;
535
565
  }
536
566
 
537
- if ( picImg ) {
538
-
539
- // expando for caching data on the img
540
- if ( !picImg[ pf.ns ] ) {
541
- picImg[ pf.ns ] = {};
542
- }
543
-
544
- // Cache and remove `srcset` if present and we’re going to be doing `sizes`/`picture` polyfilling to it.
545
- if ( picImg.srcset && ( elemType === "PICTURE" || picImg.getAttribute( "sizes" ) ) ) {
546
- pf.dodgeSrcset( picImg );
547
- }
548
-
549
- if ( firstMatch ) {
550
- candidates = pf.processSourceSet( firstMatch );
551
- pf.applyBestCandidate( candidates, picImg );
552
- } else {
553
- // No sources matched, so we’re down to processing the inner `img` as a source.
554
- candidates = pf.processSourceSet( picImg );
567
+ // Cache and remove `srcset` if present and we’re going to be doing `picture`/`srcset`/`sizes` polyfilling to it.
568
+ if ( parent.nodeName.toUpperCase() === "PICTURE" ||
569
+ ( element.srcset && !pf.srcsetSupported ) ||
570
+ ( !pf.sizesSupported && ( element.srcset && element.srcset.indexOf("w") > -1 ) ) ) {
571
+ pf.dodgeSrcset( element );
572
+ }
555
573
 
556
- if ( picImg.srcset === undefined || picImg[ pf.ns ].srcset ) {
557
- // Either `srcset` is completely unsupported, or we need to polyfill `sizes` functionality.
558
- pf.applyBestCandidate( candidates, picImg );
559
- } // Else, resolution-only `srcset` is supported natively.
560
- }
574
+ if ( firstMatch ) {
575
+ candidates = pf.processSourceSet( firstMatch );
576
+ pf.applyBestCandidate( candidates, element );
577
+ } else {
578
+ // No sources matched, so we’re down to processing the inner `img` as a source.
579
+ candidates = pf.processSourceSet( element );
561
580
 
562
- // set evaluated to true to avoid unnecessary reparsing
563
- element[ pf.ns ].evaluated = true;
581
+ if ( element.srcset === undefined || element[ pf.ns ].srcset ) {
582
+ // Either `srcset` is completely unsupported, or we need to polyfill `sizes` functionality.
583
+ pf.applyBestCandidate( candidates, element );
584
+ } // Else, resolution-only `srcset` is supported natively.
564
585
  }
586
+
587
+ // set evaluated to true to avoid unnecessary reparsing
588
+ element[ pf.ns ].evaluated = true;
565
589
  }
566
590
  }
567
591
 
@@ -596,7 +620,7 @@
596
620
  }
597
621
  }
598
622
 
599
- webshim.ready('matchMedia', runPicturefill);
623
+ runPicturefill();
600
624
 
601
625
  /* expose methods for testing */
602
626
  picturefill._ = pf;
@@ -615,6 +639,7 @@
615
639
 
616
640
  } )( this, this.document );
617
641
 
642
+
618
643
  ;/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */
619
644
 
620
645
  window.matchMedia || (window.matchMedia = function() {