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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Rakefile +58 -0
- data/lib/webshims-rails/version.rb +2 -2
- data/vendor/assets/javascripts/webshims/polyfiller.js +45 -26
- data/vendor/assets/javascripts/webshims/shims/combos/1.js +18 -5
- data/vendor/assets/javascripts/webshims/shims/combos/10.js +26 -22
- data/vendor/assets/javascripts/webshims/shims/combos/11.js +24 -21
- data/vendor/assets/javascripts/webshims/shims/combos/12.js +4 -0
- data/vendor/assets/javascripts/webshims/shims/combos/13.js +4 -0
- data/vendor/assets/javascripts/webshims/shims/combos/14.js +0 -1
- data/vendor/assets/javascripts/webshims/shims/combos/15.js +17 -7
- data/vendor/assets/javascripts/webshims/shims/combos/16.js +21 -7
- data/vendor/assets/javascripts/webshims/shims/combos/17.js +24 -22
- data/vendor/assets/javascripts/webshims/shims/combos/18.js +122 -97
- data/vendor/assets/javascripts/webshims/shims/combos/2.js +20 -6
- data/vendor/assets/javascripts/webshims/shims/combos/21.js +4 -3
- data/vendor/assets/javascripts/webshims/shims/combos/23.js +4 -0
- data/vendor/assets/javascripts/webshims/shims/combos/25.js +7 -5
- data/vendor/assets/javascripts/webshims/shims/combos/26.js +1 -1
- data/vendor/assets/javascripts/webshims/shims/combos/27.js +29 -9
- data/vendor/assets/javascripts/webshims/shims/combos/28.js +1 -2
- data/vendor/assets/javascripts/webshims/shims/combos/29.js +0 -1
- data/vendor/assets/javascripts/webshims/shims/combos/3.js +16 -6
- data/vendor/assets/javascripts/webshims/shims/combos/30.js +16 -6
- data/vendor/assets/javascripts/webshims/shims/combos/31.js +16 -6
- data/vendor/assets/javascripts/webshims/shims/combos/33.js +0 -1
- data/vendor/assets/javascripts/webshims/shims/combos/34.js +2 -1
- data/vendor/assets/javascripts/webshims/shims/combos/4.js +2 -1
- data/vendor/assets/javascripts/webshims/shims/combos/5.js +24 -22
- data/vendor/assets/javascripts/webshims/shims/combos/6.js +24 -22
- data/vendor/assets/javascripts/webshims/shims/combos/7.js +20 -6
- data/vendor/assets/javascripts/webshims/shims/combos/8.js +20 -6
- data/vendor/assets/javascripts/webshims/shims/combos/9.js +26 -22
- data/vendor/assets/javascripts/webshims/shims/combos/97.js +0 -24
- data/vendor/assets/javascripts/webshims/shims/combos/98.js +22 -25
- data/vendor/assets/javascripts/webshims/shims/combos/99.js +22 -25
- data/vendor/assets/javascripts/webshims/shims/dom-extend.js +2 -1
- data/vendor/assets/javascripts/webshims/shims/filereader.js +1 -1
- data/vendor/assets/javascripts/webshims/shims/form-core.js +14 -5
- data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +8 -4
- data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +0 -1
- data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +24 -21
- data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1 -1
- data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +28 -8
- data/vendor/assets/javascripts/webshims/shims/form-validation.js +17 -20
- data/vendor/assets/javascripts/webshims/shims/form-validators.js +17 -10
- data/vendor/assets/javascripts/webshims/shims/forms-picker.js +3 -3
- data/vendor/assets/javascripts/webshims/shims/jme/base.js +0 -24
- data/vendor/assets/javascripts/webshims/shims/jme/controls.css +23 -9
- data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +21 -3
- data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +13 -4
- data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols.js +22 -1
- data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +4 -0
- data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +4 -3
- data/vendor/assets/javascripts/webshims/shims/picture.js +122 -97
- data/vendor/assets/javascripts/webshims/shims/plugins/jquery.ui.position.js +470 -452
- data/vendor/assets/javascripts/webshims/shims/sizzle.js +35 -27
- data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +10 -2
- data/vendor/assets/javascripts/webshims/shims/styles/forms-picker.css +1 -1
- data/vendor/assets/javascripts/webshims/shims/styles/scss/_api-forms-ext.scss +10 -0
- data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +4 -2
- data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-picker.scss +1 -1
- data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +6 -24
- data/vendor/assets/javascripts/webshims/shims/styles/shim-ext.css +15 -21
- data/vendor/assets/javascripts/webshims/shims/styles/shim.css +5 -19
- data/vendor/assets/javascripts/webshims/shims/track-ui.js +2 -2
- metadata +2 -3
- 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
|
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 &&
|
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 &&
|
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] &&
|
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
|
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 &&
|
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 &&
|
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] &&
|
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
|
-
|
1424
|
-
|
1425
|
-
|
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
|
-
|
3117
|
-
|
3118
|
-
|
3119
|
-
|
3120
|
-
|
3121
|
-
|
3122
|
-
|
3123
|
-
|
3124
|
-
|
3125
|
-
|
3126
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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 =
|
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
|
-
|
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,
|
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
|
270
|
-
|
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
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
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
|
409
|
-
*
|
410
|
-
*
|
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
|
414
|
-
elems = [],
|
456
|
+
var elems = [],
|
415
457
|
imgs = doc.getElementsByTagName( "img" );
|
416
458
|
|
417
|
-
for ( var h = 0, len =
|
418
|
-
|
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
|
-
|
424
|
-
|
425
|
-
|
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
|
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
|
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(
|
517
|
+
function picturefill( opt ) {
|
481
518
|
var elements,
|
482
519
|
element,
|
483
|
-
|
520
|
+
parent,
|
484
521
|
firstMatch,
|
485
522
|
candidates,
|
486
|
-
picImg;
|
487
523
|
|
488
|
-
|
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
|
-
|
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
|
512
|
-
if (
|
546
|
+
// if `img` is in a `picture` element
|
547
|
+
if ( parent.nodeName.toUpperCase() === "PICTURE" ) {
|
513
548
|
|
514
549
|
// IE9 video workaround
|
515
|
-
pf.removeVideoShim(
|
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
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
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
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
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
|
-
|
563
|
-
|
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
|
-
|
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() {
|