webshims-rails 1.11.1 → 1.11.2

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 (55) hide show
  1. checksums.yaml +8 -8
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +41 -20
  4. data/vendor/assets/javascripts/webshims/shims/combos/10.js +212 -42
  5. data/vendor/assets/javascripts/webshims/shims/combos/11.js +196 -37
  6. data/vendor/assets/javascripts/webshims/shims/combos/12.js +82 -36
  7. data/vendor/assets/javascripts/webshims/shims/combos/13.js +82 -36
  8. data/vendor/assets/javascripts/webshims/shims/combos/14.js +17 -6
  9. data/vendor/assets/javascripts/webshims/shims/combos/15.js +234 -1247
  10. data/vendor/assets/javascripts/webshims/shims/combos/16.js +234 -1247
  11. data/vendor/assets/javascripts/webshims/shims/combos/17.js +202 -45
  12. data/vendor/assets/javascripts/webshims/shims/combos/18.js +202 -45
  13. data/vendor/assets/javascripts/webshims/shims/combos/19.js +16 -5
  14. data/vendor/assets/javascripts/webshims/shims/combos/2.js +51 -11
  15. data/vendor/assets/javascripts/webshims/shims/combos/20.js +16 -5
  16. data/vendor/assets/javascripts/webshims/shims/combos/21.js +82 -36
  17. data/vendor/assets/javascripts/webshims/shims/combos/22.js +82 -36
  18. data/vendor/assets/javascripts/webshims/shims/combos/24.js +1689 -997
  19. data/vendor/assets/javascripts/webshims/shims/combos/25.js +16 -5
  20. data/vendor/assets/javascripts/webshims/shims/combos/26.js +16 -5
  21. data/vendor/assets/javascripts/webshims/shims/combos/3.js +16 -5
  22. data/vendor/assets/javascripts/webshims/shims/combos/30.js +51 -11
  23. data/vendor/assets/javascripts/webshims/shims/combos/31.js +51 -11
  24. data/vendor/assets/javascripts/webshims/shims/combos/4.js +16 -5
  25. data/vendor/assets/javascripts/webshims/shims/combos/5.js +202 -45
  26. data/vendor/assets/javascripts/webshims/shims/combos/6.js +237 -51
  27. data/vendor/assets/javascripts/webshims/shims/combos/7.js +51 -11
  28. data/vendor/assets/javascripts/webshims/shims/combos/8.js +16 -5
  29. data/vendor/assets/javascripts/webshims/shims/combos/9.js +247 -48
  30. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +17 -5
  31. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +21 -3
  32. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +35 -6
  33. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +6 -8
  34. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +134 -24
  35. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +152 -1205
  36. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +1076 -0
  37. data/vendor/assets/javascripts/webshims/shims/form-validation.js +47 -20
  38. data/vendor/assets/javascripts/webshims/shims/form-validators.js +2 -2
  39. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +1 -1
  40. data/vendor/assets/javascripts/webshims/shims/i18n/{formcfg-de.txt → formcfg-de.js} +3 -0
  41. data/vendor/assets/javascripts/webshims/shims/i18n/{formcfg-en.txt → formcfg-en.js} +5 -1
  42. data/vendor/assets/javascripts/webshims/shims/json-storage.js +1 -1
  43. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +1 -1
  44. data/vendor/assets/javascripts/webshims/shims/range-ui.js +62 -13
  45. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +610 -0
  46. data/vendor/assets/javascripts/webshims/shims/styles/scss/_extends.scss +10 -0
  47. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +743 -0
  48. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +1 -755
  49. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +0 -606
  50. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  51. data/vendor/assets/javascripts/webshims/shims/track-ui.js +36 -23
  52. data/vendor/assets/javascripts/webshims/shims/track.js +82 -36
  53. metadata +8 -6
  54. data/vendor/assets/javascripts/webshims/shims/combos/28.js +0 -2196
  55. data/vendor/assets/javascripts/webshims/shims/combos/29.js +0 -1167
