webshims-rails 1.14.5 → 1.14.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +2 -0
  3. data/lib/webshims-rails/version.rb +2 -2
  4. data/readme.textile +7 -0
  5. data/vendor/assets/javascripts/webshims/polyfiller.js +38 -6
  6. data/vendor/assets/javascripts/webshims/shims/combos/1.js +26 -20
  7. data/vendor/assets/javascripts/webshims/shims/combos/10.js +54 -19
  8. data/vendor/assets/javascripts/webshims/shims/combos/11.js +32 -15
  9. data/vendor/assets/javascripts/webshims/shims/combos/12.js +45 -21
  10. data/vendor/assets/javascripts/webshims/shims/combos/13.js +45 -21
  11. data/vendor/assets/javascripts/webshims/shims/combos/15.js +22 -4
  12. data/vendor/assets/javascripts/webshims/shims/combos/16.js +48 -24
  13. data/vendor/assets/javascripts/webshims/shims/combos/17.js +32 -15
  14. data/vendor/assets/javascripts/webshims/shims/combos/18.js +18 -81
  15. data/vendor/assets/javascripts/webshims/shims/combos/2.js +48 -24
  16. data/vendor/assets/javascripts/webshims/shims/combos/21.js +286 -179
  17. data/vendor/assets/javascripts/webshims/shims/combos/22.js +19 -1
  18. data/vendor/assets/javascripts/webshims/shims/combos/23.js +26 -20
  19. data/vendor/assets/javascripts/webshims/shims/combos/25.js +311 -199
  20. data/vendor/assets/javascripts/webshims/shims/combos/26.js +22 -17
  21. data/vendor/assets/javascripts/webshims/shims/combos/27.js +22 -17
  22. data/vendor/assets/javascripts/webshims/shims/combos/3.js +22 -4
  23. data/vendor/assets/javascripts/webshims/shims/combos/30.js +22 -4
  24. data/vendor/assets/javascripts/webshims/shims/combos/31.js +22 -4
  25. data/vendor/assets/javascripts/webshims/shims/combos/34.js +41 -5
  26. data/vendor/assets/javascripts/webshims/shims/combos/4.js +22 -4
  27. data/vendor/assets/javascripts/webshims/shims/combos/5.js +32 -15
  28. data/vendor/assets/javascripts/webshims/shims/combos/6.js +32 -15
  29. data/vendor/assets/javascripts/webshims/shims/combos/7.js +48 -24
  30. data/vendor/assets/javascripts/webshims/shims/combos/8.js +48 -24
  31. data/vendor/assets/javascripts/webshims/shims/combos/9.js +54 -19
  32. data/vendor/assets/javascripts/webshims/shims/combos/98.js +24 -7
  33. data/vendor/assets/javascripts/webshims/shims/combos/99.js +24 -7
  34. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +22 -4
  35. data/vendor/assets/javascripts/webshims/shims/es5.js +3 -1
  36. data/vendor/assets/javascripts/webshims/shims/es6.js +1 -5
  37. data/vendor/assets/javascripts/webshims/shims/filereader.js +22 -17
  38. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +32 -15
  39. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +18 -8
  40. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-fa.js +1 -1
  41. data/vendor/assets/javascripts/webshims/shims/jme/controls.css +11 -0
  42. data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +16 -0
  43. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +3 -20
  44. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols.js +24 -7
  45. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +26 -20
  46. data/vendor/assets/javascripts/webshims/shims/mediaelement-debug.js +9 -1
  47. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +267 -178
  48. data/vendor/assets/javascripts/webshims/shims/picture.js +18 -81
  49. data/vendor/assets/javascripts/webshims/shims/plugins/jquery.ui.position.js +1 -9
  50. data/vendor/assets/javascripts/webshims/shims/sizzle.js +1 -8
  51. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +4 -0
  52. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +5 -0
  53. data/vendor/assets/javascripts/webshims/shims/styles/shim-ext.css +4 -0
  54. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  55. data/vendor/assets/javascripts/webshims/shims/track.js +19 -1
  56. data/vendor/assets/javascripts/webshims/shims/url.js +316 -0
  57. data/vendor/assets/javascripts/webshims/shims/usermedia-core.js +28 -0
  58. data/vendor/assets/javascripts/webshims/shims/usermedia-shim.js +179 -0
  59. metadata +5 -3
  60. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +0 -511
@@ -283,7 +283,6 @@ webshims.isReady('swfmini', true);
283
283
  webshims.register('dom-extend', function($, webshims, window, document, undefined){
284
284
  "use strict";
285
285
  var supportHrefNormalized = !('hrefNormalized' in $.support) || $.support.hrefNormalized;
286
- var supportGetSetAttribute = !('getSetAttribute' in $.support) || $.support.getSetAttribute;
287
286
  var has = Object.prototype.hasOwnProperty;
288
287
  webshims.assumeARIA = true;
289
288
 
@@ -314,7 +313,6 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
314
313
  }
315
314
 
316
315
  //shortcus
317
- var modules = webshims.modules;
318
316
  var listReg = /\s*,\s*/;
319
317
 
320
318
  //proxying attribute
@@ -699,8 +697,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
699
697
  (tempCache || $( document.getElementsByTagName(nodeName) )).each(fn);
700
698
  }
701
699
  };
