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.
- checksums.yaml +4 -4
- data/lib/webshims-rails/version.rb +2 -2
- data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +0 -0
- data/vendor/assets/javascripts/webshims/polyfiller.js +3 -8
- data/vendor/assets/javascripts/webshims/shims/FlashCanvas/canvas2png.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.swf +0 -0
- data/vendor/assets/javascripts/webshims/shims/FlashCanvas/proxy.php +0 -0
- data/vendor/assets/javascripts/webshims/shims/FlashCanvas/save.php +0 -0
- data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/canvas2png.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash10canvas.swf +0 -0
- data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash9canvas.swf +0 -0
- data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flashcanvas.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/proxy.php +0 -0
- data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/save.php +0 -0
- data/vendor/assets/javascripts/webshims/shims/color-picker.js +2 -2
- data/vendor/assets/javascripts/webshims/shims/combos/1.js +66 -43
- data/vendor/assets/javascripts/webshims/shims/combos/10.js +66 -31
- data/vendor/assets/javascripts/webshims/shims/combos/11.js +66 -31
- data/vendor/assets/javascripts/webshims/shims/combos/12.js +96 -59
- data/vendor/assets/javascripts/webshims/shims/combos/13.js +96 -59
- data/vendor/assets/javascripts/webshims/shims/combos/14.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/combos/15.js +4 -1
- data/vendor/assets/javascripts/webshims/shims/combos/16.js +70 -44
- data/vendor/assets/javascripts/webshims/shims/combos/17.js +66 -31
- data/vendor/assets/javascripts/webshims/shims/combos/18.js +1241 -1126
- data/vendor/assets/javascripts/webshims/shims/combos/19.js +1272 -1214
- data/vendor/assets/javascripts/webshims/shims/combos/2.js +66 -43
- data/vendor/assets/javascripts/webshims/shims/combos/20.js +1272 -1214
- data/vendor/assets/javascripts/webshims/shims/combos/21.js +61 -92
- data/vendor/assets/javascripts/webshims/shims/combos/22.js +30 -16
- data/vendor/assets/javascripts/webshims/shims/combos/23.js +66 -43
- data/vendor/assets/javascripts/webshims/shims/combos/25.js +41 -85
- data/vendor/assets/javascripts/webshims/shims/combos/26.js +1556 -2316
- data/vendor/assets/javascripts/webshims/shims/combos/27.js +12 -10
- data/vendor/assets/javascripts/webshims/shims/combos/28.js +4 -1
- data/vendor/assets/javascripts/webshims/shims/combos/29.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/combos/3.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/combos/30.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/combos/31.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/combos/32.js +1175 -1095
- data/vendor/assets/javascripts/webshims/shims/combos/33.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/combos/34.js +30 -16
- data/vendor/assets/javascripts/webshims/shims/combos/4.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/combos/5.js +66 -31
- data/vendor/assets/javascripts/webshims/shims/combos/6.js +66 -31
- data/vendor/assets/javascripts/webshims/shims/combos/7.js +66 -43
- data/vendor/assets/javascripts/webshims/shims/combos/8.js +66 -43
- data/vendor/assets/javascripts/webshims/shims/combos/9.js +66 -31
- data/vendor/assets/javascripts/webshims/shims/combos/97.js +63 -28
- data/vendor/assets/javascripts/webshims/shims/combos/98.js +149 -74
- data/vendor/assets/javascripts/webshims/shims/combos/99.js +149 -74
- data/vendor/assets/javascripts/webshims/shims/combos/comboinfo.json +1 -1
- data/vendor/assets/javascripts/webshims/shims/details.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/dom-extend.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/es5.js +1175 -1095
- data/vendor/assets/javascripts/webshims/shims/excanvas.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/filereader.js +10 -9
- data/vendor/assets/javascripts/webshims/shims/form-combat.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/form-core.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/form-datalist.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/form-fixrangechange.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/form-message.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +40 -11
- data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +4 -1
- data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +2 -1
- data/vendor/assets/javascripts/webshims/shims/form-validation.js +80 -47
- data/vendor/assets/javascripts/webshims/shims/form-validators.js +19 -8
- data/vendor/assets/javascripts/webshims/shims/forms-picker.js +21 -1
- data/vendor/assets/javascripts/webshims/shims/geolocation.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ar.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ch-CN.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-cs.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-de.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-el.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-en.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-es.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-fa.js +130 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-fr.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-he.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-hi.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-hu.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-it.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ja.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-lt.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-nl.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pl.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pt-BR.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pt-PT.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pt.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ru.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-sv.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-zh-CN.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-zh-TW.js +130 -0
- data/vendor/assets/javascripts/webshims/shims/jajax.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/jme/_icons.scss +186 -0
- data/vendor/assets/javascripts/webshims/shims/jme/b.js +63 -28
- data/vendor/assets/javascripts/webshims/shims/jme/c.js +86 -46
- data/vendor/assets/javascripts/webshims/shims/jme/controls.css +317 -211
- data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +59 -223
- data/vendor/assets/javascripts/webshims/shims/jme/jme.eot +0 -0
- data/vendor/assets/javascripts/webshims/shims/jme/jme.svg +0 -0
- data/vendor/assets/javascripts/webshims/shims/jme/jme.ttf +0 -0
- data/vendor/assets/javascripts/webshims/shims/jme/jme.woff +0 -0
- data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +66 -14
- data/vendor/assets/javascripts/webshims/shims/jme/p.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/jpicker/ChangeLog.txt +0 -0
- data/vendor/assets/javascripts/webshims/shims/jpicker/ReadMe.txt +0 -0
- data/vendor/assets/javascripts/webshims/shims/jpicker/images/AlphaBar.png +0 -0
- data/vendor/assets/javascripts/webshims/shims/jpicker/images/Bars.png +0 -0
- data/vendor/assets/javascripts/webshims/shims/jpicker/images/Maps.png +0 -0
- data/vendor/assets/javascripts/webshims/shims/jpicker/images/NoColor.png +0 -0
- data/vendor/assets/javascripts/webshims/shims/jpicker/images/bar-opacity.png +0 -0
- data/vendor/assets/javascripts/webshims/shims/jpicker/images/map-opacity.png +0 -0
- data/vendor/assets/javascripts/webshims/shims/jpicker/images/mappoint.gif +0 -0
- data/vendor/assets/javascripts/webshims/shims/jpicker/images/picker.gif +0 -0
- data/vendor/assets/javascripts/webshims/shims/jpicker/images/preview-opacity.png +0 -0
- data/vendor/assets/javascripts/webshims/shims/jpicker/images/rangearrows.gif +0 -0
- data/vendor/assets/javascripts/webshims/shims/jpicker/jpicker.css +55 -48
- data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +66 -43
- data/vendor/assets/javascripts/webshims/shims/mediaelement-debug.js +833 -0
- data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +31 -76
- data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/moxie/flash/Moxie.cdn.swf +0 -0
- data/vendor/assets/javascripts/webshims/shims/moxie/flash/Moxie.min.swf +0 -0
- data/vendor/assets/javascripts/webshims/shims/moxie/js/moxie.js +1542 -2303
- data/vendor/assets/javascripts/webshims/shims/moxie/silverlight/Moxie.cdn.xap +0 -0
- data/vendor/assets/javascripts/webshims/shims/moxie/silverlight/Moxie.min.xap +0 -0
- data/vendor/assets/javascripts/webshims/shims/picture.js +160 -79
- data/vendor/assets/javascripts/webshims/shims/plugins/jquery.ui.position.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/promise.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/range-ui.js +26 -20
- data/vendor/assets/javascripts/webshims/shims/sizzle.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/styles/color-picker.png +0 -0
- data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +444 -326
- data/vendor/assets/javascripts/webshims/shims/styles/forms-picker.css +379 -300
- data/vendor/assets/javascripts/webshims/shims/styles/progress.gif +0 -0
- data/vendor/assets/javascripts/webshims/shims/styles/progress.png +0 -0
- data/vendor/assets/javascripts/webshims/shims/styles/scss/_api-forms-ext.scss +8 -8
- data/vendor/assets/javascripts/webshims/shims/styles/scss/_api-shim.scss +0 -0
- data/vendor/assets/javascripts/webshims/shims/styles/scss/_extends.scss +0 -14
- data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +104 -85
- data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-picker.scss +20 -32
- data/vendor/assets/javascripts/webshims/shims/styles/scss/shim-ext.scss +0 -0
- data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +14 -34
- data/vendor/assets/javascripts/webshims/shims/styles/shim-ext.css +920 -728
- data/vendor/assets/javascripts/webshims/shims/styles/shim.css +471 -391
- data/vendor/assets/javascripts/webshims/shims/styles/widget.eot +0 -0
- data/vendor/assets/javascripts/webshims/shims/styles/widget.svg +0 -0
- data/vendor/assets/javascripts/webshims/shims/styles/widget.ttf +0 -0
- data/vendor/assets/javascripts/webshims/shims/styles/widget.woff +0 -0
- data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
- data/vendor/assets/javascripts/webshims/shims/swfmini-embed.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/swfmini.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/track-ui.js +0 -0
- data/vendor/assets/javascripts/webshims/shims/track.js +30 -16
- metadata +8 -4
- data/vendor/assets/javascripts/webshims/shims/styles/config.rb +0 -12
- 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.$);
|