webshims-rails 1.11.2 → 1.11.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +6 -14
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +3 -4
  4. data/vendor/assets/javascripts/webshims/shims/combos/1.js +20 -8
  5. data/vendor/assets/javascripts/webshims/shims/combos/10.js +43 -2
  6. data/vendor/assets/javascripts/webshims/shims/combos/11.js +3 -0
  7. data/vendor/assets/javascripts/webshims/shims/combos/12.js +12 -4
  8. data/vendor/assets/javascripts/webshims/shims/combos/13.js +12 -4
  9. data/vendor/assets/javascripts/webshims/shims/combos/14.js +40 -2
  10. data/vendor/assets/javascripts/webshims/shims/combos/15.js +48 -6
  11. data/vendor/assets/javascripts/webshims/shims/combos/16.js +60 -10
  12. data/vendor/assets/javascripts/webshims/shims/combos/17.js +3 -0
  13. data/vendor/assets/javascripts/webshims/shims/combos/18.js +3 -0
  14. data/vendor/assets/javascripts/webshims/shims/combos/19.js +115 -17
  15. data/vendor/assets/javascripts/webshims/shims/combos/2.js +60 -10
  16. data/vendor/assets/javascripts/webshims/shims/combos/20.js +115 -17
  17. data/vendor/assets/javascripts/webshims/shims/combos/21.js +63 -11
  18. data/vendor/assets/javascripts/webshims/shims/combos/23.js +12 -4
  19. data/vendor/assets/javascripts/webshims/shims/combos/24.js +3 -5
  20. data/vendor/assets/javascripts/webshims/shims/combos/25.js +115 -17
  21. data/vendor/assets/javascripts/webshims/shims/combos/26.js +40 -2
  22. data/vendor/assets/javascripts/webshims/shims/combos/3.js +48 -6
  23. data/vendor/assets/javascripts/webshims/shims/combos/30.js +48 -6
  24. data/vendor/assets/javascripts/webshims/shims/combos/31.js +48 -6
  25. data/vendor/assets/javascripts/webshims/shims/combos/4.js +40 -2
  26. data/vendor/assets/javascripts/webshims/shims/combos/5.js +3 -0
  27. data/vendor/assets/javascripts/webshims/shims/combos/6.js +3 -0
  28. data/vendor/assets/javascripts/webshims/shims/combos/7.js +60 -10
  29. data/vendor/assets/javascripts/webshims/shims/combos/8.js +60 -10
  30. data/vendor/assets/javascripts/webshims/shims/combos/9.js +43 -2
  31. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +40 -2
  32. data/vendor/assets/javascripts/webshims/shims/form-core.js +8 -4
  33. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +3 -0
  34. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +3 -5
  35. data/vendor/assets/javascripts/webshims/shims/form-validation.js +137 -0
  36. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +12 -4
  37. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +63 -11
  38. metadata +6 -6
@@ -375,15 +375,6 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
375
375
  lastDuration: 0
376
376
  }, getProps, getSetProps);
377
377
 
378
- var idRep = /^jarisplayer-/;
379
- var getSwfDataFromID = function(id){
380
-
381
- var elem = document.getElementById(id.replace(idRep, ''));
382
- if(!elem){return;}
383
- var data = webshims.data(elem, 'mediaelement');
384
- return data.isActive == 'third' ? data : null;
385
- };
386
-
387
378
 
