webshims-rails 1.14.5 → 1.14.6

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 (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);