webshims-rails 1.11.1 → 1.11.2

Sign up to get free protection for your applications and to get access to all the features.
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
  });