webshims-rails 1.14.1 → 1.14.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +0 -0
  4. data/vendor/assets/javascripts/webshims/polyfiller.js +3 -8
  5. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/canvas2png.js +0 -0
  6. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.js +0 -0
  7. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.swf +0 -0
  8. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/proxy.php +0 -0
  9. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/save.php +0 -0
  10. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/canvas2png.js +0 -0
  11. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  12. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  13. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flashcanvas.js +0 -0
  14. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/proxy.php +0 -0
  15. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/save.php +0 -0
  16. data/vendor/assets/javascripts/webshims/shims/color-picker.js +2 -2
  17. data/vendor/assets/javascripts/webshims/shims/combos/1.js +66 -43
  18. data/vendor/assets/javascripts/webshims/shims/combos/10.js +66 -31
  19. data/vendor/assets/javascripts/webshims/shims/combos/11.js +66 -31
  20. data/vendor/assets/javascripts/webshims/shims/combos/12.js +96 -59
  21. data/vendor/assets/javascripts/webshims/shims/combos/13.js +96 -59
  22. data/vendor/assets/javascripts/webshims/shims/combos/14.js +0 -0
  23. data/vendor/assets/javascripts/webshims/shims/combos/15.js +4 -1
  24. data/vendor/assets/javascripts/webshims/shims/combos/16.js +70 -44
  25. data/vendor/assets/javascripts/webshims/shims/combos/17.js +66 -31
  26. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1241 -1126
  27. data/vendor/assets/javascripts/webshims/shims/combos/19.js +1272 -1214
  28. data/vendor/assets/javascripts/webshims/shims/combos/2.js +66 -43
  29. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1272 -1214
  30. data/vendor/assets/javascripts/webshims/shims/combos/21.js +61 -92
  31. data/vendor/assets/javascripts/webshims/shims/combos/22.js +30 -16
  32. data/vendor/assets/javascripts/webshims/shims/combos/23.js +66 -43
  33. data/vendor/assets/javascripts/webshims/shims/combos/25.js +41 -85
  34. data/vendor/assets/javascripts/webshims/shims/combos/26.js +1556 -2316
  35. data/vendor/assets/javascripts/webshims/shims/combos/27.js +12 -10
  36. data/vendor/assets/javascripts/webshims/shims/combos/28.js +4 -1
  37. data/vendor/assets/javascripts/webshims/shims/combos/29.js +0 -0
  38. data/vendor/assets/javascripts/webshims/shims/combos/3.js +0 -0
  39. data/vendor/assets/javascripts/webshims/shims/combos/30.js +0 -0
  40. data/vendor/assets/javascripts/webshims/shims/combos/31.js +0 -0
  41. data/vendor/assets/javascripts/webshims/shims/combos/32.js +1175 -1095
  42. data/vendor/assets/javascripts/webshims/shims/combos/33.js +0 -0
  43. data/vendor/assets/javascripts/webshims/shims/combos/34.js +30 -16
  44. data/vendor/assets/javascripts/webshims/shims/combos/4.js +0 -0
  45. data/vendor/assets/javascripts/webshims/shims/combos/5.js +66 -31
  46. data/vendor/assets/javascripts/webshims/shims/combos/6.js +66 -31
  47. data/vendor/assets/javascripts/webshims/shims/combos/7.js +66 -43
  48. data/vendor/assets/javascripts/webshims/shims/combos/8.js +66 -43
  49. data/vendor/assets/javascripts/webshims/shims/combos/9.js +66 -31
  50. data/vendor/assets/javascripts/webshims/shims/combos/97.js +63 -28
  51. data/vendor/assets/javascripts/webshims/shims/combos/98.js +149 -74
  52. data/vendor/assets/javascripts/webshims/shims/combos/99.js +149 -74
  53. data/vendor/assets/javascripts/webshims/shims/combos/comboinfo.json +1 -1
  54. data/vendor/assets/javascripts/webshims/shims/details.js +0 -0
  55. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +0 -0
  56. data/vendor/assets/javascripts/webshims/shims/es5.js +1175 -1095
  57. data/vendor/assets/javascripts/webshims/shims/excanvas.js +0 -0
  58. data/vendor/assets/javascripts/webshims/shims/filereader.js +10 -9
  59. data/vendor/assets/javascripts/webshims/shims/form-combat.js +0 -0
  60. data/vendor/assets/javascripts/webshims/shims/form-core.js +0 -0
  61. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +0 -0
  62. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +0 -0
  63. data/vendor/assets/javascripts/webshims/shims/form-fixrangechange.js +0 -0
  64. data/vendor/assets/javascripts/webshims/shims/form-message.js +0 -0
  65. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +0 -0
  66. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +0 -0
  67. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +40 -11
  68. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +4 -1
  69. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +2 -1
  70. data/vendor/assets/javascripts/webshims/shims/form-validation.js +80 -47
  71. data/vendor/assets/javascripts/webshims/shims/form-validators.js +19 -8
  72. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +21 -1
  73. data/vendor/assets/javascripts/webshims/shims/geolocation.js +0 -0
  74. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ar.js +0 -0
  75. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ch-CN.js +0 -0
  76. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-cs.js +0 -0
  77. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-de.js +0 -0
  78. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-el.js +0 -0
  79. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-en.js +0 -0
  80. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-es.js +0 -0
  81. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-fa.js +130 -0
  82. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-fr.js +0 -0
  83. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-he.js +0 -0
  84. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-hi.js +0 -0
  85. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-hu.js +0 -0
  86. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-it.js +0 -0
  87. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ja.js +0 -0
  88. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-lt.js +0 -0
  89. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-nl.js +0 -0
  90. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pl.js +0 -0
  91. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pt-BR.js +0 -0
  92. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pt-PT.js +0 -0
  93. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pt.js +0 -0
  94. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ru.js +0 -0
  95. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-sv.js +0 -0
  96. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-zh-CN.js +0 -0
  97. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-zh-TW.js +130 -0
  98. data/vendor/assets/javascripts/webshims/shims/jajax.js +0 -0
  99. data/vendor/assets/javascripts/webshims/shims/jme/_icons.scss +186 -0
  100. data/vendor/assets/javascripts/webshims/shims/jme/b.js +63 -28
  101. data/vendor/assets/javascripts/webshims/shims/jme/c.js +86 -46
  102. data/vendor/assets/javascripts/webshims/shims/jme/controls.css +317 -211
  103. data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +59 -223
  104. data/vendor/assets/javascripts/webshims/shims/jme/jme.eot +0 -0
  105. data/vendor/assets/javascripts/webshims/shims/jme/jme.svg +0 -0
  106. data/vendor/assets/javascripts/webshims/shims/jme/jme.ttf +0 -0
  107. data/vendor/assets/javascripts/webshims/shims/jme/jme.woff +0 -0
  108. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +66 -14
  109. data/vendor/assets/javascripts/webshims/shims/jme/p.js +0 -0
  110. data/vendor/assets/javascripts/webshims/shims/jpicker/ChangeLog.txt +0 -0
  111. data/vendor/assets/javascripts/webshims/shims/jpicker/ReadMe.txt +0 -0
  112. data/vendor/assets/javascripts/webshims/shims/jpicker/images/AlphaBar.png +0 -0
  113. data/vendor/assets/javascripts/webshims/shims/jpicker/images/Bars.png +0 -0
  114. data/vendor/assets/javascripts/webshims/shims/jpicker/images/Maps.png +0 -0
  115. data/vendor/assets/javascripts/webshims/shims/jpicker/images/NoColor.png +0 -0
  116. data/vendor/assets/javascripts/webshims/shims/jpicker/images/bar-opacity.png +0 -0
  117. data/vendor/assets/javascripts/webshims/shims/jpicker/images/map-opacity.png +0 -0
  118. data/vendor/assets/javascripts/webshims/shims/jpicker/images/mappoint.gif +0 -0
  119. data/vendor/assets/javascripts/webshims/shims/jpicker/images/picker.gif +0 -0
  120. data/vendor/assets/javascripts/webshims/shims/jpicker/images/preview-opacity.png +0 -0
  121. data/vendor/assets/javascripts/webshims/shims/jpicker/images/rangearrows.gif +0 -0
  122. data/vendor/assets/javascripts/webshims/shims/jpicker/jpicker.css +55 -48
  123. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +66 -43
  124. data/vendor/assets/javascripts/webshims/shims/mediaelement-debug.js +833 -0
  125. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +31 -76
  126. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +0 -0
  127. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +0 -0
  128. data/vendor/assets/javascripts/webshims/shims/moxie/flash/Moxie.cdn.swf +0 -0
  129. data/vendor/assets/javascripts/webshims/shims/moxie/flash/Moxie.min.swf +0 -0
  130. data/vendor/assets/javascripts/webshims/shims/moxie/js/moxie.js +1542 -2303
  131. data/vendor/assets/javascripts/webshims/shims/moxie/silverlight/Moxie.cdn.xap +0 -0
  132. data/vendor/assets/javascripts/webshims/shims/moxie/silverlight/Moxie.min.xap +0 -0
  133. data/vendor/assets/javascripts/webshims/shims/picture.js +160 -79
  134. data/vendor/assets/javascripts/webshims/shims/plugins/jquery.ui.position.js +0 -0
  135. data/vendor/assets/javascripts/webshims/shims/promise.js +0 -0
  136. data/vendor/assets/javascripts/webshims/shims/range-ui.js +26 -20
  137. data/vendor/assets/javascripts/webshims/shims/sizzle.js +0 -0
  138. data/vendor/assets/javascripts/webshims/shims/styles/color-picker.png +0 -0
  139. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +444 -326
  140. data/vendor/assets/javascripts/webshims/shims/styles/forms-picker.css +379 -300
  141. data/vendor/assets/javascripts/webshims/shims/styles/progress.gif +0 -0
  142. data/vendor/assets/javascripts/webshims/shims/styles/progress.png +0 -0
  143. data/vendor/assets/javascripts/webshims/shims/styles/scss/_api-forms-ext.scss +8 -8
  144. data/vendor/assets/javascripts/webshims/shims/styles/scss/_api-shim.scss +0 -0
  145. data/vendor/assets/javascripts/webshims/shims/styles/scss/_extends.scss +0 -14
  146. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +104 -85
  147. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-picker.scss +20 -32
  148. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim-ext.scss +0 -0
  149. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +14 -34
  150. data/vendor/assets/javascripts/webshims/shims/styles/shim-ext.css +920 -728
  151. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +471 -391
  152. data/vendor/assets/javascripts/webshims/shims/styles/widget.eot +0 -0
  153. data/vendor/assets/javascripts/webshims/shims/styles/widget.svg +0 -0
  154. data/vendor/assets/javascripts/webshims/shims/styles/widget.ttf +0 -0
  155. data/vendor/assets/javascripts/webshims/shims/styles/widget.woff +0 -0
  156. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  157. data/vendor/assets/javascripts/webshims/shims/swfmini-embed.js +0 -0
  158. data/vendor/assets/javascripts/webshims/shims/swfmini.js +0 -0
  159. data/vendor/assets/javascripts/webshims/shims/track-ui.js +0 -0
  160. data/vendor/assets/javascripts/webshims/shims/track.js +30 -16
  161. metadata +8 -4
  162. data/vendor/assets/javascripts/webshims/shims/styles/config.rb +0 -12
  163. data/vendor/assets/javascripts/webshims/shims/swf/filereader.swf +0 -0