702
-
703
- var elementExtends = {};
700
+
704
701
  return {
705
702
  createTmpCache: function(nodeName){
706
703
  if($.isDOMReady){
@@ -752,6 +749,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
752
749
  };
753
750
 
754
751
  $.extend(webshims, {
752
+ xProps: havePolyfill,
755
753
  getID: (function(){
756
754
  var ID = new Date().getTime();
757
755
  return function(elem){
@@ -765,6 +763,26 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
765
763
  return id;
766
764
  };
767
765
  })(),
766
+ domPrefixes: ["ws", "webkit", "moz", "ms", "o"],
767
+
768
+ prefixed: function (prop, obj){
769
+ var i, testProp;
770
+ var ret = false;
771
+ if(obj[prop]){
772
+ ret = prop;
773
+ }
774
+ if(!ret){
775
+ prop = prop.charAt(0).toUpperCase() + prop.slice(1);
776
+ for(i = 0; i < webshims.domPrefixes.length; i++){
777
+ testProp = webshims.domPrefixes[i]+prop;
778
+ if(testProp in obj){
779
+ ret = testProp;
780
+ break;
781
+ }
782
+ }
783
+ }
784
+ return ret;
785
+ },
768
786
  shadowClass: 'wsshadow-'+(Date.now()),
769
787
  implement: function(elem, type){
770
788
  var data = elementData(elem, 'implemented') || elementData(elem, 'implemented', {});
@@ -2117,7 +2135,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2117
2135
  }
2118
2136
 
2119
2137
  webshims.register('mediaelement-core', function($, webshims, window, document, undefined, options){
2120
- var hasSwf = swfmini.hasFlashPlayerVersion('10.0.3');
2138
+ var hasSwf = swfmini.hasFlashPlayerVersion('11.3');
2121
2139
  var mediaelement = webshims.mediaelement;
2122
2140
 
2123
2141
  mediaelement.parseRtmp = function(data){
@@ -2227,6 +2245,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2227
2245
  loadYt();
2228
2246
  }
2229
2247
  };
2248
+
2230
2249
 
2231
2250
  webshims.addPolyfill('mediaelement-yt', {
2232
2251
  test: !hasYt,
@@ -2271,7 +2290,16 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2271
2290
  if(src.indexOf('youtube.com/watch?') != -1 || src.indexOf('youtube.com/v/') != -1){
2272
2291
  return 'video/youtube';
2273
2292
  }
2274
- if(src.indexOf('rtmp') === 0){
2293
+
2294
+ if(!src.indexOf('mediastream:') || !src.indexOf('blob:http')){
2295
+ return 'usermedia';
2296
+ }
2297
+
2298
+ if(!src.indexOf('webshimstream')){
2299
+ return 'jarisplayer/stream';
2300
+ }
2301
+
2302
+ if(!src.indexOf('rtmp')){
2275
2303
  return nodeName+'/rtmp';
2276
2304
  }
2277
2305
  src = src.split('?')[0].split('#')[0].split('.');
@@ -2288,28 +2316,24 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2288
2316
  };
2289
2317
 
2290
2318
 
2291
- mediaelement.srces = function(mediaElem, srces){
2319
+ mediaelement.srces = function(mediaElem){
2320
+ var srces = [];
2292
2321
  mediaElem = $(mediaElem);
2293
- if(!srces){
2294
- srces = [];
2295
- var nodeName = mediaElem[0].nodeName.toLowerCase();
2296
- var src = getSrcObj(mediaElem, nodeName);
2297
-
2298
- if(!src.src){
2299
- $('source', mediaElem).each(function(){
2300
- src = getSrcObj(this, nodeName);
2301
- if(src.src){srces.push(src);}
2302
- });
2303
- } else {
2304
- srces.push(src);
2305
- }
2306
- return srces;
2322
+ var nodeName = mediaElem[0].nodeName.toLowerCase();
2323
+ var src = getSrcObj(mediaElem, nodeName);
2324
+
2325
+ if(!src.src){
2326
+ $('source', mediaElem).each(function(){
2327
+ src = getSrcObj(this, nodeName);
2328
+ if(src.src){srces.push(src);}
2329
+ });
2307
2330
  } else {
2308
- webshims.error('setting sources was removed.');
2331
+ srces.push(src);
2309
2332
  }
2333
+ return srces;
2310
2334
  };
2311
2335
 
2312
- mediaelement.swfMimeTypes = ['video/3gpp', 'video/x-msvideo', 'video/quicktime', 'video/x-m4v', 'video/mp4', 'video/m4p', 'video/x-flv', 'video/flv', 'audio/mpeg', 'audio/aac', 'audio/mp4', 'audio/x-m4a', 'audio/m4a', 'audio/mp3', 'audio/x-fla', 'audio/fla', 'youtube/flv', 'video/jarisplayer', 'jarisplayer/jarisplayer', 'video/youtube', 'video/rtmp', 'audio/rtmp'];
2336
+ mediaelement.swfMimeTypes = ['video/3gpp', 'video/x-msvideo', 'video/quicktime', 'video/x-m4v', 'video/mp4', 'video/m4p', 'video/x-flv', 'video/flv', 'audio/mpeg', 'audio/aac', 'audio/mp4', 'audio/x-m4a', 'audio/m4a', 'audio/mp3', 'audio/x-fla', 'audio/fla', 'youtube/flv', 'video/jarisplayer', 'jarisplayer/jarisplayer', 'jarisplayer/stream', 'video/youtube', 'video/rtmp', 'audio/rtmp'];
2313
2337
 
2314
2338
  mediaelement.canThirdPlaySrces = function(mediaElem, srces){
2315
2339
  var ret = '';
@@ -2339,7 +2363,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2339
2363
  srces = srces || mediaelement.srces(mediaElem);
2340
2364
 
2341
2365
  $.each(srces, function(i, src){
2342
- if(src.type && nativeCanPlay.call(mediaElem[0], src.type) ){
2366
+ if(src.type == 'usermedia' || (src.type && nativeCanPlay.call(mediaElem[0], src.type)) ){
2343
2367
  ret = src;
2344
2368
  return false;
2345
2369
  }
@@ -335,12 +335,12 @@
335
335
  });
336
336
  ;webshims.register('mediaelement-jaris', function($, webshims, window, document, undefined, options){
337
337
  "use strict";
338
-
338
+
339
339
  var mediaelement = webshims.mediaelement;
340
340
  var swfmini = window.swfmini;
341
341
  var support = webshims.support;
342
342
  var hasNative = support.mediaelement;
343
- var hasFlash = swfmini.hasFlashPlayerVersion('9.0.115');
343
+ var hasFlash = swfmini.hasFlashPlayerVersion('11.3');
344
344
  var loadedSwf = 0;
345
345
  var needsLoadPreload = 'ActiveXObject' in window && hasNative;
346
346
  var getProps = {
@@ -373,18 +373,19 @@
373
373
  }
374
374
  };
375
375
  var getPropKeys = Object.keys(getProps);
376
-
376
+
377
377
  var getSetProps = {
378
378
  currentTime: 0,
379
379
  volume: 1,
380
380
  muted: false
381
381
  };
382
382
  var getSetPropKeys = Object.keys(getSetProps);
383
-
383
+
384
384
  var playerStateObj = $.extend({
385
385
  isActive: 'html5',
386
- activating: 'html5',
386
+ activating: 'html5',
387
387
  wasSwfReady: false,
388
+ _usermedia: null,
388
389
  _bufferedEnd: 0,
389
390
  _bufferedStart: 0,
390
391
  currentTime: 0,
@@ -394,8 +395,8 @@
394
395
  lastDuration: 0,
395
396
  _timeDif: 0.3
396
397
  }, getProps, getSetProps);
397
-
398
-
398
+
399
+
399
400
  var getSwfDataFromElem = function(elem){
400
401
  try {
401
402
  (elem.nodeName);
@@ -405,15 +406,15 @@
405
406
  var data = webshims.data(elem, 'mediaelement');
406
407
  return (data && data.isActive == 'third') ? data : null;
407
408
  };
408
-
409
+
409
410
  var trigger = function(elem, evt){
410
411
  evt = $.Event(evt);
411
412
  evt.preventDefault();
412
413
  $.event.trigger(evt, undefined, elem);
413
414
  };
414
-
415
+
415
416
  var playerSwfPath = options.playerPath || webshims.cfg.basePath + "swf/" + (options.playerName || 'JarisFLVPlayer.swf');
416
-
417
+
417
418
  webshims.extendUNDEFProp(options.params, {
418
419
  allowscriptaccess: 'always',
419
420
  allowfullscreen: 'true',
@@ -427,7 +428,8 @@
427
428
  webshims.extendUNDEFProp(options.attrs, {
428
429
  bgcolor: '#000000'
429
430
  });
430
-
431
+ options.playerPath = playerSwfPath;
432
+
431
433
  var setReadyState = function(readyState, data){
432
434
  if(readyState < 3){
433
435
  clearTimeout(data._canplaythroughTimer);
@@ -455,8 +457,8 @@
455
457
  $(data._elem).triggerHandler('seeked');
456
458
  }
457
459
  };
458
-
459
-
460
+
461
+
460
462
  mediaelement.jarisEvent = {};
461
463
  var localConnectionTimer;
462
464
  var onEvent = {
@@ -471,7 +473,7 @@
471
473
  playing = override;
472
474
  }
473
475
  if(playing == idled || playing == null){
474
-
476
+
475
477
  data.paused = !playing;
476
478
  type = data.paused ? 'pause' : 'play';
477
479
  data._ppFlag = true;
@@ -486,7 +488,7 @@
486
488
  },
487
489
  onSeek: function(jaris, data){
488
490
  data._lastSeektime = jaris.seekTime;
489
-
491
+
490
492
  data.seeking = true;
491
493
  $(data._elem).triggerHandler('seeking');
492
494
  clearTimeout(data._seekedTimer);
@@ -502,19 +504,19 @@
502
504
  setReadyState(3, data);
503
505
  },
504
506
  onDataInitialized: function(jaris, data){
505
-
507
+
506
508
  var oldDur = data.duration;
507
509
  var durDelta;
508
510
  data.duration = jaris.duration;
509
511
  if(oldDur == data.duration || isNaN(data.duration)){return;}
510
-
512
+
511
513
  if(data._calledMeta && ((durDelta = Math.abs(data.lastDuration - data.duration)) < 2)){return;}
512
-
513
-
514
-
514
+
515
+
516
+
515
517
  data.videoHeight = jaris.height;
516
518
  data.videoWidth = jaris.width;
517
-
519
+
518
520
  if(!data.networkState){
519
521
  data.networkState = 2;
520
522
  }
@@ -570,7 +572,7 @@
570
572
  data.lastCalledTime = data.currentTime;
571
573
  $.event.trigger('timeupdate', undefined, data._elem, true);
572
574
  }
573
-
575
+
574
576
  },
575
577
  onProgress: function(jaris, data){
576
578
  if(data.ended){
@@ -580,7 +582,7 @@
580
582
  return;
581
583
  }
582
584
  var percentage = jaris.loaded / jaris.total;
583
-
585
+
584
586
  if(percentage > 0.02 && percentage < 0.2){
585
587
  setReadyState(3, data);
586
588
  } else if(percentage > 0.2){
@@ -593,10 +595,10 @@
593
595
  if(data._bufferedEnd && (data._bufferedEnd > percentage)){
594
596
  data._bufferedStart = data.currentTime || 0;
595
597
  }
596
-
598
+
597
599
  data._bufferedEnd = percentage;
598
600
  data.buffered.length = 1;
599
-
601
+
600
602
  $.event.trigger('progress', undefined, data._elem, true);
601
603
  },
602
604
  onPlaybackFinished: function(jaris, data){
@@ -616,7 +618,7 @@
616
618
  ready: (function(){
617
619
  var testAPI = function(data){
618
620
  var passed = true;
619
-
621
+
620
622
  try {
621
623
  data.api.api_get('volume');
622
624
  } catch(er){
@@ -624,17 +626,17 @@
624
626
  }
625
627
  return passed;
626
628
  };
627
-
629
+
628
630
  return function(jaris, data){
629
631
  var i = 0;
630
-
632
+
631
633
  var doneFn = function(){
632
634
  if(i > 9){
633
635
  data.tryedReframeing = 0;
634
636
  return;
635
637
  }
636
638
  i++;
637
-
639
+
638
640
  data.tryedReframeing++;
639
641
  if(testAPI(data)){
640
642
  data.wasSwfReady = true;
@@ -664,25 +666,25 @@
664
666
  clearTimeout(localConnectionTimer);
665
667
  clearTimeout(data.reframeTimer);
666
668
  data.shadowElem.removeClass('flashblocker-assumed');
667
-
669
+
668
670
  if(!i){
669
671
  doneFn();
670
672
  } else {
671
673
  data.reframeTimer = setTimeout(doneFn, 9);
672
674
  }
673
-
675
+
674
676
  };
675
677
  })()
676
678
  };
677
-
679
+
678
680
  onEvent.onMute = onEvent.onVolumeChange;
679
-
680
-
681
+ mediaelement.onEvent = onEvent;
682
+
681
683
  var workActionQueue = function(data){
682
684
  var actionLen = data.actionQueue.length;
683
685
  var i = 0;
684
686
  var operation;
685
-
687
+
686
688
  if(actionLen && data.isActive == 'third'){
687
689
  while(data.actionQueue.length && actionLen > i){
688
690
  i++;
@@ -703,7 +705,7 @@
703
705
  if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
704
706
  setTimeout(function(){
705
707
  if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
706
-
708
+
707
709
  try {
708
710
  $(data._elem).play();
709
711
  data._ppFlag = true;
@@ -711,7 +713,7 @@
711
713
  }
712
714
  }, 1);
713
715
  }
714
-
716
+
715
717
  if(data.muted){
716
718
  $.prop(data._elem, 'muted', true);
717
719
  }
@@ -719,8 +721,8 @@
719
721
  $.prop(data._elem, 'volume', data.volume);
720
722
  }
721
723
  };
722
-
723
-
724
+
725
+
724
726
  var addMediaToStopEvents = $.noop;
725
727
  if(hasNative){
726
728
  var stopEvents = {
@@ -731,14 +733,14 @@
731
733
  var hidevents = hideEvtArray.map(function(evt){
732
734
  return evt +'.webshimspolyfill';
733
735
  }).join(' ');
734
-
736
+
735
737
  var hidePlayerEvents = function(event){
736
738
  var data = webshims.data(event.target, 'mediaelement');
737
739
  if(!data){return;}
738
740
  var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
739
741
  if( isNativeHTML5 == (data.activating == 'third') ){
740
742
  event.stopImmediatePropagation();
741
-
743
+
742
744
  if(stopEvents[event.type]){
743
745
  if(data.isActive != data.activating){
744
746
  $(event.target).pause();
@@ -748,7 +750,7 @@
748
750
  }
749
751
  }
750
752
  };
751
-
753
+
752
754
  addMediaToStopEvents = function(elem){
753
755
  $(elem)
754
756
  .off(hidevents)
@@ -760,8 +762,8 @@
760
762
  };
761
763
  addMediaToStopEvents(document);
762
764
  }
763
-
764
-
765
+
766
+
765
767
  mediaelement.setActive = function(elem, type, data){
766
768
  if(!data){
767
769
  data = webshims.data(elem, 'mediaelement');
@@ -783,14 +785,14 @@
783
785
  }
784
786
  $(elem).trigger('mediaelementapichange');
785
787
  };
786
-
787
-
788
-
788
+
789
+
790
+
789
791
  var resetSwfProps = (function(){
790
- var resetProtoProps = ['_calledMeta', 'lastDuration', '_bufferedEnd', 'lastCalledTime', '_bufferedStart', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'seeking', 'videoHeight', 'videoWidth'];
792
+ var resetProtoProps = ['_calledMeta', 'lastDuration', '_bufferedEnd', 'lastCalledTime', '_usermedia', '_bufferedStart', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'seeking', 'videoHeight', 'videoWidth'];
791
793
  var len = resetProtoProps.length;
792
794
  return function(data){
793
-
795
+
794
796
  if(!data){return;}
795
797
  clearTimeout(data._seekedTimer);
796
798
  var lenI = len;
@@ -807,8 +809,8 @@
807
809
  }
808
810
  };
809
811
  })();
810
-
811
-
812
+
813
+
812
814
  var getComputedDimension = (function(){
813
815
  var dimCache = {};
814
816
  var getVideoDims = function(data){
@@ -830,7 +832,7 @@
830
832
  width: this.width,
831
833
  height: this.height
832
834
  };
833
-
835
+
834
836
  if(dimCache[poster].height && dimCache[poster].width){
835
837
  setElementDimension(data, $.prop(data._elem, 'controls'));
836
838
  } else {
@@ -846,12 +848,12 @@
846
848
  }
847
849
  return ret || {width: 300, height: data._elemNodeName == 'video' ? 150 : 50};
848
850
  };
849
-
851
+
850
852
  var getCssStyle = function(elem, style){
851
853
  return elem.style[style] || (elem.currentStyle && elem.currentStyle[style]) || (window.getComputedStyle && (window.getComputedStyle( elem, null ) || {} )[style]) || '';
852
854
  };
853
855
  var minMaxProps = ['minWidth', 'maxWidth', 'minHeight', 'maxHeight'];
854
-
856
+
855
857
  var addMinMax = function(elem, ret){
856
858
  var i, prop;
857
859
  var hasMinMax = false;
@@ -865,7 +867,7 @@
865
867
  return hasMinMax;
866
868
  };
867
869
  var retFn = function(data){
868
- var videoDims, ratio, hasMinMax;
870
+ var videoDims, ratio;
869
871
  var elem = data._elem;
870
872
  var autos = {
871
873
  width: getCssStyle(elem, 'width') == 'auto',
@@ -875,11 +877,11 @@
875
877
  width: !autos.width && $(elem).width(),
876
878
  height: !autos.height && $(elem).height()
877
879
  };
878
-
880
+
879
881
  if(autos.width || autos.height){
880
882
  videoDims = getVideoDims(data);
881
883
  ratio = videoDims.width / videoDims.height;
882
-
884
+
883
885
  if(autos.width && autos.height){
884
886
  ret.width = videoDims.width;
885
887
  ret.height = videoDims.height;
@@ -888,12 +890,12 @@
888
890
  } else if(autos.height){
889
891
  ret.height = ret.width / ratio;
890
892
  }
891
-
893
+
892
894
  if(addMinMax(elem, ret)){
893
895
  data.shadowElem.css(ret);
894
896
  if(autos.width){
895
897
  ret.width = data.shadowElem.height() * ratio;
896
- }
898
+ }
897
899
  if(autos.height){
898
900
  ret.height = ((autos.width) ? ret.width : data.shadowElem.width()) / ratio;
899
901
  }
@@ -901,11 +903,11 @@
901
903
  data.shadowElem.css(ret);
902
904
  ret.height = data.shadowElem.width() / ratio;
903
905
  ret.width = ret.height * ratio;
904
-
906
+
905
907
  data.shadowElem.css(ret);
906
908
  ret.width = data.shadowElem.height() * ratio;
907
909
  ret.height = ret.width / ratio;
908
-
910
+
909
911
  }
910
912
  if(!webshims.support.mediaelement){
911
913
  ret.width = data.shadowElem.width();
@@ -915,13 +917,13 @@
915
917
  }
916
918
  return ret;
917
919
  };
918
-
920
+
919
921
  return retFn;
920
922
  })();
921
-
923
+
922
924
  var setElementDimension = function(data, hasControls){
923
925
  var dims;
924
-
926
+
925
927
  var box = data.shadowElem;
926
928
  $(data._elem)[hasControls ? 'addClass' : 'removeClass']('webshims-controls');
927
929
 
@@ -936,7 +938,7 @@
936
938
  }
937
939
  }
938
940
  };
939
-
941
+
940
942
  var bufferSrc = (function(){
941
943
  var preloads = {
942
944
  '': 1,
@@ -951,17 +953,17 @@
951
953
  return !!(preloads[preload] || (preload == 'metadata' && $(elem).is('.preload-in-doubt, video:not([poster])')));
952
954
  };
953
955
  })();
954
-
956
+
955
957
  var regs = {
956
- A: /&amp;/g,
957
- a: /&/g,
958
- e: /\=/g,
959
- q: /\?/g
960
- },
961
- replaceVar = function(val){
962
- return (val.replace) ? val.replace(regs.A, '%26').replace(regs.a, '%26').replace(regs.e, '%3D').replace(regs.q, '%3F') : val;
963
- };
964
-
958
+ A: /&amp;/g,
959
+ a: /&/g,
960
+ e: /\=/g,
961
+ q: /\?/g
962
+ },
963
+ replaceVar = function(val){
964
+ return (val.replace) ? val.replace(regs.A, '%26').replace(regs.a, '%26').replace(regs.e, '%3D').replace(regs.q, '%3F') : val;
965
+ };
966
+
965
967
  if('matchMedia' in window){
966
968
  var allowMediaSorting = false;
967
969
  try {
@@ -975,14 +977,15 @@
975
977
  } catch(er){
976
978
  return 0;
977
979
  }
978
- return src1 == src2 ?
980
+ return src1 == src2 ?
979
981
  0 :
980
982
  src1 ? -1
981
- : 1;
983
+ : 1;
982
984
  };
983
985
  }
984
986
  }
985
987
 
988
+ mediaelement.resetSwfProps = resetSwfProps;
986
989
  mediaelement.createSWF = function( elem, canPlaySrc, data ){
987
990
  if(!hasFlash){
988
991
  setTimeout(function(){
@@ -990,7 +993,7 @@
990
993
  }, 1);
991
994
  return;
992
995
  }
993
-
996
+
994
997
  var attrStyle = {};
995
998
 
996
999
  if(loadedSwf < 1){
@@ -1001,55 +1004,40 @@
1001
1004
  if(!data){
1002
1005
  data = webshims.data(elem, 'mediaelement');
1003
1006
  }
1004
-
1007
+
1005
1008
  if((attrStyle.height = $.attr(elem, 'height') || '') || (attrStyle.width = $.attr(elem, 'width') || '')){
1006
1009
  $(elem).css(attrStyle);
1007
1010
  webshims.warn("width or height content attributes used. Webshims prefers the usage of CSS (computed styles or inline styles) to detect size of a video/audio. It's really more powerfull.");
1008
1011
  }
1009
-
1010
- var isRtmp = canPlaySrc.type == 'audio/rtmp' || canPlaySrc.type == 'video/rtmp';
1011
- var vars = $.extend({}, options.vars, {
1012
- poster: replaceVar($.attr(elem, 'poster') && $.prop(elem, 'poster') || ''),
1013
- source: replaceVar(canPlaySrc.streamId || canPlaySrc.srcProp),
1014
- server: replaceVar(canPlaySrc.server || '')
1015
- });
1016
- var elemVars = $(elem).data('vars') || {};
1017
-
1018
-
1019
-
1012
+ var box;
1013
+ var streamRequest = canPlaySrc.streamrequest;
1014
+ var isStream = canPlaySrc.type == 'jarisplayer/stream';
1015
+
1016
+
1020
1017
  var hasControls = $.prop(elem, 'controls');
1021
1018
  var elemId = 'jarisplayer-'+ webshims.getID(elem);
1022
-
1023
- var params = $.extend(
1024
- {},
1025
- options.params,
1026
- $(elem).data('params')
1027
- );
1019
+
1020
+
1028
1021
  var elemNodeName = elem.nodeName.toLowerCase();
1029
- var attrs = $.extend(
1030
- {},
1031
- options.attrs,
1032
- {
1033
- name: elemId,
1034
- id: elemId
1035
- },
1036
- $(elem).data('attrs')
1037
- );
1022
+
1038
1023
  var setDimension = function(){
1039
1024
  if(data.isActive == 'third'){
1040
1025
  setElementDimension(data, $.prop(elem, 'controls'));
1041
1026
  }
1042
1027
  };
1043
-
1044
- var box;
1045
-
1028
+
1029
+ if(isStream && !streamRequest){
1030
+ webshim.usermedia.attach(elem, canPlaySrc, data);
1031
+ return;
1032
+ }
1033
+
1046
1034
  if(data && data.swfCreated){
1047
1035
  mediaelement.setActive(elem, 'third', data);
1048
-
1036
+
1049
1037
  data.currentSrc = '';
1050
-
1038
+
1051
1039
  data.shadowElem.html('<div id="'+ elemId +'">');
1052
-
1040
+
1053
1041
  data.api = false;
1054
1042
  data.actionQueue = [];
1055
1043
  box = data.shadowElem;
@@ -1078,7 +1066,7 @@
1078
1066
  value: elem
1079
1067
  },
1080
1068
  currentSrc: {
1081
- value: canPlaySrc.srcProp
1069
+ value: streamRequest ? '' : canPlaySrc.srcProp
1082
1070
  },
1083
1071
  swfCreated: {
1084
1072
  value: true
@@ -1106,26 +1094,27 @@
1106
1094
  }
1107
1095
  }
1108
1096
  }));
1109
-
1110
-
1111
-
1097
+
1098
+
1099
+
1112
1100
  box.insertBefore(elem);
1113
-
1101
+
1114
1102
  if(hasNative){
1115
1103
  $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted'), paused: $.prop(elem, 'paused')});
1116
1104
  }
1117
-
1105
+
1118
1106
  webshims.addShadowDom(elem, box);
1119
1107
  if(!webshims.data(elem, 'mediaelement')){
1120
1108
  webshims.data(elem, 'mediaelement', data);
1121
1109
  }
1122
1110
  addMediaToStopEvents(elem);
1123
-
1111
+
1124
1112
  mediaelement.setActive(elem, 'third', data);
1125
-
1113
+
1126
1114
  setElementDimension(data, hasControls);
1127
-
1115
+
1128
1116
  $(elem)
1117
+
1129
1118
  .on({
1130
1119
  'updatemediaelementdimensions loadedmetadata emptied': setDimension,
1131
1120
  'remove': function(e){
@@ -1139,14 +1128,13 @@
1139
1128
  .onWSOff('updateshadowdom', setDimension)
1140
1129
  ;
1141
1130
  }
1142
-
1131
+
1143
1132
  if(mediaelement.jarisEvent[data.id] && mediaelement.jarisEvent[data.id].elem != elem){
1144
1133
  webshims.error('something went wrong');
1145
1134
  return;
1146
1135
  } else if(!mediaelement.jarisEvent[data.id]){
1147
-
1136
+
1148
1137
  mediaelement.jarisEvent[data.id] = function(jaris){
1149
-
1150
1138
  if(jaris.type == 'ready'){
1151
1139
  var onReady = function(){
1152
1140
  if(data.api){
@@ -1171,11 +1159,11 @@
1171
1159
  if(!data._calledMeta && isNaN(jaris.duration) && data.duration != jaris.duration && isNaN(data.duration)){
1172
1160
  onEvent.onDataInitialized(jaris, data);
1173
1161
  }
1174
-
1162
+
1175
1163
  if(!data._ppFlag && jaris.type != 'onPlayPause'){
1176
1164
  onEvent.onPlayPause(jaris, data);
1177
1165
  }
1178
-
1166
+
1179
1167
  if(onEvent[jaris.type]){
1180
1168
  onEvent[jaris.type](jaris, data);
1181
1169
  }
@@ -1185,29 +1173,68 @@
1185
1173
  };
1186
1174
  mediaelement.jarisEvent[data.id].elem = elem;
1187
1175
  }
1188
-
1189
- $.extend(vars,
1176
+
1177
+ createSwf(elem, canPlaySrc, data, elemId, hasControls, elemNodeName);
1178
+
1179
+ if(!streamRequest){
1180
+ trigger(data._elem, 'loadstart');
1181
+ }
1182
+ };
1183
+
1184
+ var createSwf = function(elem, canPlaySrc, data, elemId, hasControls, elemNodeName){
1185
+ var vars, elemVars, params, attrs;
1186
+ var isRtmp = canPlaySrc.type == 'audio/rtmp' || canPlaySrc.type == 'video/rtmp';
1187
+ var isUserStream = canPlaySrc.type == 'jarisplayer/stream';
1188
+
1189
+ vars = $.extend({}, options.vars, {
1190
+ poster: replaceVar($.attr(elem, 'poster') && $.prop(elem, 'poster') || ''),
1191
+ source: replaceVar(canPlaySrc.streamId || canPlaySrc.srcProp),
1192
+ server: replaceVar(canPlaySrc.server || '')
1193
+ });
1194
+
1195
+ elemVars = $(elem).data('vars') || {};
1196
+
1197
+ $.extend(vars,
1190
1198
  {
1191
1199
  id: elemId,
1192
1200
  evtId: data.id,
1193
- controls: ''+hasControls,
1201
+ controls: ''+(!isUserStream && hasControls),
1194
1202
  autostart: 'false',
1195
1203
  nodename: elemNodeName
1196
1204
  },
1197
1205
  elemVars
1198
1206
  );
1199
-
1207
+
1200
1208
  if(isRtmp){
1201
1209
  vars.streamtype = 'rtmp';
1210
+ } else if(isUserStream){
1211
+ vars.streamtype = 'usermedia';
1202
1212
  } else if(canPlaySrc.type == 'audio/mpeg' || canPlaySrc.type == 'audio/mp3'){
1203
1213
  vars.type = 'audio';
1204
1214
  vars.streamtype = 'file';
1205
1215
  } else if(canPlaySrc.type == 'video/youtube'){
1206
1216
  vars.streamtype = 'youtube';
1207
1217
  }
1218
+
1219
+ attrs = $.extend(
1220
+ {},
1221
+ options.attrs,
1222
+ {
1223
+ name: elemId,
1224
+ id: elemId
1225
+ },
1226
+ $(elem).data('attrs')
1227
+ );
1228
+
1229
+ params = $.extend(
1230
+ {},
1231
+ options.params,
1232
+ $(elem).data('params')
1233
+ );
1234
+
1208
1235
  options.changeSWF(vars, elem, canPlaySrc, data, 'embed');
1209
1236
  clearTimeout(data.flashBlock);
1210
-
1237
+
1211
1238
  swfmini.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.115", false, vars, params, attrs, function(swfData){
1212
1239
  if(swfData.success){
1213
1240
  var fBlocker = function(){
@@ -1219,13 +1246,13 @@
1219
1246
  $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
1220
1247
  };
1221
1248
  data.api = swfData.ref;
1222
-
1249
+
1223
1250
  if(!hasControls){
1224
1251
  $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
1225
1252
  }
1226
-
1253
+
1227
1254
  data.flashBlock = setTimeout(fBlocker, 99);
1228
-
1255
+
1229
1256
  if(!localConnectionTimer){
1230
1257
  clearTimeout(localConnectionTimer);
1231
1258
  localConnectionTimer = setTimeout(function(){
@@ -1239,23 +1266,24 @@
1239
1266
  flash = null;
1240
1267
  }, 8000);
1241
1268
  }
1269
+ if(isUserStream){
1270
+ webshim.usermedia.request(elem, canPlaySrc, data);
1271
+ }
1242
1272
  }
1243
1273
  });
1244
-
1245
- trigger(data._elem, 'loadstart');
1246
1274
  };
1247
-
1248
-
1275
+
1276
+
1249
1277
  var queueSwfMethod = function(elem, fn, args, data){
1250
1278
  data = data || getSwfDataFromElem(elem);
1251
-
1279
+
1252
1280
  if(data){
1253
1281
  if(data.api && data.api[fn]){
1254
1282
  data.api[fn].apply(data.api, args || []);
1255
1283
  } else {
1256
1284
  //todo add to queue
1257
1285
  data.actionQueue.push({fn: fn, args: args});
1258
-
1286
+
1259
1287
  if(data.actionQueue.length > 10){
1260
1288
  setTimeout(function(){
1261
1289
  if(data.actionQueue.length > 5){
@@ -1268,13 +1296,14 @@
1268
1296
  }
1269
1297
  return false;
1270
1298
  };
1271
-
1299
+ mediaelement.queueSwfMethod = queueSwfMethod;
1300
+
1272
1301
  ['audio', 'video'].forEach(function(nodeName){
1273
1302
  var descs = {};
1274
1303
  var mediaSup;
1275
1304
  var createGetProp = function(key){
1276
1305
  if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
1277
-
1306
+
1278
1307
  descs[key] = {
1279
1308
  get: function(){
1280
1309
  var data = getSwfDataFromElem(this);
@@ -1294,33 +1323,33 @@
1294
1323
  delete descs[key].writeable;
1295
1324
  descs[key].set = setFn;
1296
1325
  };
1297
-
1326
+
1298
1327
  createGetSetProp('seeking');
1299
-
1328
+
1300
1329
  createGetSetProp('volume', function(v){
1301
1330
  var data = getSwfDataFromElem(this);
1302
1331
  if(data){
1303
1332
  v *= 1;
1304
1333
  if(!isNaN(v)){
1305
-
1334
+
1306
1335
  if(v < 0 || v > 1){
1307
1336
  webshims.error('volume greater or less than allowed '+ (v / 100));
1308
1337
  }
1309
-
1338
+
1310
1339
  queueSwfMethod(this, 'api_volume', [v], data);
1311
-
1312
-
1340
+
1341
+
1313
1342
  if(data.volume != v){
1314
1343
  data.volume = v;
1315
1344
  trigger(data._elem, 'volumechange');
1316
1345
  }
1317
1346
  data = null;
1318
- }
1347
+ }
1319
1348
  } else if(mediaSup.volume.prop._supset) {
1320
1349
  return mediaSup.volume.prop._supset.apply(this, arguments);
1321
1350
  }
1322
1351
  });
1323
-
1352
+
1324
1353
  createGetSetProp('muted', function(m){
1325
1354
  var data = getSwfDataFromElem(this);
1326
1355
  if(data){
@@ -1335,8 +1364,8 @@
1335
1364
  return mediaSup.muted.prop._supset.apply(this, arguments);
1336
1365
  }
1337
1366
  });
1338
-
1339
-
1367
+
1368
+
1340
1369
  createGetSetProp('currentTime', function(t){
1341
1370
  var data = getSwfDataFromElem(this);
1342
1371
  if(data){
@@ -1344,23 +1373,23 @@
1344
1373
  if (!isNaN(t)) {
1345
1374
  queueSwfMethod(this, 'api_seek', [t], data);
1346
1375
  }
1347
-
1376
+
1348
1377
  } else if(mediaSup.currentTime.prop._supset) {
1349
1378
  return mediaSup.currentTime.prop._supset.apply(this, arguments);
1350
1379
  }
1351
1380
  });
1352
-
1381
+
1353
1382
  ['play', 'pause'].forEach(function(fn){
1354
1383
  descs[fn] = {
1355
1384
  value: function(){
1356
1385
  var data = getSwfDataFromElem(this);
1357
-
1386
+
1358
1387
  if(data){
1359
1388
  if(data.stopPlayPause){
1360
1389
  clearTimeout(data.stopPlayPause);
1361
1390
  }
1362
1391
  queueSwfMethod(this, fn == 'play' ? 'api_play' : 'api_pause', [], data);
1363
-
1392
+
1364
1393
  data._ppFlag = true;
1365
1394
  if(data.paused != (fn != 'play')){
1366
1395
  data.paused = fn != 'play';
@@ -1372,14 +1401,14 @@
1372
1401
  }
1373
1402
  };
1374
1403
  });
1375
-
1404
+
1376
1405
  getPropKeys.forEach(createGetProp);
1377
-
1406
+
1378
1407
  webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
1379
1408
  var data = getSwfDataFromElem(this);
1380
-
1409
+
1381
1410
  $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
1382
-
1411
+
1383
1412
  if(data){
1384
1413
  if(nodeName == 'audio'){
1385
1414
  setElementDimension(data, boolProp);
@@ -1387,12 +1416,12 @@
1387
1416
  queueSwfMethod(this, 'api_controls', [boolProp], data);
1388
1417
  }
1389
1418
  });
1390
-
1391
-
1419
+
1420
+
1392
1421
  webshims.onNodeNamesPropertyModify(nodeName, 'preload', function(val){
1393
1422
  var data, baseData, elem;
1394
-
1395
-
1423
+
1424
+
1396
1425
  if(bufferSrc(this)){
1397
1426
  data = getSwfDataFromElem(this);
1398
1427
  if(data){
@@ -1407,9 +1436,9 @@
1407
1436
  }
1408
1437
  }
1409
1438
  });
1410
-
1439
+
1411
1440
  mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
1412
-
1441
+
1413
1442
  if(!support.mediaDefaultMuted){
1414
1443
  webshims.defineNodeNameProperties(nodeName, {
1415
1444
  defaultMuted: {
@@ -1427,8 +1456,68 @@
1427
1456
  }, 'prop');
1428
1457
  }
1429
1458
  });
1430
-
1431
-
1459
+
1460
+ var addCanvasBridge = function(){
1461
+ if(!window.CanvasRenderingContext2D){
1462
+ return false;
1463
+ }
1464
+ var _drawImage = CanvasRenderingContext2D.prototype.drawImage;
1465
+ var slice = Array.prototype.slice;
1466
+ var isVideo = {
1467
+ video: 1,
1468
+ VIDEO: 1
1469
+ };
1470
+ var tested = {};
1471
+
1472
+ if(!_drawImage){
1473
+ webshim.error('canvas.drawImage feature is needed. In IE8 flashvanvas pro can be used');
1474
+ }
1475
+
1476
+ CanvasRenderingContext2D.prototype.drawImage = function(elem){
1477
+ var data, img, args, imgData;
1478
+ var context = this;
1479
+
1480
+ if(isVideo[elem.nodeName] && (data = webshims.data(elem, 'mediaelement')) && data.isActive == 'third' && data.api.api_image){
1481
+
1482
+ try {
1483
+ imgData = data.api.api_image();
1484
+ } catch (er){
1485
+ webshims.error(er);
1486
+ }
1487
+ if(!tested[data.currentSrc]){
1488
+ tested[data.currentSrc] = true;
1489
+ if(imgData == null){
1490
+ webshims.error('video has to be same origin or a crossdomain.xml has to be provided. Video has to be visible for flash API');
1491
+ }
1492
+ }
1493
+
1494
+ args = slice.call(arguments, 1);
1495
+ img = new Image();
1496
+
1497
+ //todo find a performant sync way
1498
+ img.onload = function(){
1499
+ args.unshift(this);
1500
+ _drawImage.apply(context, args);
1501
+ img.onload = null;
1502
+ };
1503
+
1504
+ img.src = 'data:image/jpeg;base64,'+imgData;
1505
+
1506
+ if(img.complete){
1507
+ img.onload();
1508
+ }
1509
+ return;
1510
+ }
1511
+ return _drawImage.apply(this, arguments);
1512
+ };
1513
+ return true;
1514
+ };
1515
+
1516
+ if(!addCanvasBridge()){
1517
+ webshims.ready('canvas', addCanvasBridge);
1518
+ }
1519
+
1520
+
1432
1521
  if(hasFlash && $.cleanData){
1433
1522
  var oldClean = $.cleanData;
1434
1523
  var objElem = document.createElement('object');
@@ -1442,12 +1531,12 @@
1442
1531
  object: 1,
1443
1532
  OBJECT: 1
1444
1533
  };
1445
-
1534
+
1446
1535
  $.cleanData = function(elems){
1447
1536
  var i, len, prop;
1448
1537
  var ret = oldClean.apply(this, arguments);
1449
1538
  if(elems && (len = elems.length) && loadedSwf){
1450
-
1539
+
1451
1540
  for(i = 0; i < len; i++){
1452
1541
  if(flashNames[elems[i].nodeName] && 'api_destroy' in elems[i]){
1453
1542
  loadedSwf--;
@@ -1463,14 +1552,14 @@
1463
1552
  } catch(er){console.log(er);}
1464
1553
  }
1465
1554
  }
1466
-
1555
+
1467
1556
  }
1468
1557
  return ret;
1469
1558
  };
1470
1559
  }
1471
1560
 
1472
1561
  if(!hasNative){
1473
-
1562
+
1474
1563
  ['poster', 'src'].forEach(function(prop){
1475
1564
  webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
1476
1565
  //attr: {},
@@ -1478,21 +1567,21 @@
1478
1567
  propType: 'src'
1479
1568
  });
1480
1569
  });
1481
-
1570
+
1482
1571
  webshims.defineNodeNamesProperty(['audio', 'video'], 'preload', {
1483
1572
  reflect: true,
1484
1573
  propType: 'enumarated',
1485
1574
  defaultValue: '',
1486
1575
  limitedTo: ['', 'auto', 'metadata', 'none']
1487
1576
  });
1488
-
1577
+
1489
1578
  webshims.reflectProperties('source', ['type', 'media']);
1490
-
1491
-
1579
+
1580
+
1492
1581
  ['autoplay', 'controls'].forEach(function(name){
1493
1582
  webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
1494
1583
  });
1495
-
1584
+
1496
1585
  webshims.defineNodeNamesProperties(['audio', 'video'], {
1497
1586
  HAVE_CURRENT_DATA: {
1498
1587
  value: 2
@@ -1521,7 +1610,7 @@
1521
1610
  NETWORK_NO_SOURCE: {
1522
1611
  value: 3
1523
1612
  }
1524
-
1613
+
1525
1614
  }, 'prop');
1526
1615
 
1527
1616
 
@@ -1547,7 +1636,7 @@
1547
1636
  var media, error, parent;
1548
1637
  if(
1549
1638
  ($(e.target).is('audio, video') || ((parent = e.target.parentNode) && $('source', parent).last()[0] == e.target)) &&
1550
- (media = $(e.target).closest('audio, video')) && !media.hasClass('nonnative-api-active')
1639
+ (media = $(e.target).closest('audio, video')) && !media.hasClass('nonnative-api-active')
1551
1640
  ){
1552
1641
  error = media.prop('error');
1553
1642
  setTimeout(function(){
@@ -2038,11 +2127,29 @@
2038
2127
  webshims.error('you must provide a language for track in subtitles state');
2039
2128
  }
2040
2129
  obj.__wsmode = obj.mode;
2130
+
2131
+ webshims.defineProperty(obj, '_wsUpdateMode', {
2132
+ value: function(){
2133
+ $(mediaelem).triggerHandler('updatetrackdisplay');
2134
+ },
2135
+ enumerable: false
2136
+ });
2041
2137
  }
2042
2138
 
2043
2139
  return obj;
2044
2140
  };
2045
2141
 
2142
+ if(!$.propHooks.mode){
2143
+ $.propHooks.mode = {
2144
+ set: function(obj, value){
2145
+ obj.mode = value;
2146
+ if(obj._wsUpdateMode && obj._wsUpdateMode.call){
2147
+ obj._wsUpdateMode();
2148
+ }
2149
+ return obj.mode;
2150
+ }
2151
+ };
2152
+ }
2046
2153
 
2047
2154
  /*
2048
2155
  taken from:
@@ -2293,7 +2400,7 @@ modified for webshims
2293
2400
  var name = copyName[copyProp] || copyProp;
2294
2401
  webshims.onNodeNamesPropertyModify('track', copyProp, function(){
2295
2402
  var trackData = webshims.data(this, 'trackData');
2296
- var track = this;
2403
+
2297
2404
  if(trackData){
2298
2405
  if(copyProp == 'kind'){
2299
2406
  refreshTrack(this, trackData);