388
379
  var getSwfDataFromElem = function(elem){
389
380
  try {
@@ -976,6 +967,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
976
967
  box = data.shadowElem;
977
968
  resetSwfProps(data);
978
969
  } else {
970
+ $(document.getElementById('wrapper-'+ elemId )).remove();
979
971
  box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
980
972
  .css({
981
973
  position: 'relative',
@@ -1058,8 +1050,11 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1058
1050
  ;
1059
1051
  }
1060
1052
 
1061
-
1062
- if(!mediaelement.jarisEvent[data.id] || mediaelement.jarisEvent[data.id].elem != elem){
1053
+ if(mediaelement.jarisEvent[data.id] && mediaelement.jarisEvent[data.id].elem != elem){
1054
+ webshims.error('something went wrong');
1055
+ return;
1056
+ } else if(!mediaelement.jarisEvent[data.id]){
1057
+
1063
1058
  mediaelement.jarisEvent[data.id] = function(jaris){
1064
1059
 
1065
1060
  if(jaris.type == 'ready'){
@@ -1265,6 +1260,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1265
1260
  descs[fn] = {
1266
1261
  value: function(){
1267
1262
  var data = getSwfDataFromElem(this);
1263
+
1268
1264
  if(data){
1269
1265
  if(data.stopPlayPause){
1270
1266
  clearTimeout(data.stopPlayPause);
@@ -1287,6 +1283,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1287
1283
 
1288
1284
  webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
1289
1285
  var data = getSwfDataFromElem(this);
1286
+
1290
1287
  $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
1291
1288
 
1292
1289
  if(data){
@@ -1420,6 +1417,61 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1420
1417
  } else if(!('media' in document.createElement('source'))){
1421
1418
  webshims.reflectProperties('source', ['media']);
1422
1419
  }
1420
+ if(options.experimentallyMimetypeCheck){
1421
+ (function(){
1422
+ var ADDBACK = $.fn.addBack ? 'addBack' : 'andSelf';
1423
+ var getMimeType = function(){
1424
+ var done;
1425
+ var unknown = 'media/unknown please provide mime type';
1426
+ var media = $(this);
1427
+ var xhrs = [];
1428
+ media
1429
+ .not('.ws-after-check')
1430
+ .find('source')
1431
+ [ADDBACK]()
1432
+ .filter('[data-wsrecheckmimetype]:not([type])')
1433
+ .each(function(){
1434
+ var source = $(this).removeAttr('data-wsrecheckmimetype');
1435
+ var error = function(){
1436
+ source.attr('data-type', unknown);
1437
+ };
1438
+ try {
1439
+ xhrs.push(
1440
+ $.ajax({
1441
+ type: 'head',
1442
+ url: $.attr(this, 'src'),
1443
+ success: function(content, status, xhr){
1444
+ var mime = xhr.getResponseHeader('Content-Type');
1445
+ if(mime){
1446
+ done = true;
1447
+ }
1448
+ source.attr('data-type', mime || unknown);
1449
+ },
1450
+ error: error
1451
+ })
1452
+ )
1453
+ ;
1454
+ } catch(er){
1455
+ error();
1456
+ }
1457
+ })
1458
+ ;
1459
+ if(xhrs.length){
1460
+ media.addClass('ws-after-check');
1461
+ $.when.apply($, xhrs).always(function(){
1462
+ media.mediaLoad();
1463
+ setTimeout(function(){
1464
+ media.removeClass('ws-after-check');
1465
+ }, 9);
1466
+ });
1467
+ }
1468
+ };
1469
+ $('audio.media-error, video.media-error').each(getMimeType);
1470
+ $(document).on('mediaerror', function(e){
1471
+ getMimeType.call(e.target);
1472
+ });
1473
+ })();
1474
+ }
1423
1475
 
1424
1476
  });
1425
1477
  webshims.register('track', function($, webshims, window, document, undefined){
@@ -588,7 +588,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
588
588
  src.server = tmp;
589
589
  }
590
590
 
591
- tmp = elem.attr('type');
591
+ tmp = elem.attr('type') || elem.attr('data-type');
592
592
  if(tmp){
593
593
  src.type = tmp;
594
594
  src.container = $.trim(tmp.split(';')[0]);
@@ -612,6 +612,11 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
612
612
  }
613
613
  }
614
614
  }
615
+
616
+ if(!src.container){
617
+ $(elem).attr('data-wsrecheckmimetype', '');
618
+ }
619
+
615
620
  tmp = elem.attr('media');
616
621
  if(tmp){
617
622
  src.media = tmp;
@@ -845,15 +850,18 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
845
850
 
846
851
  var handleThird = (function(){
847
852
  var requested;
853
+ var readyType = hasSwf ? swfType : 'mediaelement-yt';
848
854
  return function( mediaElem, ret, data ){
855
+ //readd to ready
849
856
 
850
- webshims.ready(hasSwf ? swfType : 'mediaelement-yt', function(){
851
- if(mediaelement.createSWF){
857
+
858
+ webshims.ready(readyType, function(){
859
+ if(mediaelement.createSWF && $(mediaElem).parent()[0]){
852
860
  mediaelement.createSWF( mediaElem, ret, data );
853
861
  } else if(!requested) {
854
862
  requested = true;
855
863
  loadThird();
856
- //readd to ready
864
+
857
865
  handleThird( mediaElem, ret, data );
858
866
  }
859
867
  });
@@ -1322,6 +1322,7 @@ try {
1322
1322
  }
1323
1323
 
1324
1324
  (function(){
1325
+ if(options.noPlaceholderPolyfill){return;}
1325
1326
  var bustedPlaceholder;
1326
1327
  Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]);
1327
1328
  if(Modernizr.input.placeholder && options.overridePlaceholder){
@@ -1504,7 +1505,6 @@ try {
1504
1505
  create: function(elem){
1505
1506
  var data = $.data(elem, 'placeHolder');
1506
1507
  var form;
1507
- var responsiveElem;
1508
1508
  if(data){return data;}
1509
1509
  data = $.data(elem, 'placeHolder', {});
1510
1510
 
@@ -1524,7 +1524,6 @@ try {
1524
1524
  if(elem.type == 'password' || isOver){
1525
1525
  data.text = createPlaceholder(elem);
1526
1526
  if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
1527
- responsiveElem = true;
1528
1527
  data.box = data.text;
1529
1528
  } else {
1530
1529
  data.box = $(elem)
@@ -1764,7 +1763,6 @@ try {
1764
1763
 
1765
1764
  //pro forma
1766
1765
  ,color: 1
1767
- //,range: 1
1768
1766
  },
1769
1767
  observe = function(input){
1770
1768
  var timer,
@@ -1786,7 +1784,7 @@ try {
1786
1784
  extraTimer = setTimeout(trigger, 9);
1787
1785
  },
1788
1786
  unbind = function(){
1789
- input.unbind('focusout', unbind).unbind('keyup keypress keydown paste cut', extraTest).unbind('input change updateInput', trigger);
1787
+ input.unbind('focusout', unbind).unbind('keyup keypress keydown paste cut', extraTest).unbind('input change updateInput triggerinput', trigger);
1790
1788
  clearInterval(timer);
1791
1789
  setTimeout(function(){
1792
1790
  trigger();
@@ -1802,7 +1800,7 @@ try {
1802
1800
  input.on({
1803
1801
  'keyup keypress keydown paste cut': extraTest,
1804
1802
  focusout: unbind,
1805
- 'input updateInput change': trigger
1803
+ 'input updateInput change triggerinput': trigger
1806
1804
  });
1807
1805
  }
1808
1806
  ;
@@ -1258,6 +1258,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1258
1258
  "use strict";
1259
1259
  var supportHrefNormalized = !('hrefNormalized' in $.support) || $.support.hrefNormalized;
1260
1260
  var supportGetSetAttribute = !('getSetAttribute' in $.support) || $.support.getSetAttribute;
1261
+ var has = Object.prototype.hasOwnProperty;
1261
1262
  webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
1262
1263
 
1263
1264
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
@@ -1330,6 +1331,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1330
1331
  //proxying attribute
1331
1332
  var olds = {};
1332
1333
  var havePolyfill = {};
1334
+ var hasPolyfillMethod = {};
1333
1335
  var extendedProps = {};
1334
1336
  var extendQ = {};
1335
1337
  var modifyProps = {};
@@ -1435,6 +1437,39 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1435
1437
  };
1436
1438
  });
1437
1439
 
1440
+ //add support for $('video').trigger('play') in case extendNative is set to false
1441
+ if(!webshims.cfg.extendNative && !webshims.cfg.noTriggerOverride){
1442
+ (function(oldTrigger){
1443
+ $.event.trigger = function(event, data, elem, onlyHandlers){
1444
+
1445
+ if(!hasPolyfillMethod[event] || onlyHandlers || !elem || elem.nodeType !== 1){
1446
+ return oldTrigger.apply(this, arguments);
1447
+ }
1448
+ var ret, isOrig, origName;
1449
+ var origFn = elem[event];
1450
+ var polyfilledFn = $.prop(elem, event);
1451
+ var changeFn = polyfilledFn && origFn != polyfilledFn;
1452
+ if(changeFn){
1453
+ origName = '__ws'+event;
1454
+ isOrig = (event in elem) && has.call(elem, event);
1455
+ elem[event] = polyfilledFn;
1456
+ elem[origName] = origFn;
1457
+ }
1458
+
1459
+ ret = oldTrigger.apply(this, arguments);
1460
+ if (changeFn) {
1461
+ if(isOrig){
1462
+ elem[event] = origFn;
1463
+ } else {
1464
+ delete elem[event];
1465
+ }
1466
+ delete elem[origName];
1467
+ }
1468
+
1469
+ return ret;
1470
+ };
1471
+ })($.event.trigger);
1472
+ }
1438
1473
 
1439
1474
  ['removeAttr', 'prop', 'attr'].forEach(function(type){
1440
1475
  olds[type] = $[type];
@@ -1519,6 +1554,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1519
1554
  }
1520
1555
  var oldDesc = extendedProps[nodeName][prop][type];
1521
1556
  var getSup = function(propType, descriptor, oDesc){
1557
+ var origProp;
1522
1558
  if(descriptor && descriptor[propType]){
1523
1559
  return descriptor[propType];
1524
1560
  }
@@ -1535,8 +1571,10 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1535
1571
  };
1536
1572
  }
1537
1573
  if(type == 'prop' && propType == 'value' && desc.value.apply){
1574
+ origProp = '__ws'+prop;
1575
+ hasPolyfillMethod[prop] = true;
1538
1576
  return function(value){
1539
- var sup = olds[type](this, prop);
1577
+ var sup = this[origProp] || olds[type](this, prop);
1540
1578
  if(sup && sup.apply){
1541
1579
  sup = sup.apply(this, arguments);
1542
1580
  }
@@ -1574,7 +1612,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1574
1612
 
1575
1613
  var extendNativeValue = (function(){
1576
1614
  var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
1577
- var has = Object.prototype.hasOwnProperty;
1615
+
1578
1616
  //see also: https://github.com/lojjic/PIE/issues/40 | https://prototype.lighthouseapp.com/projects/8886/tickets/1107-ie8-fatal-crash-when-prototypejs-is-loaded-with-rounded-cornershtc
1579
1617
  var isExtendNativeSave = Modernizr.advancedObjectProperties && Modernizr.objectAccessor;
1580
1618
  return function(nodeName, prop, desc){
@@ -2882,7 +2920,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2882
2920
  src.server = tmp;
2883
2921
  }
2884
2922
 
2885
- tmp = elem.attr('type');
2923
+ tmp = elem.attr('type') || elem.attr('data-type');
2886
2924
  if(tmp){
2887
2925
  src.type = tmp;
2888
2926
  src.container = $.trim(tmp.split(';')[0]);
@@ -2906,6 +2944,11 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2906
2944
  }
2907
2945
  }
2908
2946
  }
2947
+
2948
+ if(!src.container){
2949
+ $(elem).attr('data-wsrecheckmimetype', '');
2950
+ }
2951
+
2909
2952
  tmp = elem.attr('media');
2910
2953
  if(tmp){
2911
2954
  src.media = tmp;
@@ -3139,15 +3182,18 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
3139
3182
 
3140
3183
  var handleThird = (function(){
3141
3184
  var requested;
3185
+ var readyType = hasSwf ? swfType : 'mediaelement-yt';
3142
3186
  return function( mediaElem, ret, data ){
3187
+ //readd to ready
3188
+
3143
3189
 
3144
- webshims.ready(hasSwf ? swfType : 'mediaelement-yt', function(){
3145
- if(mediaelement.createSWF){
3190
+ webshims.ready(readyType, function(){
3191
+ if(mediaelement.createSWF && $(mediaElem).parent()[0]){
3146
3192
  mediaelement.createSWF( mediaElem, ret, data );
3147
3193
  } else if(!requested) {
3148
3194
  requested = true;
3149
3195
  loadThird();
3150
- //readd to ready
3196
+
3151
3197
  handleThird( mediaElem, ret, data );
3152
3198
  }
3153
3199
  });
@@ -3488,15 +3534,6 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
3488
3534
  lastDuration: 0
3489
3535
  }, getProps, getSetProps);
3490
3536
 
3491
- var idRep = /^jarisplayer-/;
3492
- var getSwfDataFromID = function(id){
3493
-
3494
- var elem = document.getElementById(id.replace(idRep, ''));
3495
- if(!elem){return;}
3496
- var data = webshims.data(elem, 'mediaelement');
3497
- return data.isActive == 'third' ? data : null;
3498
- };
3499
-
3500
3537
 
3501
3538
  var getSwfDataFromElem = function(elem){
3502
3539
  try {
@@ -4089,6 +4126,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
4089
4126
  box = data.shadowElem;
4090
4127
  resetSwfProps(data);
4091
4128
  } else {
4129
+ $(document.getElementById('wrapper-'+ elemId )).remove();
4092
4130
  box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
4093
4131
  .css({
4094
4132
  position: 'relative',
@@ -4171,8 +4209,11 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
4171
4209
  ;
4172
4210
  }
4173
4211
 
4174
-
4175
- if(!mediaelement.jarisEvent[data.id] || mediaelement.jarisEvent[data.id].elem != elem){
4212
+ if(mediaelement.jarisEvent[data.id] && mediaelement.jarisEvent[data.id].elem != elem){
4213
+ webshims.error('something went wrong');
4214
+ return;
4215
+ } else if(!mediaelement.jarisEvent[data.id]){
4216
+
4176
4217
  mediaelement.jarisEvent[data.id] = function(jaris){
4177
4218
 
4178
4219
  if(jaris.type == 'ready'){
@@ -4378,6 +4419,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
4378
4419
  descs[fn] = {
4379
4420
  value: function(){
4380
4421
  var data = getSwfDataFromElem(this);
4422
+
4381
4423
  if(data){
4382
4424
  if(data.stopPlayPause){
4383
4425
  clearTimeout(data.stopPlayPause);
@@ -4400,6 +4442,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
4400
4442
 
4401
4443
  webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
4402
4444
  var data = getSwfDataFromElem(this);
4445
+
4403
4446
  $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
4404
4447
 
4405
4448
  if(data){
@@ -4533,5 +4576,60 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
4533
4576
  } else if(!('media' in document.createElement('source'))){
4534
4577
  webshims.reflectProperties('source', ['media']);
4535
4578
  }
4579
+ if(options.experimentallyMimetypeCheck){
4580
+ (function(){
4581
+ var ADDBACK = $.fn.addBack ? 'addBack' : 'andSelf';
4582
+ var getMimeType = function(){
4583
+ var done;
4584
+ var unknown = 'media/unknown please provide mime type';
4585
+ var media = $(this);
4586
+ var xhrs = [];
4587
+ media
4588
+ .not('.ws-after-check')
4589
+ .find('source')
4590
+ [ADDBACK]()
4591
+ .filter('[data-wsrecheckmimetype]:not([type])')
4592
+ .each(function(){
4593
+ var source = $(this).removeAttr('data-wsrecheckmimetype');
4594
+ var error = function(){
4595
+ source.attr('data-type', unknown);
4596
+ };
4597
+ try {
4598
+ xhrs.push(
4599
+ $.ajax({
4600
+ type: 'head',
4601
+ url: $.attr(this, 'src'),
4602
+ success: function(content, status, xhr){
4603
+ var mime = xhr.getResponseHeader('Content-Type');
4604
+ if(mime){
4605
+ done = true;
4606
+ }
4607
+ source.attr('data-type', mime || unknown);
4608
+ },
4609
+ error: error
4610
+ })
4611
+ )
4612
+ ;
4613
+ } catch(er){
4614
+ error();
4615
+ }
4616
+ })
4617
+ ;
4618
+ if(xhrs.length){
4619
+ media.addClass('ws-after-check');
4620
+ $.when.apply($, xhrs).always(function(){
4621
+ media.mediaLoad();
4622
+ setTimeout(function(){
4623
+ media.removeClass('ws-after-check');
4624
+ }, 9);
4625
+ });
4626
+ }
4627
+ };
4628
+ $('audio.media-error, video.media-error').each(getMimeType);
4629
+ $(document).on('mediaerror', function(e){
4630
+ getMimeType.call(e.target);
4631
+ });
4632
+ })();
4633
+ }
4536
4634
 
4537
4635
  });
@@ -3,6 +3,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
3
3
  "use strict";
4
4
  var supportHrefNormalized = !('hrefNormalized' in $.support) || $.support.hrefNormalized;
5
5
  var supportGetSetAttribute = !('getSetAttribute' in $.support) || $.support.getSetAttribute;
6
+ var has = Object.prototype.hasOwnProperty;
6
7
  webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
7
8
 
8
9
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
@@ -75,6 +76,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
75
76
  //proxying attribute
76
77
  var olds = {};
77
78
  var havePolyfill = {};
79
+ var hasPolyfillMethod = {};
78
80
  var extendedProps = {};
79
81
  var extendQ = {};
80
82
  var modifyProps = {};
@@ -180,6 +182,39 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
180
182
  };
181
183
  });
182
184
 
185
+ //add support for $('video').trigger('play') in case extendNative is set to false
186
+ if(!webshims.cfg.extendNative && !webshims.cfg.noTriggerOverride){
187
+ (function(oldTrigger){
188
+ $.event.trigger = function(event, data, elem, onlyHandlers){
189
+
190
+ if(!hasPolyfillMethod[event] || onlyHandlers || !elem || elem.nodeType !== 1){
191
+ return oldTrigger.apply(this, arguments);
192
+ }
193
+ var ret, isOrig, origName;
194
+ var origFn = elem[event];
195
+ var polyfilledFn = $.prop(elem, event);
196
+ var changeFn = polyfilledFn && origFn != polyfilledFn;
197
+ if(changeFn){
198
+ origName = '__ws'+event;
199
+ isOrig = (event in elem) && has.call(elem, event);
200
+ elem[event] = polyfilledFn;
201
+ elem[origName] = origFn;
202
+ }
203
+
204
+ ret = oldTrigger.apply(this, arguments);
205
+ if (changeFn) {
206
+ if(isOrig){
207
+ elem[event] = origFn;
208
+ } else {
209
+ delete elem[event];
210
+ }
211
+ delete elem[origName];
212
+ }
213
+
214
+ return ret;
215
+ };
216
+ })($.event.trigger);
217
+ }
183
218
 
184
219
  ['removeAttr', 'prop', 'attr'].forEach(function(type){
185
220
  olds[type] = $[type];
@@ -264,6 +299,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
264
299
  }
265
300
  var oldDesc = extendedProps[nodeName][prop][type];
266
301
  var getSup = function(propType, descriptor, oDesc){
302
+ var origProp;
267
303
  if(descriptor && descriptor[propType]){
268
304
  return descriptor[propType];
269
305
  }
@@ -280,8 +316,10 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
280
316
  };
281
317
  }
282
318
  if(type == 'prop' && propType == 'value' && desc.value.apply){
319
+ origProp = '__ws'+prop;
320
+ hasPolyfillMethod[prop] = true;
283
321
  return function(value){
284
- var sup = olds[type](this, prop);
322
+ var sup = this[origProp] || olds[type](this, prop);
285
323
  if(sup && sup.apply){
286
324
  sup = sup.apply(this, arguments);
287
325
  }
@@ -319,7 +357,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
319
357
 
320
358
  var extendNativeValue = (function(){
321
359
  var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
322
- var has = Object.prototype.hasOwnProperty;
360
+
323
361
  //see also: https://github.com/lojjic/PIE/issues/40 | https://prototype.lighthouseapp.com/projects/8886/tickets/1107-ie8-fatal-crash-when-prototypejs-is-loaded-with-rounded-cornershtc
324
362
  var isExtendNativeSave = Modernizr.advancedObjectProperties && Modernizr.objectAccessor;
325
363
  return function(nodeName, prop, desc){
@@ -3,6 +3,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
3
3
  "use strict";
4
4
  var supportHrefNormalized = !('hrefNormalized' in $.support) || $.support.hrefNormalized;
5
5
  var supportGetSetAttribute = !('getSetAttribute' in $.support) || $.support.getSetAttribute;
6
+ var has = Object.prototype.hasOwnProperty;
6
7
  webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
7
8
 
8
9
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
@@ -75,6 +76,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
75
76
  //proxying attribute
76
77
  var olds = {};
77
78
  var havePolyfill = {};
79
+ var hasPolyfillMethod = {};
78
80
  var extendedProps = {};
79
81
  var extendQ = {};
80
82
  var modifyProps = {};
@@ -180,6 +182,39 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
180
182
  };
181
183
  });
182
184
 
185
+ //add support for $('video').trigger('play') in case extendNative is set to false
186
+ if(!webshims.cfg.extendNative && !webshims.cfg.noTriggerOverride){
187
+ (function(oldTrigger){
188
+ $.event.trigger = function(event, data, elem, onlyHandlers){
189
+
190
+ if(!hasPolyfillMethod[event] || onlyHandlers || !elem || elem.nodeType !== 1){
191
+ return oldTrigger.apply(this, arguments);
192
+ }
193
+ var ret, isOrig, origName;
194
+ var origFn = elem[event];
195
+ var polyfilledFn = $.prop(elem, event);
196
+ var changeFn = polyfilledFn && origFn != polyfilledFn;
197
+ if(changeFn){
198
+ origName = '__ws'+event;
199
+ isOrig = (event in elem) && has.call(elem, event);
200
+ elem[event] = polyfilledFn;
201
+ elem[origName] = origFn;
202
+ }
203
+
204
+ ret = oldTrigger.apply(this, arguments);
205
+ if (changeFn) {
206
+ if(isOrig){
207
+ elem[event] = origFn;
208
+ } else {
209
+ delete elem[event];
210
+ }
211
+ delete elem[origName];
212
+ }
213
+
214
+ return ret;
215
+ };
216
+ })($.event.trigger);
217
+ }
183
218
 
184
219
  ['removeAttr', 'prop', 'attr'].forEach(function(type){
185
220
  olds[type] = $[type];
@@ -264,6 +299,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
264
299
  }
265
300
  var oldDesc = extendedProps[nodeName][prop][type];
266
301
  var getSup = function(propType, descriptor, oDesc){
302
+ var origProp;
267
303
  if(descriptor && descriptor[propType]){
268
304
  return descriptor[propType];
269
305
  }
@@ -280,8 +316,10 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
280
316
  };
281
317
  }
282
318
  if(type == 'prop' && propType == 'value' && desc.value.apply){
319
+ origProp = '__ws'+prop;
320
+ hasPolyfillMethod[prop] = true;
283
321
  return function(value){
284
- var sup = olds[type](this, prop);
322
+ var sup = this[origProp] || olds[type](this, prop);
285
323
  if(sup && sup.apply){
286
324
  sup = sup.apply(this, arguments);
287
325
  }
@@ -319,7 +357,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
319
357
 
320
358
  var extendNativeValue = (function(){
321
359
  var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
322
- var has = Object.prototype.hasOwnProperty;
360
+
323
361
  //see also: https://github.com/lojjic/PIE/issues/40 | https://prototype.lighthouseapp.com/projects/8886/tickets/1107-ie8-fatal-crash-when-prototypejs-is-loaded-with-rounded-cornershtc
324
362
  var isExtendNativeSave = Modernizr.advancedObjectProperties && Modernizr.objectAccessor;
325
363
  return function(nodeName, prop, desc){
@@ -1147,17 +1185,21 @@ webshims.register('form-core', function($, webshims, window, document, undefined
1147
1185
  /*
1148
1186
  * Selectors for all browsers
1149
1187
  */
1188
+ var rElementsGroup = /^(?:form|fieldset)$/i;
1150
1189
  var hasInvalid = function(elem){
1151
1190
  var ret = false;
1152
1191
  $(elem).jProp('elements').each(function(){
1153
- ret = $(this).is(':invalid');
1154
- if(ret){
1155
- return false;
1192
+ if(!rElementsGroup.test(elem.nodeName || '')){
1193
+ ret = $(this).is(':invalid');
1194
+ if(ret){
1195
+ return false;
1196
+ }
1156
1197
  }
1198
+
1157
1199
  });
1158
1200
  return ret;
1159
1201
  };
1160
- var rElementsGroup = /^(?:form)$/i;///^(?:form|fieldset)$/i
1202
+
1161
1203
  $.extend($.expr[":"], {
1162
1204
  "valid-element": function(elem){
1163
1205
  return rElementsGroup.test(elem.nodeName || '') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));