@@ -1261,7 +1261,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1261
1261
  webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
1262
1262
 
1263
1263
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
1264
- webshims.error("IE browser modes are busted in IE10. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
1264
+ webshims.error("IE browser modes are busted in IE10+. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
1265
1265
  }
1266
1266
 
1267
1267
  if(!$.parseHTML){
@@ -1814,7 +1814,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1814
1814
  $(this.test);
1815
1815
  webshims.ready('WINDOWLOAD', this.test);
1816
1816
  $(document).on('updatelayout', this.handler);
1817
- $(window).bind('resize', this.handler);
1817
+ $(window).on('resize', this.handler);
1818
1818
  (function(){
1819
1819
  var oldAnimate = $.fn.animate;
1820
1820
  var animationTimer;
@@ -1836,6 +1836,13 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1836
1836
  webshims.docObserve = function(){
1837
1837
  webshims.ready('DOM', function(){
1838
1838
  docObserve.start();
1839
+ if($.support.boxSizing == null){
1840
+ $(function(){
1841
+ if($.support.boxSizing){
1842
+ docObserve.handler({type: 'boxsizing'});
1843
+ }
1844
+ });
1845
+ }
1839
1846
  });
1840
1847
  };
1841
1848
  return function(nativeElem, shadowElem, opts){
@@ -1996,7 +2003,12 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1996
2003
  havePolyfill[prop] = true;
1997
2004
 
1998
2005
  if(descs.reflect){
1999
- webshims.propTypes[descs.propType || 'standard'](descs, prop);
2006
+ if(descs.propType && !webshims.propTypes[descs.propType]){
2007
+ webshims.error('could not finde propType '+ descs.propType);
2008
+ } else {
2009
+ webshims.propTypes[descs.propType || 'standard'](descs, prop);
2010
+ }
2011
+
2000
2012
  }
2001
2013
 
2002
2014
  ['prop', 'attr', 'removeAttr'].forEach(function(type){
@@ -2182,7 +2194,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2182
2194
  var notLocal = /:\/\/|^\.*\//;
2183
2195
  var loadRemoteLang = function(data, lang, options){
2184
2196
  var langSrc;
2185
- if(lang && options && $.inArray(lang, options.availabeLangs || []) !== -1){
2197
+ if(lang && options && $.inArray(lang, options.availableLangs || options.availabeLangs || []) !== -1){
2186
2198
  data.loading = true;
2187
2199
  langSrc = options.langSrc;
2188
2200
  if(!notLocal.test(langSrc)){
@@ -2342,7 +2354,6 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2342
2354
  });
2343
2355
 
2344
2356
  })(webshims.$, document);
2345
-
2346
2357
  (function(Modernizr, webshims){
2347
2358
  "use strict";
2348
2359
  var $ = webshims.$;
@@ -458,7 +458,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
458
458
  webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
459
459
 
460
460
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
461
- webshims.error("IE browser modes are busted in IE10. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
461
+ webshims.error("IE browser modes are busted in IE10+. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
462
462
  }
463
463
 
464
464
  if(!$.parseHTML){
@@ -1011,7 +1011,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1011
1011
  $(this.test);
1012
1012
  webshims.ready('WINDOWLOAD', this.test);
1013
1013
  $(document).on('updatelayout', this.handler);
1014
- $(window).bind('resize', this.handler);
1014
+ $(window).on('resize', this.handler);
1015
1015
  (function(){
1016
1016
  var oldAnimate = $.fn.animate;
1017
1017
  var animationTimer;
@@ -1033,6 +1033,13 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1033
1033
  webshims.docObserve = function(){
1034
1034
  webshims.ready('DOM', function(){
1035
1035
  docObserve.start();
1036
+ if($.support.boxSizing == null){
1037
+ $(function(){
1038
+ if($.support.boxSizing){
1039
+ docObserve.handler({type: 'boxsizing'});
1040
+ }
1041
+ });
1042
+ }
1036
1043
  });
1037
1044
  };
1038
1045
  return function(nativeElem, shadowElem, opts){
@@ -1193,7 +1200,12 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1193
1200
  havePolyfill[prop] = true;
1194
1201
 
1195
1202
  if(descs.reflect){
1196
- webshims.propTypes[descs.propType || 'standard'](descs, prop);
1203
+ if(descs.propType && !webshims.propTypes[descs.propType]){
1204
+ webshims.error('could not finde propType '+ descs.propType);
1205
+ } else {
1206
+ webshims.propTypes[descs.propType || 'standard'](descs, prop);
1207
+ }
1208
+
1197
1209
  }
1198
1210
 
1199
1211
  ['prop', 'attr', 'removeAttr'].forEach(function(type){
@@ -1379,7 +1391,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1379
1391
  var notLocal = /:\/\/|^\.*\//;
1380
1392
  var loadRemoteLang = function(data, lang, options){
1381
1393
  var langSrc;
1382
- if(lang && options && $.inArray(lang, options.availabeLangs || []) !== -1){
1394
+ if(lang && options && $.inArray(lang, options.availableLangs || options.availabeLangs || []) !== -1){
1383
1395
  data.loading = true;
1384
1396
  langSrc = options.langSrc;
1385
1397
  if(!notLocal.test(langSrc)){
@@ -1539,7 +1551,6 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1539
1551
  });
1540
1552
 
1541
1553
  })(webshims.$, document);
1542
-
1543
1554
  webshims.register('form-core', function($, webshims, window, document, undefined, options){
1544
1555
  "use strict";
1545
1556
 
@@ -1788,12 +1799,12 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
1788
1799
  /*
1789
1800
  * implement propType "element" currently only used for list-attribute (will be moved to dom-extend, if needed)
1790
1801
  */
1791
- webshims.propTypes.element = function(descs){
1802
+ webshims.propTypes.element = function(descs, name){
1792
1803
  webshims.createPropDefault(descs, 'attr');
1793
1804
  if(descs.prop){return;}
1794
1805
  descs.prop = {
1795
1806
  get: function(){
1796
- var elem = $.attr(this, 'list');
1807
+ var elem = $.attr(this, name);
1797
1808
  if(elem){
1798
1809
  elem = document.getElementById(elem);
1799
1810
  if(elem && descs.propNodeName && !$.nodeName(elem, descs.propNodeName)){
@@ -1817,7 +1828,15 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
1817
1828
  if(listSupport && !formsCFG.customDatalist){return;}
1818
1829
 
1819
1830
  var initializeDatalist = function(){
1820
-
1831
+
1832
+ var updateDatlistAndOptions = function(){
1833
+ var id;
1834
+ if(!$.data(this, 'datalistWidgetData') && (id = $.prop(this, 'id'))){
1835
+ $('input[list="'+ id +'"], input[data-wslist="'+ id +'"]').eq(0).attr('list', id);
1836
+ } else {
1837
+ $(this).triggerHandler('updateDatalist');
1838
+ }
1839
+ };
1821
1840
 
1822
1841
  var inputListProto = {
1823
1842
  //override autocomplete
@@ -1895,6 +1914,7 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
1895
1914
  id: value,
1896
1915
  datalist: $.prop(elem, 'list')
1897
1916
  });
1917
+ elem.setAttribute('data-wslist', value);
1898
1918
  } else {
1899
1919
  elem.setAttribute('list', value);
1900
1920
  }
@@ -1906,6 +1926,27 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
1906
1926
  propType: 'element',
1907
1927
  propNodeName: 'datalist'
1908
1928
  };
1929
+ } else {
1930
+ webshims.defineNodeNameProperties('input', {
1931
+ list: {
1932
+ attr: {
1933
+ get: function(){
1934
+ var val = webshims.contentAttr(this, 'list');
1935
+ return (val == null) ? undefined : val;
1936
+ },
1937
+ set: function(value){
1938
+ var elem = this;
1939
+ webshims.contentAttr(elem, 'list', value);
1940
+ webshims.objectCreate(options.shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
1941
+ $(elem).triggerHandler('listdatalistchange');
1942
+ }
1943
+ },
1944
+ initAttr: true,
1945
+ reflect: true,
1946
+ propType: 'element',
1947
+ propNodeName: 'datalist'
1948
+ }
1949
+ });
1909
1950
  }
1910
1951
 
1911
1952
  webshims.defineNodeNameProperties('input', inputListProto);
@@ -1914,9 +1955,7 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
1914
1955
  contextElem
1915
1956
  .filter('datalist > select, datalist, datalist > option, datalist > select > option')
1916
1957
  .closest('datalist')
1917
- .each(function(){
1918
- $(this).triggerHandler('updateDatalist');
1919
- })
1958
+ .each(updateDatlistAndOptions)
1920
1959
  ;
1921
1960
  });
1922
1961
  };
@@ -1961,6 +2000,7 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
1961
2000
  this.hasViewableData = true;
1962
2001
  this._autocomplete = $.attr(opts.input, 'autocomplete');
1963
2002
  $.data(opts.input, 'datalistWidget', this);
2003
+ $.data(datalist, 'datalistWidgetData', this);
1964
2004
 
1965
2005
  lazyLoad('WINDOWLOAD');
1966
2006
 
@@ -809,7 +809,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
809
809
  webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
810
810
 
811
811
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
812
- webshims.error("IE browser modes are busted in IE10. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
812
+ webshims.error("IE browser modes are busted in IE10+. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
813
813
  }
814
814
 
815
815
  if(!$.parseHTML){
@@ -1362,7 +1362,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1362
1362
  $(this.test);
1363
1363
  webshims.ready('WINDOWLOAD', this.test);
1364
1364
  $(document).on('updatelayout', this.handler);
1365
- $(window).bind('resize', this.handler);
1365
+ $(window).on('resize', this.handler);
1366
1366
  (function(){
1367
1367
  var oldAnimate = $.fn.animate;
1368
1368
  var animationTimer;
@@ -1384,6 +1384,13 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1384
1384
  webshims.docObserve = function(){
1385
1385
  webshims.ready('DOM', function(){
1386
1386
  docObserve.start();
1387
+ if($.support.boxSizing == null){
1388
+ $(function(){
1389
+ if($.support.boxSizing){
1390
+ docObserve.handler({type: 'boxsizing'});
1391
+ }
1392
+ });
1393
+ }
1387
1394
  });
1388
1395
  };
1389
1396
  return function(nativeElem, shadowElem, opts){
@@ -1544,7 +1551,12 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1544
1551
  havePolyfill[prop] = true;
1545
1552
 
1546
1553
  if(descs.reflect){
1547
- webshims.propTypes[descs.propType || 'standard'](descs, prop);
1554
+ if(descs.propType && !webshims.propTypes[descs.propType]){
1555
+ webshims.error('could not finde propType '+ descs.propType);
1556
+ } else {
1557
+ webshims.propTypes[descs.propType || 'standard'](descs, prop);
1558
+ }
1559
+
1548
1560
  }
1549
1561
 
1550
1562
  ['prop', 'attr', 'removeAttr'].forEach(function(type){
@@ -1730,7 +1742,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1730
1742
  var notLocal = /:\/\/|^\.*\//;
1731
1743
  var loadRemoteLang = function(data, lang, options){
1732
1744
  var langSrc;
1733
- if(lang && options && $.inArray(lang, options.availabeLangs || []) !== -1){
1745
+ if(lang && options && $.inArray(lang, options.availableLangs || options.availabeLangs || []) !== -1){
1734
1746
  data.loading = true;
1735
1747
  langSrc = options.langSrc;
1736
1748
  if(!notLocal.test(langSrc)){
@@ -1890,7 +1902,6 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1890
1902
  });
1891
1903
 
1892
1904
  })(webshims.$, document);
1893
-
1894
1905
  (function(Modernizr, webshims){
1895
1906
  "use strict";
1896
1907
  var $ = webshims.$;
@@ -1480,8 +1480,8 @@ webshims.register('track', function($, webshims, window, document, undefined){
1480
1480
  kind: 'subtitles',
1481
1481
  label: '',
1482
1482
  language: '',
1483
+ id: '',
1483
1484
  mode: 'disabled',
1484
- readyState: 0,
1485
1485
  oncuechange: null,
1486
1486
  toString: function() {
1487
1487
  return "[object TextTrack]";
@@ -1521,7 +1521,7 @@ webshims.register('track', function($, webshims, window, document, undefined){
1521
1521
  webshims.error("cue not part of track");
1522
1522
  return;
1523
1523
  }
1524
- },
1524
+ }/*,
1525
1525
  DISABLED: 'disabled',
1526
1526
  OFF: 'disabled',
1527
1527
  HIDDEN: 'hidden',
@@ -1529,7 +1529,7 @@ webshims.register('track', function($, webshims, window, document, undefined){
1529
1529
  ERROR: 3,
1530
1530
  LOADED: 2,
1531
1531
  LOADING: 1,
1532
- NONE: 0
1532
+ NONE: 0*/
1533
1533
  };
1534
1534
  var copyProps = ['kind', 'label', 'srclang'];
1535
1535
  var copyName = {srclang: 'language'};
@@ -1598,21 +1598,47 @@ webshims.register('track', function($, webshims, window, document, undefined){
1598
1598
  if(!trackData){
1599
1599
  trackData = webshims.data(track, 'trackData');
1600
1600
  }
1601
+
1601
1602
  if(trackData && !trackData.isTriggering){
1602
1603
  trackData.isTriggering = true;
1603
1604
  setTimeout(function(){
1604
- if(!(trackData.track || {}).readyState){
1605
- $(track).triggerHandler('checktrackmode');
1606
- } else {
1607
- $(track).closest('audio, video').triggerHandler('updatetrackdisplay');
1608
- }
1605
+ $(track).closest('audio, video').triggerHandler('updatetrackdisplay');
1609
1606
  trackData.isTriggering = false;
1610
1607
  }, 1);
1611
1608
  }
1612
1609
  };
1613
-
1610
+ var isDefaultTrack = (function(){
1611
+ var defaultKinds = {
1612
+ subtitles: {
1613
+ subtitles: 1,
1614
+ captions: 1
1615
+ },
1616
+ descriptions: {descriptions: 1},
1617
+ chapters: {chapters: 1}
1618
+ };
1619
+ defaultKinds.captions = defaultKinds.subtitles;
1620
+
1621
+ return function(track){
1622
+ var kind, firstDefaultTrack;
1623
+ var isDefault = $.prop(track, 'default');
1624
+ if(isDefault && (kind = $.prop(track, 'kind')) != 'metadata'){
1625
+ firstDefaultTrack = $(track)
1626
+ .parent()
1627
+ .find('track[default]')
1628
+ .filter(function(){
1629
+ return !!(defaultKinds[kind][$.prop(this, 'kind')]);
1630
+ })[0]
1631
+ ;
1632
+ if(firstDefaultTrack != track){
1633
+ isDefault = false;
1634
+ webshims.error('more than one default track of a specific kind detected. Fall back to default = false');
1635
+ }
1636
+ }
1637
+ return isDefault;
1638
+ };
1639
+ })();
1614
1640
  var emptyDiv = $('<div />')[0];
1615
- window.TextTrackCue = function(startTime, endTime, text){
1641
+ var TextTrackCue = function(startTime, endTime, text){
1616
1642
  if(arguments.length != 3){
1617
1643
  webshims.error("wrong arguments.length for TextTrackCue.constructor");
1618
1644
  }
@@ -1621,13 +1647,11 @@ webshims.register('track', function($, webshims, window, document, undefined){
1621
1647
  this.endTime = endTime;
1622
1648
  this.text = text;
1623
1649
 
1624
- this.id = "";
1625
- this.pauseOnExit = false;
1626
1650
 
1627
1651
  createEventTarget(this);
1628
1652
  };
1629
1653
 
1630
- window.TextTrackCue.prototype = {
1654
+ TextTrackCue.prototype = {
1631
1655
 
1632
1656
  onenter: null,
1633
1657
  onexit: null,
@@ -1669,6 +1693,7 @@ webshims.register('track', function($, webshims, window, document, undefined){
1669
1693
  // align: 'middle'
1670
1694
  };
1671
1695
 
1696
+ window.TextTrackCue = TextTrackCue;
1672
1697
 
1673
1698
 
1674
1699
 
@@ -1714,23 +1739,20 @@ webshims.register('track', function($, webshims, window, document, undefined){
1714
1739
  })();
1715
1740
 
1716
1741
  mediaelement.loadTextTrack = function(mediaelem, track, trackData, _default){
1717
- var loadEvents = 'play playing timeupdate updatetrackdisplay';
1742
+ var loadEvents = 'play playing updatetrackdisplay';
1718
1743
  var obj = trackData.track;
1719
1744
  var load = function(){
1720
- var src = $.prop(track, 'src');
1721
- var error;
1722
- var ajax;
1723
- if(obj.mode != 'disabled' && src && $.attr(track, 'src')){
1745
+ var error, ajax, src;
1746
+ if(obj.mode != 'disabled' && $.attr(track, 'src') && (src = $.prop(track, 'src'))){
1724
1747
  $(mediaelem).unbind(loadEvents, load);
1725
- $(track).unbind('checktrackmode', load);
1726
- if(!obj.readyState){
1748
+ if(!trackData.readyState){
1727
1749
  error = function(){
1728
- obj.readyState = 3;
1750
+ trackData.readyState = 3;
1729
1751
  obj.cues = null;
1730
1752
  obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = null;
1731
1753
  $(track).triggerHandler('error');
1732
1754
  };
1733
- obj.readyState = 1;
1755
+ trackData.readyState = 1;
1734
1756
  try {
1735
1757
  obj.cues = mediaelement.createCueList();
1736
1758
  obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = mediaelement.createCueList();
@@ -1743,7 +1765,7 @@ webshims.register('track', function($, webshims, window, document, undefined){
1743
1765
  }
1744
1766
  mediaelement.parseCaptions(text, obj, function(cues){
1745
1767
  if(cues && 'length' in cues){
1746
- obj.readyState = 2;
1768
+ trackData.readyState = 2;
1747
1769
  $(track).triggerHandler('load');
1748
1770
  $(mediaelem).triggerHandler('updatetrackdisplay');
1749
1771
  } else {
@@ -1756,20 +1778,18 @@ webshims.register('track', function($, webshims, window, document, undefined){
1756
1778
  });
1757
1779
  } catch(er){
1758
1780
  error();
1759
- webshims.warn(er);
1781
+ webshims.error(er);
1760
1782
  }
1761
1783
  }
1762
1784
  }
1763
1785
  };
1764
- obj.readyState = 0;
1786
+ trackData.readyState = 0;
1765
1787
  obj.shimActiveCues = null;
1766
1788
  obj._shimActiveCues = null;
1767
1789
  obj.activeCues = null;
1768
1790
  obj.cues = null;
1769
1791
  $(mediaelem).unbind(loadEvents, load);
1770
- $(track).unbind('checktrackmode', load);
1771
1792
  $(mediaelem).on(loadEvents, load);
1772
- $(track).on('checktrackmode', load);
1773
1793
  if(_default){
1774
1794
  obj.mode = showTracks[obj.kind] ? 'showing' : 'hidden';
1775
1795
  load();
@@ -1811,9 +1831,9 @@ webshims.register('track', function($, webshims, window, document, undefined){
1811
1831
  });
1812
1832
  });
1813
1833
  }
1814
-
1834
+ obj.id = $(track).prop('id');
1815
1835
  trackData = webshims.data(track, 'trackData', {track: obj});
1816
- mediaelement.loadTextTrack(mediaelem, track, trackData, ($.prop(track, 'default') && $(track).siblings('track[default]')[ADDBACK]()[0] == track));
1836
+ mediaelement.loadTextTrack(mediaelem, track, trackData, isDefaultTrack(track));
1817
1837
  } else {
1818
1838
  if(supportTrackMod){
1819
1839
  copyProps.forEach(function(copyProp){
@@ -1828,7 +1848,12 @@ webshims.register('track', function($, webshims, window, document, undefined){
1828
1848
  obj.mode = 'hidden';
1829
1849
  obj.readyState = 2;
1830
1850
  }
1851
+ if(obj.kind == 'subtitles' && !obj.language){
1852
+ webshims.error('you must provide a language for track in subtitles state');
1853
+ }
1854
+ obj.__wsmode = obj.mode;
1831
1855
  }
1856
+
1832
1857
  return obj;
1833
1858
  };
1834
1859
 
@@ -2021,9 +2046,33 @@ modified for webshims
2021
2046
  baseData.textTracks = [];
2022
2047
  webshims.defineProperties(baseData.textTracks, {
2023
2048
  onaddtrack: {value: null},
2024
- onremovetrack: {value: null}
2049
+ onremovetrack: {value: null},
2050
+ onchange: {value: null},
2051
+ getTrackById: {
2052
+ value: function(id){
2053
+ var track = null;
2054
+ for(var i = 0; i < baseData.textTracks.length; i++){
2055
+ if(id == baseData.textTracks[i].id){
2056
+ track = baseData.textTracks[i];
2057
+ break;
2058
+ }
2059
+ }
2060
+ return track;
2061
+ }
2062
+ }
2025
2063
  });
2026
2064
  createEventTarget(baseData.textTracks);
2065
+ $(mediaelem).on('updatetrackdisplay', function(){
2066
+ var track;
2067
+ for(var i = 0; i < baseData.textTracks.length; i++){
2068
+ track = baseData.textTracks[i];
2069
+ if(track.__wsmode != track.mode){
2070
+ track.__wsmode = track.mode;
2071
+ $([ baseData.textTracks ]).triggerHandler('change');
2072
+ }
2073
+ }
2074
+ });
2075
+
2027
2076
  }
2028
2077
  return baseData.textTracks;
2029
2078
  };
@@ -2078,10 +2127,6 @@ modified for webshims
2078
2127
  if(!supportTrackMod){
2079
2128
  trackData.track[name] = $.prop(this, copyProp);
2080
2129
  }
2081
- clearTimeout(trackData.changedTrackPropTimer);
2082
- trackData.changedTrackPropTimer = setTimeout(function(){
2083
- $(track).trigger('updatesubtitlestate');
2084
- }, 1);
2085
2130
  }
2086
2131
  });
2087
2132
  });
@@ -2118,7 +2163,8 @@ modified for webshims
2118
2163
  },
2119
2164
  readyState: {
2120
2165
  get: function(){
2121
- return ($.prop(this, 'track') || {readyState: 0}).readyState;
2166
+
2167
+ return (webshims.data(this, 'trackData') || {readyState: 0}).readyState;
2122
2168
  },
2123
2169
  writeable: false
2124
2170
  },
@@ -2236,7 +2282,7 @@ modified for webshims
2236
2282
  });
2237
2283
  });
2238
2284
 
2239
- if(Modernizr.track){
2285
+ if(Modernizr.texttrackapi){
2240
2286
  $('video, audio').trigger('trackapichange');
2241
2287
  }
2242
2288
  });