@@ -0,0 +1,833 @@
1
+ (function(webshim, $){
2
+ "use strict";
3
+ if(!window.console){return;}
4
+ var mediaelement = webshim.mediaelement;
5
+ var hasFlash = swfmini.hasFlashPlayerVersion('10.0.3');
6
+ var hasNative = Modernizr.video;
7
+ var url = location.protocol+'//'+location.hostname;
8
+ var tests = {
9
+ urlInValid: {
10
+ level: 1,
11
+ test: (function(){
12
+ var reg = /^[a-z0-9\,\.\:\/\-_\;\?#\+\*\!\(\)\$\;\&\=\+]+$/i;
13
+ return function(src){
14
+ return (src.src && !reg.test(src.src));
15
+ };
16
+ })(),
17
+ srcTest: {poster: 1, srces: 1},
18
+ message: "URL has invalid characters. Remove any special characters and mutated vowels."
19
+ },
20
+ noHeaderTest: {
21
+ level: 5,
22
+ test: function(src){
23
+ return src.computedContainer != 'video/youtube' && !src.ajax && !src.httpError;
24
+ },
25
+ srcTest: {srces: 1},
26
+ message: "Could not run HTTP network tests (cross-domain) for all sources. Check manually."
27
+ },
28
+ hasNoTypeAttribute: {
29
+ level: 4,
30
+ test: function(src){
31
+ return !src.declaredType && !src.typeNotRequired;
32
+ },
33
+ srcTest: {srces: 1},
34
+ message: "The source element has no type attribute specified. Browser needs to download file before testing compatibility. Add a proper type attribute."
35
+ },
36
+ couldNotComputeTypeDeclaredTypeAbsent: {
37
+ level: 1,
38
+ test: function(src){
39
+ return (!src.computedContainer && !src.declaredType);
40
+ },
41
+ srcTest: {srces: 1},
42
+ message: "The source element has no type attribute specified and the extensions seems unknown. Add a proper type attribute."
43
+ },
44
+ httpError: {
45
+ level: 2.5,
46
+ test: function(src){
47
+
48
+ if(!src.ajax || src.decode.swf.success || src.decode.native.success){
49
+ return 'not testable';
50
+ } else {
51
+ return !!(src.httpError && !src.httpErrorText);
52
+ }
53
+ },
54
+ srcTest: {srces: 1},
55
+ message: "There was an unknown http error. Check source/URL."
56
+ },
57
+ fileEncoding: {
58
+ test: function(){
59
+ return 'This test does not test file encoding, framerate compatibility, moov index, encoding profiles. So there is room to fail!';
60
+ },
61
+ srcTest: {srces: 1}
62
+ },
63
+
64
+ explicitHttpError: {
65
+ level: 1,
66
+ test: function(src){
67
+ if(!src.ajax || src.decode.swf.success || src.decode.native.success){
68
+ return 'not testable';
69
+ } else {
70
+ return !!(src.httpErrorText);
71
+ }
72
+ },
73
+ srcTest: {srces: 1},
74
+ message: "There was a http error. Check source/URL."
75
+ },
76
+ charsetInContentType: {
77
+ level: 2.5,
78
+ test: function(src){
79
+ if(!src.ajax || src.httpError){
80
+ return 'not testable';
81
+ } else {
82
+ return src.headerType && (/charset=/i).test(src.headerType);
83
+ }
84
+ },
85
+ srcTest: {srces: 1},
86
+ message: "Content-Type header of media file sends charset. Remove charset information."
87
+ },
88
+ explicitTypeMix: {
89
+ level: 3,
90
+ test: function(src){
91
+ if(src.declaredContainer && src.headerType){
92
+ return src.headerType != src.declaredType;
93
+ } else {
94
+ return 'not testable';
95
+ }
96
+ },
97
+ srcTest: {srces: 1},
98
+ message: "Content-Type header and attribute type do not match. Set same and proper type value."
99
+ },
100
+ noContentType: {
101
+ level: 2.5,
102
+ test: function(src){
103
+ if(src.ajax && !src.httpError){
104
+ return !(src.headerType);
105
+ } else {
106
+ return 'not testable';
107
+ }
108
+ },
109
+ srcTest: {srces: 1},
110
+ message: "Content-Type header for media file is either empty or application/octet-stream."
111
+ },
112
+ noContentLength: {
113
+ level: 3,
114
+ test: function(src){
115
+ if(src.ajax && !src.httpError){
116
+ return !(src.headers['Content-Length']);
117
+ } else {
118
+ return 'not testable';
119
+ }
120
+ },
121
+ srcTest: {srces: 1},
122
+ message: "Content-Length header for media file does not send value."
123
+ },
124
+ noRange: {
125
+ level: 3,
126
+ test: function(src){
127
+ if(src.ajax && !src.httpError){
128
+ return !(src.headers['Accept-Ranges']);
129
+ } else {
130
+ return 'not testable';
131
+ }
132
+ },
133
+ srcTest: {srces: 1},
134
+ message: "Accept-Ranges header for media file does not send value. Make sure server supports Range requests in bytes"
135
+ },
136
+ explicitNoRange: {
137
+ level: 2.5,
138
+ test: function(src){
139
+ if(src.ajax && !src.httpError){
140
+ return (src.headers['Accept-Ranges'] == 'none');
141
+ } else {
142
+ return 'not testable';
143
+ }
144
+ },
145
+ srcTest: {srces: 1},
146
+ message: "Server does not support Range requests. Make sure server supports Range requests in bytes"
147
+ },
148
+ doubleEncoded: {
149
+ level: 1,
150
+ test: function(src){
151
+ if(src.ajax && !src.httpError){
152
+ return ((/[defalte|gzip]/i).test(src.headers['Content-Encoding']));
153
+ } else {
154
+ return 'not testable';
155
+ }
156
+ },
157
+ srcTest: {srces: 1},
158
+ message: "Content of media file is encoded with gzip/defalte. Make sure to not encode it. It's already encoded."
159
+ },
160
+ mediaAttachment: {
161
+ level: 1,
162
+ test: function(src){
163
+ if(src.ajax && !src.httpError){
164
+ return (/attach/i.test(src.headers['Content-Disposition']));
165
+ } else {
166
+ return 'not testable';
167
+ }
168
+ },
169
+ srcTest: {srces: 1},
170
+ message: "Content-Disposition header wants media file to be downloaded, but not to be played."
171
+ },
172
+ badTypeMix: {
173
+ level: 1,
174
+ test: function(src, infos){
175
+ var ret = false;
176
+
177
+ var isPlayableHtml, isPlayableHeader;
178
+ var htmlContainer = src.declaredContainer || src.computedContainer;
179
+ var headerContainer = src.headerContainer;
180
+ if(headerContainer && htmlContainer){
181
+ if(headerContainer != htmlContainer){
182
+ isPlayableHtml = mediaelement.swfMimeTypes.indexOf(htmlContainer) != -1;
183
+ isPlayableHeader = mediaelement.swfMimeTypes.indexOf(headerContainer) != -1;
184
+ if(isPlayableHtml != isPlayableHeader){
185
+ ret = true;
186
+ }
187
+
188
+ if(!ret && infos.element.canPlayType){
189
+
190
+ isPlayableHtml = !!infos.element.canPlayType(htmlContainer);
191
+ isPlayableHeader = !!infos.element.canPlayType(headerContainer);
192
+ if(isPlayableHtml != isPlayableHeader){
193
+ ret = true;
194
+ }
195
+ }
196
+ }
197
+ } else {
198
+ ret = 'not testable';
199
+ }
200
+
201
+ return ret;
202
+ },
203
+ srcTest: {srces: 1},
204
+ message: "Content-Type header and attribute type do not match and are quite different. Set same and proper type value."
205
+ },
206
+
207
+ typeMix: {
208
+ level: 2.5,
209
+ test: function(src, infos){
210
+ var ret = false;
211
+
212
+ var isPlayableComputed, isPlayableDeclared;
213
+ if(!src.headerContainer && src.declaredContainer && src.computedContainer && src.computedContainer != src.declaredContainer){
214
+ isPlayableComputed = mediaelement.swfMimeTypes.indexOf(src.computedContainer) != -1;
215
+ isPlayableDeclared = mediaelement.swfMimeTypes.indexOf(src.declaredContainer) != -1;
216
+ if(isPlayableComputed != isPlayableDeclared){
217
+ ret = true;
218
+ }
219
+
220
+ if(!ret && infos.element.canPlayType){
221
+
222
+ isPlayableComputed = !!infos.element.canPlayType(src.computedContainer);
223
+ isPlayableDeclared = !!infos.element.canPlayType(src.declaredContainer);
224
+ if(isPlayableComputed != isPlayableDeclared){
225
+ ret = true;
226
+ }
227
+ }
228
+ }
229
+
230
+ return ret;
231
+ },
232
+ srcTest: {srces: 1},
233
+ message: "Computed type and declared type are different. Needs manual check."
234
+ },
235
+ hasNoPlayableSrc: {
236
+ level: 1,
237
+ test: function(infos){
238
+ var hasPlayable = false;
239
+
240
+ $.each(infos.srces, function(i, src){
241
+ var pluginContainer = src.declaredContainer || src.computedContainer;
242
+ var nativeContainer = src.headerContainer || pluginContainer;
243
+
244
+ if(mediaelement.swfMimeTypes.indexOf(pluginContainer) != -1){
245
+ hasPlayable = true;
246
+ return false;
247
+ }
248
+
249
+ if(infos.element.canPlayType && infos.element.canPlayType(pluginContainer) && infos.element.canPlayType(nativeContainer)){
250
+ hasPlayable = true;
251
+ return false;
252
+ }
253
+ });
254
+
255
+ return !hasPlayable;
256
+ },
257
+ message: "Mediaelement has no source to be played in browser or by plugin. Use at least a video/mp4 source."
258
+ },
259
+ endJump: {
260
+ level: 2.5,
261
+ test: function(src){
262
+ return src.decode.swf.endJump || src.decode.native.endJump;
263
+ },
264
+ srcTest: {srces: 1},
265
+ message: 'src jumped to end too soon. Check negative timestamps: https://bugzilla.mozilla.org/show_bug.cgi?id=868797'
266
+ },
267
+ swfTimeout: {
268
+ level: 3,
269
+ test: function(src){
270
+ return src.decode.swf.timeout;
271
+ },
272
+ srcTest: {srces: 1},
273
+ message: 'Could not run decode tests. Maybe moovposition is on end?'
274
+ },
275
+ moovPosition: {
276
+ level: 2,
277
+ test: function(src){
278
+ if(src.decode.swf.moovposition){
279
+ return src.decode.swf.moovposition > 300;
280
+ }
281
+ return false;
282
+ },
283
+ srcTest: {srces: 1}
284
+ },
285
+ tabletDecode: {
286
+ level: 2,
287
+ test: function(infos){
288
+ var hasSwfSuccess = false;
289
+ var hasPlayableh264 = false;
290
+ if(hasFlash){
291
+ $.each(infos.srces, function(i, src){
292
+ var swfDecode = src.decode.swf;
293
+
294
+ if(('videocodecid' in swfDecode)){
295
+ hasSwfSuccess = true;
296
+ }
297
+ if(swfDecode.videocodecid != 'avc1' || swfDecode.avclevel > 31 || swfDecode.height * swfDecode.width > 921600){
298
+ return;
299
+ }
300
+ hasPlayableh264 = true;
301
+ return false;
302
+ });
303
+ }
304
+
305
+ return (!hasSwfSuccess) ? false : !hasPlayableh264;
306
+ },
307
+ message: 'Not playable on more than 25% of smartphone and more than 15% of tablet devices. In case you want to support 75% of smartphone- and 90% of tablet devices you need to provide a source encoded with H.264, High Profile (HP), Level 3.1, up to 1280 * 720.'
308
+ },
309
+ allTabletDecode: {
310
+ level: 3,
311
+ test: function(infos){
312
+ var hasSwfSuccess = false;
313
+ var hasPlayableh264 = false;
314
+ if(hasFlash){
315
+ $.each(infos.srces, function(i, src){
316
+ var swfDecode = src.decode.swf;
317
+
318
+ if(('videocodecid' in swfDecode)){
319
+ hasSwfSuccess = true;
320
+ }
321
+ if(swfDecode.videocodecid != 'avc1' || swfDecode.avcprofile > 77 || swfDecode.avclevel > 31 || swfDecode.height * swfDecode.width > 921600){
322
+ return;
323
+ }
324
+ hasPlayableh264 = true;
325
+ return false;
326
+ });
327
+ }
328
+
329
+ return (!hasSwfSuccess) ? false : !hasPlayableh264;
330
+ },
331
+ message: 'Not playable on more than 15% of smartphone and more than 5% of tablet devices. In case you want to support 90% of smartphone- and 99% of tablet devices you need to provide a source encoded with H.264, Main Profile (HP), Level 3.1, up to 1280 * 720.'
332
+ },
333
+ smartphoneDecode: {
334
+ level: 3.5,
335
+ test: function(infos){
336
+ var hasSwfSuccess = false;
337
+ var hasPlayableh264 = false;
338
+ if(hasFlash){
339
+
340
+ $.each(infos.srces, function(i, src){
341
+ var swfDecode = src.decode.swf;
342
+
343
+ if(('videocodecid' in swfDecode)){
344
+ hasSwfSuccess = true;
345
+ }
346
+ if(swfDecode.videocodecid != 'avc1' || swfDecode.avcprofile > 77 || swfDecode.avclevel > 30 || swfDecode.height * swfDecode.width > 345600){
347
+ return;
348
+ }
349
+ hasPlayableh264 = true;
350
+ return false;
351
+ });
352
+ }
353
+
354
+ return (!hasSwfSuccess) ? false : !hasPlayableh264;
355
+ },
356
+ message: 'Not playable on more than 10% of smartphones: In case you want to support 90% of smartphone- and 99% of tablet devices you need to provide a source encoded with H.264, Main Profile (HP), Level 3.1, up to 720 * 404 / 640 * 480.'
357
+ },
358
+ notAllSmartphoneDecode: {
359
+ level: 4,
360
+ test: function(infos){
361
+ var hasSwfSuccess = false;
362
+ var hasPlayableh264 = false;
363
+
364
+ if(hasFlash){
365
+ $.each(infos.srces, function(i, src){
366
+ var swfDecode = src.decode.swf;
367
+ if(('videocodecid' in swfDecode)){
368
+ hasSwfSuccess = true;
369
+ }
370
+ if(swfDecode.videocodecid != 'avc1' || swfDecode.avcprofile > 66 || swfDecode.avclevel > 30 || swfDecode.height * swfDecode.width > 307200){
371
+ return;
372
+ }
373
+ hasPlayableh264 = true;
374
+ return false;
375
+ });
376
+ }
377
+
378
+
379
+ return (!hasSwfSuccess) ? false : !hasPlayableh264;
380
+ },
381
+ message: 'Not playable on more than 1% of smartphones: In case you want to support 99% of all devices you need to provide a source encoded with H.264, Baseline Profile (BP), Level 3.0, up to 720 * 404 / 640 * 480. You might want to use multiple sources to satisfy quality and maximum device compatibility.'
382
+ },
383
+ needsFlashInstalled: {
384
+ level: 1,
385
+ test: function(infos){
386
+ var flashCanPlay = false;
387
+ var nativeCanPlay = false;
388
+ if(!hasFlash){
389
+ $.each(infos.srces, function(i, src){
390
+ var pluginContainer = src.declaredContainer || src.computedContainer;
391
+ var nativeContainer = src.headerContainer || pluginContainer;
392
+
393
+ if(mediaelement.swfMimeTypes.indexOf(pluginContainer) != -1){
394
+ flashCanPlay = true;
395
+ }
396
+
397
+ if(infos.element.canPlayType && (pluginContainer == 'video/youtube' || (infos.element.canPlayType(pluginContainer) && infos.element.canPlayType(nativeContainer)))){
398
+ nativeCanPlay = true;
399
+ return false;
400
+ }
401
+ });
402
+ }
403
+
404
+ return flashCanPlay && !nativeCanPlay;
405
+ },
406
+ message: "While media file could be played by flash plugin, Browser has no flash installed. Use at least a video/mp4 source and install flash. Or add additionally a video/webm file."
407
+ },
408
+ hasNoSwfPlayableSrc: {
409
+ level: 1,
410
+ test: function(infos){
411
+ var hasPlayable = false;
412
+
413
+ $.each(infos.srces, function(i, src){
414
+ var pluginContainer = src.declaredContainer || src.computedContainer;
415
+
416
+ if(mediaelement.swfMimeTypes.indexOf(pluginContainer) != -1){
417
+ hasPlayable = true;
418
+ return false;
419
+ }
420
+
421
+ });
422
+
423
+ return !hasPlayable;
424
+ },
425
+ message: "Mediaelement has no source to be played by fallback plugin. Use at least a video/mp4 source."
426
+ },
427
+ hasNoNativePlayableSrc: {
428
+ level: 4,
429
+ test: function(infos){
430
+ var hasPlayable = false;
431
+
432
+ if(infos.element.canPlayType){
433
+ $.each(infos.srces, function(i, src){
434
+ var pluginContainer = src.declaredContainer || src.computedContainer;
435
+ var nativeContainer = src.headerContainer || pluginContainer;
436
+
437
+ if(pluginContainer == 'video/youtube' || (infos.element.canPlayType(pluginContainer) && infos.element.canPlayType(nativeContainer))){
438
+ hasPlayable = true;
439
+ return false;
440
+ }
441
+
442
+ });
443
+ }
444
+
445
+ return !hasPlayable;
446
+ },
447
+ message: "Mediaelement has no source to be played native. Use at least a video/mp4 and a video/webm source."
448
+ },
449
+ misLeadingAttrMode: {
450
+ level: 2,
451
+ test: function(infos){
452
+ return (infos.srces.length > 1 && infos.srces[0].attrMode);
453
+ },
454
+ message: "Mediaelement has a src attribute and some source child elements. Only src attribute is used."
455
+ },
456
+ emptySrc: {
457
+ level: 2,
458
+ test: function(src){
459
+ return src.src && !src.attrSrc;
460
+ },
461
+ srcTest: {poster: 1, srces: 1},
462
+ message: "The src or poster attribute is an empty string, which is not allowed."
463
+ }
464
+ };
465
+
466
+ function runMediaTest(src, container, provider, infos){
467
+ var timeoutTimer, playTimer;
468
+ var promise = $.Deferred();
469
+ var $container = $('#wsmediatestcontainer');
470
+ var $element = $('<div />').css({width: 320, height: 120, float: 'left'});
471
+ var $media = $(document.createElement(infos.nodeName))
472
+ .attr({
473
+ src: src.src,
474
+ 'data-type': container,
475
+ 'controls': 'controls'
476
+ })
477
+ ;
478
+ var resolvePromise = function(){
479
+ $media.pause();
480
+ setTimeout(function(){
481
+ $element.remove();
482
+ if(!$('video, audio', $container).length){
483
+ $container.remove();
484
+ }
485
+ }, 9);
486
+ setTimeout(function(){
487
+ promise.resolve();
488
+ }, 99);
489
+ };
490
+ var runEnded = function(e){
491
+ var duration = $media.prop('duration');
492
+ var currentTime = $media.prop('currentTime');
493
+
494
+ if(duration && duration > 5){
495
+ if(currentTime > 0 && currentTime < 5){
496
+ resolvePromise();
497
+ } else if(e.type == 'ended' || currentTime >= duration -1){
498
+ src.decode[provider].endJump = true;
499
+ resolvePromise();
500
+ }
501
+ } else {
502
+ resolvePromise();
503
+ }
504
+ };
505
+ var resolve = function(e){
506
+ clearTimeout(timeoutTimer);
507
+ if(e){
508
+ if(e.type == 'loadedmetadata'){
509
+
510
+ if(provider == 'swf'){
511
+ try {
512
+ src.decode[provider] = $media.getShadowElement().find('object, embed')[0].api_get('meta');
513
+ } catch(e){}
514
+ }
515
+ if(!src.decode[provider] || $.isEmptyObject(src.decode[provider])){
516
+ src.decode[provider] = {
517
+ duration: $media.prop('duration'),
518
+ height: $media.prop('videoHeight'),
519
+ width: $media.prop('videoWidth')
520
+ };
521
+ }
522
+ src.decode[provider].success = true;
523
+ } else {
524
+ src.decode[provider] = {
525
+ error: $media.prop('error'),
526
+ mediaError: $media.data('mediaerror'),
527
+ success: false
528
+ };
529
+ }
530
+
531
+ } else {
532
+ src.decode[provider] = {
533
+ success: false,
534
+ timeout: true
535
+ };
536
+ }
537
+ setTimeout(function(){
538
+ $media.play();
539
+ }, 9);
540
+ $media.on('ended timeupdate', runEnded);
541
+ clearTimeout(playTimer);
542
+
543
+ setTimeout(resolvePromise, 300);
544
+ };
545
+
546
+ if(!$container.length){
547
+ $container = $('<div id="wsmediatestcontainer" />')
548
+ .css({position: 'fixed', top: 0, left: 0, right: 0, padding: 10, zIndex: 9999999999})
549
+ .prependTo('body')
550
+ ;
551
+ }
552
+
553
+ $media
554
+ .on('mediaerror loadedmetadata', resolve)
555
+ .appendTo($element)
556
+ ;
557
+ $element.appendTo($container);
558
+ timeoutTimer = setTimeout(resolve, 40000);
559
+ playTimer = setTimeout(function(){
560
+ $media.prop('muted', true);
561
+ $media.play();
562
+ }, 200);
563
+ $media.mediaLoad();
564
+ return promise;
565
+ }
566
+
567
+ function runDecodeTest(src, infos){
568
+ var promises = [];
569
+ var type = src.declaredContainer || src.computedContainer || src.headerContainer || '';
570
+ var preferFlash = webshim.cfg.mediaelement.preferFlash;
571
+ if(hasNative && infos.element.canPlayType(type)){
572
+ webshim.cfg.mediaelement.preferFlash = false;
573
+ promises.push(runMediaTest(src, type, 'native', infos));
574
+ } else {
575
+ src.decode.native = {success: false, notsupported: true};
576
+ }
577
+ if(hasFlash && !(/youtube|rtmp/i.test(type)) && mediaelement.swfMimeTypes.indexOf(type) != -1){
578
+ webshim.cfg.mediaelement.preferFlash = true;
579
+ promises.push(runMediaTest(src, type, 'swf', infos));
580
+ } else {
581
+ src.decode.swf = {success: false, notsupported: type != 'video/youtube'};
582
+ }
583
+ webshim.cfg.mediaelement.preferFlash = preferFlash;
584
+ return $.when.apply($, promises);
585
+ }
586
+
587
+ var runningDecodeTests = 0;
588
+ var decodeObj = {};
589
+ function runDeferredeDcodeTest(src, infos){
590
+
591
+ var promise = $.Deferred();
592
+ var onRun = function(){
593
+ if(!runningDecodeTests){
594
+ runningDecodeTests++;
595
+ $(decodeObj).off('finish', onRun);
596
+ runDecodeTest(src, infos).always(function(){
597
+ promise.resolve();
598
+ runningDecodeTests--;
599
+ $(decodeObj).trigger('finish');
600
+ });
601
+ }
602
+
603
+ };
604
+ if(runningDecodeTests){
605
+ $(decodeObj).on('finish', onRun);
606
+ } else {
607
+ onRun();
608
+ }
609
+
610
+ src.decode.promise = promise.promise();
611
+ }
612
+
613
+ function getSrcInfo(elem, infos){
614
+ var ajax;
615
+ var src = {
616
+ src: $.prop(elem, 'src'),
617
+ attrSrc: $.trim($.attr(elem, 'src')),
618
+ declaredType: $.attr(elem, 'type') || $(elem).attr('data-type') || '',
619
+ errors: {},
620
+ decode: {
621
+ native: {},
622
+ swf: {}
623
+ }
624
+ };
625
+ src.declaredContainer = src.declaredType.split(';')[0].trim();
626
+ try {
627
+ src.computedContainer = mediaelement.getTypeForSrc( src.src, infos.nodeName);
628
+ } catch(e){
629
+ src.computedContainer = '';
630
+ }
631
+
632
+ if(!src.src.indexOf(url)){
633
+
634
+ try {
635
+ src.headerType = '';
636
+ src.headers = {};
637
+ ajax = $.ajax({
638
+ url: src.src,
639
+ type: 'head',
640
+
641
+ success: function(){
642
+ src.headerType = ajax.getResponseHeader('Content-Type') || '';
643
+ if((/^\s*application\/octet\-stream\s*$/i).test(src.headerType)){
644
+ src.headerType = '';
645
+ src.errors.octetStream = 'octetStream';
646
+ }
647
+ src.headerContainer = $.trim(src.headerType.split(';')[0]);
648
+ ['Location', 'Content-Type', 'Content-Length', 'Accept-Ranges', 'Content-Disposition', 'Content-Encoding'].forEach(function(name){
649
+ src.headers[name] = ajax.getResponseHeader(name) || '';
650
+ });
651
+
652
+ },
653
+ error: function(xhr, status, statusText){
654
+ src.httpError = status;
655
+ src.httpErrorText = statusText;
656
+ }
657
+ });
658
+ src.ajax = ajax;
659
+ } catch(e){}
660
+ } else {
661
+ src.cors = true;
662
+ }
663
+
664
+ runDeferredeDcodeTest(src, infos);
665
+
666
+ return src;
667
+ }
668
+
669
+ function resolveSrces(infos){
670
+ var src;
671
+ var srces = [];
672
+ var ajaxes = [];
673
+ var $sources = $('source', infos.element);
674
+ var promises = [];
675
+ var mainPromise = $.Deferred();
676
+ var i = 0;
677
+ var resolve = function(){
678
+ i++;
679
+ if(i > 1){
680
+ mainPromise.resolve();
681
+ }
682
+ };
683
+
684
+ if($.prop(infos.element, 'src')){
685
+ src = getSrcInfo(infos.element, infos);
686
+ src.attrMode = true;
687
+ src.typeNotRequired = true;
688
+ srces.push(src);
689
+ }
690
+
691
+ $sources.each(function(i){
692
+ var src = getSrcInfo(this, infos);
693
+ src.typeNotRequired = !!(i && i >= $sources.length - 1);
694
+
695
+ srces.push(src);
696
+
697
+ if(src.ajax){
698
+ ajaxes.push(src.ajax);
699
+ }
700
+ if(src.decode.promise){
701
+ promises.push(src.decode.promise);
702
+ }
703
+ });
704
+
705
+ infos.srces = srces;
706
+ $.when.apply($, promises).always(resolve);
707
+ $.when.apply($, ajaxes).done(resolve).fail(function(){
708
+ setTimeout(resolve, 200);
709
+ });
710
+
711
+ return mainPromise.promise();
712
+ }
713
+
714
+
715
+
716
+ function runTests(infos){
717
+
718
+ $.each(tests, function(name, obj){
719
+ var localMessage;
720
+ var failed = false;
721
+ var message = obj.message || name;
722
+ if(obj.srcTest){
723
+ if(obj.srcTest.poster){
724
+ localMessage = obj.test(infos.poster, infos);
725
+ if(localMessage){
726
+ if(typeof localMessage == 'string'){
727
+ infos.poster.errors[name] = localMessage;
728
+ } else {
729
+ infos.poster.errors[name] = message;
730
+ failed = true;
731
+ }
732
+ }
733
+ }
734
+
735
+ if(obj.srcTest.srces){
736
+ infos.srces.forEach(function(src){
737
+ localMessage = obj.test(src, infos);
738
+ if(localMessage){
739
+ if(typeof localMessage == 'string'){
740
+ src.errors[name] = localMessage;
741
+ } else {
742
+ src.errors[name] = message;
743
+ failed = true;
744
+ }
745
+ }
746
+ });
747
+
748
+ }
749
+ } else {
750
+ failed = obj.test(infos);
751
+ }
752
+
753
+ if(failed){
754
+ infos.errors.push({
755
+ message: message,
756
+ level: obj.level,
757
+ name: name
758
+ });
759
+ }
760
+ });
761
+
762
+ infos.errors.sort(function(a, b){
763
+ return a.level > b.level;
764
+ });
765
+ console.log('---- Media Test Start ----');
766
+ console.log('Testing results for mediaelement network + markup debugger. For detailed information expand the following object:', infos);
767
+ if(infos.errors.length){
768
+ if(infos.errors[0].level < 3){
769
+ console.log('Found '+ infos.errors.length + ' errors/warnings with at least 1 critical issue.');
770
+ } else if(infos.errors[0].level < 4) {
771
+ console.log('Found '+ infos.errors.length + ' errors/warnings.');
772
+ } else {
773
+ console.log('Found '+ infos.errors.length + ' warnings but no critical issue.');
774
+ }
775
+ infos.errors.forEach(function(error){
776
+ var type = 'log';
777
+ if(console.error && console.warn){
778
+ if(error.level < 3){
779
+ type = 'error';
780
+ } else if(error.level < 4){
781
+ type = 'warn';
782
+ }
783
+ }
784
+ console[type](error.message, 'priority level: '+ error.level, error.name);
785
+ });
786
+ } else {
787
+ console.log('Congratulations: No errors found for video.');
788
+ }
789
+ console.log('---- Media Test End ----');
790
+ console.log('----');
791
+ }
792
+
793
+ function getMediaInfo(elem){
794
+ var infos = {
795
+ element: elem,
796
+ nodeName: elem.nodeName.toLowerCase(),
797
+ errors: [],
798
+ poster: {
799
+ src: $.prop(elem, 'poster'),
800
+ attrSrc: $.trim($.attr(elem, 'poster')),
801
+ errors: {}
802
+ },
803
+ mediaError: $.prop(elem, 'error'),
804
+ wsError: $(elem).data('mediaerror')
805
+ };
806
+ var promise = resolveSrces(infos);
807
+ var initTests = function(){
808
+ runTests(infos);
809
+ };
810
+ promise.always(initTests);
811
+ }
812
+
813
+ var timedMediaInfo = function(i){
814
+ var elem = this;
815
+ setTimeout(function(){
816
+ getMediaInfo(elem);
817
+ }, i * 100);
818
+ };
819
+
820
+ console.log('Running mediaelement debugger. Only run these tests in development never in production. set webshim.setOptions("debug", false); to remove. Debugger only tests media on same domain and does not test all file encoding issues. So there is still room to fail!');
821
+
822
+
823
+ if(webshim.cfg.extendNative){
824
+ console.log('mediaelement debugger does not detect all problems with extendNative set to true. Please set webshim.setOptions("extendNative", false);');
825
+ }
826
+ webshim.addReady(function(context, $insertedElement){
827
+ $('video, audio', context)
828
+ .add($insertedElement.filter('video, audio'))
829
+ .each(timedMediaInfo)
830
+ ;
831
+ });
832
+ webshim.mediaelement.getMediaInfo = getMediaInfo;
833
+ })(webshim, webshim.$);