webshims-rails 1.11.1 → 1.11.2
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.
- checksums.yaml +8 -8
- data/lib/webshims-rails/version.rb +2 -2
- data/vendor/assets/javascripts/webshims/polyfiller.js +41 -20
- data/vendor/assets/javascripts/webshims/shims/combos/10.js +212 -42
- data/vendor/assets/javascripts/webshims/shims/combos/11.js +196 -37
- data/vendor/assets/javascripts/webshims/shims/combos/12.js +82 -36
- data/vendor/assets/javascripts/webshims/shims/combos/13.js +82 -36
- data/vendor/assets/javascripts/webshims/shims/combos/14.js +17 -6
- data/vendor/assets/javascripts/webshims/shims/combos/15.js +234 -1247
- data/vendor/assets/javascripts/webshims/shims/combos/16.js +234 -1247
- data/vendor/assets/javascripts/webshims/shims/combos/17.js +202 -45
- data/vendor/assets/javascripts/webshims/shims/combos/18.js +202 -45
- data/vendor/assets/javascripts/webshims/shims/combos/19.js +16 -5
- data/vendor/assets/javascripts/webshims/shims/combos/2.js +51 -11
- data/vendor/assets/javascripts/webshims/shims/combos/20.js +16 -5
- data/vendor/assets/javascripts/webshims/shims/combos/21.js +82 -36
- data/vendor/assets/javascripts/webshims/shims/combos/22.js +82 -36
- data/vendor/assets/javascripts/webshims/shims/combos/24.js +1689 -997
- data/vendor/assets/javascripts/webshims/shims/combos/25.js +16 -5
- data/vendor/assets/javascripts/webshims/shims/combos/26.js +16 -5
- data/vendor/assets/javascripts/webshims/shims/combos/3.js +16 -5
- data/vendor/assets/javascripts/webshims/shims/combos/30.js +51 -11
- data/vendor/assets/javascripts/webshims/shims/combos/31.js +51 -11
- data/vendor/assets/javascripts/webshims/shims/combos/4.js +16 -5
- data/vendor/assets/javascripts/webshims/shims/combos/5.js +202 -45
- data/vendor/assets/javascripts/webshims/shims/combos/6.js +237 -51
- data/vendor/assets/javascripts/webshims/shims/combos/7.js +51 -11
- data/vendor/assets/javascripts/webshims/shims/combos/8.js +16 -5
- data/vendor/assets/javascripts/webshims/shims/combos/9.js +247 -48
- data/vendor/assets/javascripts/webshims/shims/dom-extend.js +17 -5
- data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +21 -3
- data/vendor/assets/javascripts/webshims/shims/form-datalist.js +35 -6
- data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +6 -8
- data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +134 -24
- data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +152 -1205
- data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +1076 -0
- data/vendor/assets/javascripts/webshims/shims/form-validation.js +47 -20
- data/vendor/assets/javascripts/webshims/shims/form-validators.js +2 -2
- data/vendor/assets/javascripts/webshims/shims/forms-picker.js +1 -1
- data/vendor/assets/javascripts/webshims/shims/i18n/{formcfg-de.txt → formcfg-de.js} +3 -0
- data/vendor/assets/javascripts/webshims/shims/i18n/{formcfg-en.txt → formcfg-en.js} +5 -1
- data/vendor/assets/javascripts/webshims/shims/json-storage.js +1 -1
- data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +1 -1
- data/vendor/assets/javascripts/webshims/shims/range-ui.js +62 -13
- data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +610 -0
- data/vendor/assets/javascripts/webshims/shims/styles/scss/_extends.scss +10 -0
- data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +743 -0
- data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +1 -755
- data/vendor/assets/javascripts/webshims/shims/styles/shim.css +0 -606
- data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
- data/vendor/assets/javascripts/webshims/shims/track-ui.js +36 -23
- data/vendor/assets/javascripts/webshims/shims/track.js +82 -36
- metadata +8 -6
- data/vendor/assets/javascripts/webshims/shims/combos/28.js +0 -2196
- data/vendor/assets/javascripts/webshims/shims/combos/29.js +0 -1167
@@ -1,1167 +0,0 @@
|
|
1
|
-
webshims.register('track', function($, webshims, window, document, undefined){
|
2
|
-
"use strict";
|
3
|
-
var mediaelement = webshims.mediaelement;
|
4
|
-
var id = new Date().getTime();
|
5
|
-
var ADDBACK = $.fn.addBack ? 'addBack' : 'andSelf';
|
6
|
-
//descriptions are not really shown, but they are inserted into the dom
|
7
|
-
var showTracks = {subtitles: 1, captions: 1, descriptions: 1};
|
8
|
-
var notImplemented = function(){
|
9
|
-
webshims.error('not implemented yet');
|
10
|
-
};
|
11
|
-
var dummyTrack = $('<track />');
|
12
|
-
var supportTrackMod = Modernizr.ES5 && Modernizr.objectAccessor;
|
13
|
-
var createEventTarget = function(obj){
|
14
|
-
var eventList = {};
|
15
|
-
obj.addEventListener = function(name, fn){
|
16
|
-
if(eventList[name]){
|
17
|
-
webshims.error('always use $.on to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
|
18
|
-
}
|
19
|
-
eventList[name] = fn;
|
20
|
-
|
21
|
-
};
|
22
|
-
obj.removeEventListener = function(name, fn){
|
23
|
-
if(eventList[name] && eventList[name] != fn){
|
24
|
-
webshims.error('always use $.on/$.off to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
|
25
|
-
}
|
26
|
-
if(eventList[name]){
|
27
|
-
delete eventList[name];
|
28
|
-
}
|
29
|
-
};
|
30
|
-
return obj;
|
31
|
-
};
|
32
|
-
|
33
|
-
var cueListProto = {
|
34
|
-
getCueById: function(id){
|
35
|
-
var cue = null;
|
36
|
-
for(var i = 0, len = this.length; i < len; i++){
|
37
|
-
if(this[i].id === id){
|
38
|
-
cue = this[i];
|
39
|
-
break;
|
40
|
-
}
|
41
|
-
}
|
42
|
-
return cue;
|
43
|
-
}
|
44
|
-
};
|
45
|
-
var numericModes = {
|
46
|
-
0: 'disabled',
|
47
|
-
1: 'hidden',
|
48
|
-
2: 'showing'
|
49
|
-
};
|
50
|
-
|
51
|
-
var textTrackProto = {
|
52
|
-
shimActiveCues: null,
|
53
|
-
_shimActiveCues: null,
|
54
|
-
activeCues: null,
|
55
|
-
cues: null,
|
56
|
-
kind: 'subtitles',
|
57
|
-
label: '',
|
58
|
-
language: '',
|
59
|
-
mode: 'disabled',
|
60
|
-
readyState: 0,
|
61
|
-
oncuechange: null,
|
62
|
-
toString: function() {
|
63
|
-
return "[object TextTrack]";
|
64
|
-
},
|
65
|
-
addCue: function(cue){
|
66
|
-
if(!this.cues){
|
67
|
-
this.cues = mediaelement.createCueList();
|
68
|
-
} else {
|
69
|
-
var lastCue = this.cues[this.cues.length-1];
|
70
|
-
if(lastCue && lastCue.startTime > cue.startTime){
|
71
|
-
webshims.error("cue startTime higher than previous cue's startTime");
|
72
|
-
}
|
73
|
-
}
|
74
|
-
if(cue.track && cue.track.removeCue){
|
75
|
-
cue.track.removeCue(cue);
|
76
|
-
}
|
77
|
-
cue.track = this;
|
78
|
-
this.cues.push(cue);
|
79
|
-
},
|
80
|
-
//ToDo: make it more dynamic
|
81
|
-
removeCue: function(cue){
|
82
|
-
var cues = this.cues || [];
|
83
|
-
var i = 0;
|
84
|
-
var len = cues.length;
|
85
|
-
if(cue.track != this){
|
86
|
-
webshims.error("cue not part of track");
|
87
|
-
return;
|
88
|
-
}
|
89
|
-
for(; i < len; i++){
|
90
|
-
if(cues[i] === cue){
|
91
|
-
cues.splice(i, 1);
|
92
|
-
cue.track = null;
|
93
|
-
break;
|
94
|
-
}
|
95
|
-
}
|
96
|
-
if(cue.track){
|
97
|
-
webshims.error("cue not part of track");
|
98
|
-
return;
|
99
|
-
}
|
100
|
-
},
|
101
|
-
DISABLED: 'disabled',
|
102
|
-
OFF: 'disabled',
|
103
|
-
HIDDEN: 'hidden',
|
104
|
-
SHOWING: 'showing',
|
105
|
-
ERROR: 3,
|
106
|
-
LOADED: 2,
|
107
|
-
LOADING: 1,
|
108
|
-
NONE: 0
|
109
|
-
};
|
110
|
-
var copyProps = ['kind', 'label', 'srclang'];
|
111
|
-
var copyName = {srclang: 'language'};
|
112
|
-
|
113
|
-
var owns = Function.prototype.call.bind(Object.prototype.hasOwnProperty);
|
114
|
-
|
115
|
-
var updateMediaTrackList = function(baseData, trackList){
|
116
|
-
var removed = [];
|
117
|
-
var added = [];
|
118
|
-
var newTracks = [];
|
119
|
-
var i, len;
|
120
|
-
if(!baseData){
|
121
|
-
baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
|
122
|
-
}
|
123
|
-
|
124
|
-
if(!trackList){
|
125
|
-
baseData.blockTrackListUpdate = true;
|
126
|
-
trackList = $.prop(this, 'textTracks');
|
127
|
-
baseData.blockTrackListUpdate = false;
|
128
|
-
}
|
129
|
-
|
130
|
-
clearTimeout(baseData.updateTrackListTimer);
|
131
|
-
|
132
|
-
$('track', this).each(function(){
|
133
|
-
var track = $.prop(this, 'track');
|
134
|
-
newTracks.push(track);
|
135
|
-
if(trackList.indexOf(track) == -1){
|
136
|
-
added.push(track);
|
137
|
-
}
|
138
|
-
});
|
139
|
-
|
140
|
-
if(baseData.scriptedTextTracks){
|
141
|
-
for(i = 0, len = baseData.scriptedTextTracks.length; i < len; i++){
|
142
|
-
newTracks.push(baseData.scriptedTextTracks[i]);
|
143
|
-
if(trackList.indexOf(baseData.scriptedTextTracks[i]) == -1){
|
144
|
-
added.push(baseData.scriptedTextTracks[i]);
|
145
|
-
}
|
146
|
-
}
|
147
|
-
}
|
148
|
-
|
149
|
-
for(i = 0, len = trackList.length; i < len; i++){
|
150
|
-
if(newTracks.indexOf(trackList[i]) == -1){
|
151
|
-
removed.push(trackList[i]);
|
152
|
-
}
|
153
|
-
}
|
154
|
-
|
155
|
-
if(removed.length || added.length){
|
156
|
-
trackList.splice(0);
|
157
|
-
|
158
|
-
for(i = 0, len = newTracks.length; i < len; i++){
|
159
|
-
trackList.push(newTracks[i]);
|
160
|
-
}
|
161
|
-
for(i = 0, len = removed.length; i < len; i++){
|
162
|
-
$([trackList]).triggerHandler($.Event({type: 'removetrack', track: removed[i]}));
|
163
|
-
}
|
164
|
-
for(i = 0, len = added.length; i < len; i++){
|
165
|
-
$([trackList]).triggerHandler($.Event({type: 'addtrack', track: added[i]}));
|
166
|
-
}
|
167
|
-
if(baseData.scriptedTextTracks || removed.length){
|
168
|
-
$(this).triggerHandler('updatetrackdisplay');
|
169
|
-
}
|
170
|
-
}
|
171
|
-
};
|
172
|
-
|
173
|
-
var refreshTrack = function(track, trackData){
|
174
|
-
if(!trackData){
|
175
|
-
trackData = webshims.data(track, 'trackData');
|
176
|
-
}
|
177
|
-
if(trackData && !trackData.isTriggering){
|
178
|
-
trackData.isTriggering = true;
|
179
|
-
setTimeout(function(){
|
180
|
-
if(!(trackData.track || {}).readyState){
|
181
|
-
$(track).triggerHandler('checktrackmode');
|
182
|
-
} else {
|
183
|
-
$(track).closest('audio, video').triggerHandler('updatetrackdisplay');
|
184
|
-
}
|
185
|
-
trackData.isTriggering = false;
|
186
|
-
}, 1);
|
187
|
-
}
|
188
|
-
};
|
189
|
-
|
190
|
-
var emptyDiv = $('<div />')[0];
|
191
|
-
window.TextTrackCue = function(startTime, endTime, text){
|
192
|
-
if(arguments.length != 3){
|
193
|
-
webshims.error("wrong arguments.length for TextTrackCue.constructor");
|
194
|
-
}
|
195
|
-
|
196
|
-
this.startTime = startTime;
|
197
|
-
this.endTime = endTime;
|
198
|
-
this.text = text;
|
199
|
-
|
200
|
-
this.id = "";
|
201
|
-
this.pauseOnExit = false;
|
202
|
-
|
203
|
-
createEventTarget(this);
|
204
|
-
};
|
205
|
-
|
206
|
-
window.TextTrackCue.prototype = {
|
207
|
-
|
208
|
-
onenter: null,
|
209
|
-
onexit: null,
|
210
|
-
pauseOnExit: false,
|
211
|
-
getCueAsHTML: function(){
|
212
|
-
var lastText = "";
|
213
|
-
var parsedText = "";
|
214
|
-
var fragment = document.createDocumentFragment();
|
215
|
-
var fn;
|
216
|
-
if(!owns(this, 'getCueAsHTML')){
|
217
|
-
fn = this.getCueAsHTML = function(){
|
218
|
-
var i, len;
|
219
|
-
if(lastText != this.text){
|
220
|
-
lastText = this.text;
|
221
|
-
parsedText = mediaelement.parseCueTextToHTML(lastText);
|
222
|
-
emptyDiv.innerHTML = parsedText;
|
223
|
-
|
224
|
-
for(i = 0, len = emptyDiv.childNodes.length; i < len; i++){
|
225
|
-
fragment.appendChild(emptyDiv.childNodes[i].cloneNode(true));
|
226
|
-
}
|
227
|
-
}
|
228
|
-
return fragment.cloneNode(true);
|
229
|
-
};
|
230
|
-
|
231
|
-
}
|
232
|
-
return fn ? fn.apply(this, arguments) : fragment.cloneNode(true);
|
233
|
-
},
|
234
|
-
track: null,
|
235
|
-
|
236
|
-
|
237
|
-
id: ''
|
238
|
-
//todo-->
|
239
|
-
// ,
|
240
|
-
// snapToLines: true,
|
241
|
-
// line: 'auto',
|
242
|
-
// size: 100,
|
243
|
-
// position: 50,
|
244
|
-
// vertical: '',
|
245
|
-
// align: 'middle'
|
246
|
-
};
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
mediaelement.createCueList = function(){
|
253
|
-
return $.extend([], cueListProto);
|
254
|
-
};
|
255
|
-
|
256
|
-
mediaelement.parseCueTextToHTML = (function(){
|
257
|
-
var tagSplits = /(<\/?[^>]+>)/ig;
|
258
|
-
var allowedTags = /^(?:c|v|ruby|rt|b|i|u)/;
|
259
|
-
var regEnd = /\<\s*\//;
|
260
|
-
var addToTemplate = function(localName, attribute, tag, html){
|
261
|
-
var ret;
|
262
|
-
if(regEnd.test(html)){
|
263
|
-
ret = '</'+ localName +'>';
|
264
|
-
} else {
|
265
|
-
tag.splice(0, 1);
|
266
|
-
ret = '<'+ localName +' '+ attribute +'="'+ (tag.join(' ').replace(/\"/g, '"')) +'">';
|
267
|
-
}
|
268
|
-
return ret;
|
269
|
-
};
|
270
|
-
var replacer = function(html){
|
271
|
-
var tag = html.replace(/[<\/>]+/ig,"").split(/[\s\.]+/);
|
272
|
-
if(tag[0]){
|
273
|
-
tag[0] = tag[0].toLowerCase();
|
274
|
-
if(allowedTags.test(tag[0])){
|
275
|
-
if(tag[0] == 'c'){
|
276
|
-
html = addToTemplate('span', 'class', tag, html);
|
277
|
-
} else if(tag[0] == 'v'){
|
278
|
-
html = addToTemplate('q', 'title', tag, html);
|
279
|
-
}
|
280
|
-
} else {
|
281
|
-
html = "";
|
282
|
-
}
|
283
|
-
}
|
284
|
-
return html;
|
285
|
-
};
|
286
|
-
|
287
|
-
return function(cueText){
|
288
|
-
return cueText.replace(tagSplits, replacer);
|
289
|
-
};
|
290
|
-
})();
|
291
|
-
|
292
|
-
mediaelement.loadTextTrack = function(mediaelem, track, trackData, _default){
|
293
|
-
var loadEvents = 'play playing timeupdate updatetrackdisplay';
|
294
|
-
var obj = trackData.track;
|
295
|
-
var load = function(){
|
296
|
-
var src = $.prop(track, 'src');
|
297
|
-
var error;
|
298
|
-
var ajax;
|
299
|
-
if(obj.mode != 'disabled' && src && $.attr(track, 'src')){
|
300
|
-
$(mediaelem).unbind(loadEvents, load);
|
301
|
-
$(track).unbind('checktrackmode', load);
|
302
|
-
if(!obj.readyState){
|
303
|
-
error = function(){
|
304
|
-
obj.readyState = 3;
|
305
|
-
obj.cues = null;
|
306
|
-
obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = null;
|
307
|
-
$(track).triggerHandler('error');
|
308
|
-
};
|
309
|
-
obj.readyState = 1;
|
310
|
-
try {
|
311
|
-
obj.cues = mediaelement.createCueList();
|
312
|
-
obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = mediaelement.createCueList();
|
313
|
-
ajax = $.ajax({
|
314
|
-
dataType: 'text',
|
315
|
-
url: src,
|
316
|
-
success: function(text){
|
317
|
-
if(ajax.getResponseHeader('content-type') != 'text/vtt'){
|
318
|
-
webshims.error('set the mime-type of your WebVTT files to text/vtt. see: http://dev.w3.org/html5/webvtt/#text/vtt');
|
319
|
-
}
|
320
|
-
mediaelement.parseCaptions(text, obj, function(cues){
|
321
|
-
if(cues && 'length' in cues){
|
322
|
-
obj.readyState = 2;
|
323
|
-
$(track).triggerHandler('load');
|
324
|
-
$(mediaelem).triggerHandler('updatetrackdisplay');
|
325
|
-
} else {
|
326
|
-
error();
|
327
|
-
}
|
328
|
-
});
|
329
|
-
|
330
|
-
},
|
331
|
-
error: error
|
332
|
-
});
|
333
|
-
} catch(er){
|
334
|
-
error();
|
335
|
-
webshims.warn(er);
|
336
|
-
}
|
337
|
-
}
|
338
|
-
}
|
339
|
-
};
|
340
|
-
obj.readyState = 0;
|
341
|
-
obj.shimActiveCues = null;
|
342
|
-
obj._shimActiveCues = null;
|
343
|
-
obj.activeCues = null;
|
344
|
-
obj.cues = null;
|
345
|
-
$(mediaelem).unbind(loadEvents, load);
|
346
|
-
$(track).unbind('checktrackmode', load);
|
347
|
-
$(mediaelem).on(loadEvents, load);
|
348
|
-
$(track).on('checktrackmode', load);
|
349
|
-
if(_default){
|
350
|
-
obj.mode = showTracks[obj.kind] ? 'showing' : 'hidden';
|
351
|
-
load();
|
352
|
-
}
|
353
|
-
};
|
354
|
-
|
355
|
-
mediaelement.createTextTrack = function(mediaelem, track){
|
356
|
-
var obj, trackData;
|
357
|
-
if(track.nodeName){
|
358
|
-
trackData = webshims.data(track, 'trackData');
|
359
|
-
|
360
|
-
if(trackData){
|
361
|
-
refreshTrack(track, trackData);
|
362
|
-
obj = trackData.track;
|
363
|
-
}
|
364
|
-
}
|
365
|
-
|
366
|
-
if(!obj){
|
367
|
-
obj = createEventTarget(webshims.objectCreate(textTrackProto));
|
368
|
-
|
369
|
-
if(!supportTrackMod){
|
370
|
-
copyProps.forEach(function(copyProp){
|
371
|
-
var prop = $.prop(track, copyProp);
|
372
|
-
if(prop){
|
373
|
-
obj[copyName[copyProp] || copyProp] = prop;
|
374
|
-
}
|
375
|
-
});
|
376
|
-
}
|
377
|
-
|
378
|
-
|
379
|
-
if(track.nodeName){
|
380
|
-
|
381
|
-
if(supportTrackMod){
|
382
|
-
copyProps.forEach(function(copyProp){
|
383
|
-
webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
|
384
|
-
get: function(){
|
385
|
-
return $.prop(track, copyProp);
|
386
|
-
}
|
387
|
-
});
|
388
|
-
});
|
389
|
-
}
|
390
|
-
|
391
|
-
trackData = webshims.data(track, 'trackData', {track: obj});
|
392
|
-
mediaelement.loadTextTrack(mediaelem, track, trackData, ($.prop(track, 'default') && $(track).siblings('track[default]')[ADDBACK]()[0] == track));
|
393
|
-
} else {
|
394
|
-
if(supportTrackMod){
|
395
|
-
copyProps.forEach(function(copyProp){
|
396
|
-
webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
|
397
|
-
value: track[copyProp],
|
398
|
-
writeable: false
|
399
|
-
});
|
400
|
-
});
|
401
|
-
}
|
402
|
-
obj.cues = mediaelement.createCueList();
|
403
|
-
obj.activeCues = obj._shimActiveCues = obj.shimActiveCues = mediaelement.createCueList();
|
404
|
-
obj.mode = 'hidden';
|
405
|
-
obj.readyState = 2;
|
406
|
-
}
|
407
|
-
}
|
408
|
-
return obj;
|
409
|
-
};
|
410
|
-
|
411
|
-
|
412
|
-
/*
|
413
|
-
taken from:
|
414
|
-
Captionator 0.5.1 [CaptionCrunch]
|
415
|
-
Christopher Giffard, 2011
|
416
|
-
Share and enjoy
|
417
|
-
|
418
|
-
https://github.com/cgiffard/Captionator
|
419
|
-
|
420
|
-
modified for webshims
|
421
|
-
*/
|
422
|
-
mediaelement.parseCaptionChunk = (function(){
|
423
|
-
// Set up timestamp parsers
|
424
|
-
var WebVTTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s*(.*)/;
|
425
|
-
var GoogleTimestampParser = /^([\d\.]+)\s+\+([\d\.]+)\s*(.*)/;
|
426
|
-
var WebVTTDEFAULTSCueParser = /^(DEFAULTS|DEFAULT)\s+\-\-\>\s+(.*)/g;
|
427
|
-
var WebVTTSTYLECueParser = /^(STYLE|STYLES)\s+\-\-\>\s*\n([\s\S]*)/g;
|
428
|
-
var WebVTTCOMMENTCueParser = /^(COMMENT|COMMENTS)\s+\-\-\>\s+(.*)/g;
|
429
|
-
|
430
|
-
return function(subtitleElement,objectCount){
|
431
|
-
var cueDefaults = [];
|
432
|
-
|
433
|
-
var subtitleParts, timeIn, timeOut, html, timeData, subtitlePartIndex, cueSettings = "", id, specialCueData;
|
434
|
-
var timestampMatch, tmpCue;
|
435
|
-
|
436
|
-
// WebVTT Special Cue Logic
|
437
|
-
if ((specialCueData = WebVTTDEFAULTSCueParser.exec(subtitleElement))) {
|
438
|
-
// cueDefaults = specialCueData.slice(2).join("");
|
439
|
-
// cueDefaults = cueDefaults.split(/\s+/g).filter(function(def) { return def && !!def.length; });
|
440
|
-
return null;
|
441
|
-
} else if ((specialCueData = WebVTTSTYLECueParser.exec(subtitleElement))) {
|
442
|
-
return null;
|
443
|
-
} else if ((specialCueData = WebVTTCOMMENTCueParser.exec(subtitleElement))) {
|
444
|
-
return null; // At this stage, we don't want to do anything with these.
|
445
|
-
}
|
446
|
-
|
447
|
-
subtitleParts = subtitleElement.split(/\n/g);
|
448
|
-
|
449
|
-
// Trim off any blank lines (logically, should only be max. one, but loop to be sure)
|
450
|
-
while (!subtitleParts[0].replace(/\s+/ig,"").length && subtitleParts.length > 0) {
|
451
|
-
subtitleParts.shift();
|
452
|
-
}
|
453
|
-
|
454
|
-
if (subtitleParts[0].match(/^\s*[a-z0-9-\_]+\s*$/ig)) {
|
455
|
-
// The identifier becomes the cue ID (when *we* load the cues from file. Programatically created cues can have an ID of whatever.)
|
456
|
-
id = String(subtitleParts.shift().replace(/\s*/ig,""));
|
457
|
-
}
|
458
|
-
|
459
|
-
for (subtitlePartIndex = 0; subtitlePartIndex < subtitleParts.length; subtitlePartIndex ++) {
|
460
|
-
var timestamp = subtitleParts[subtitlePartIndex];
|
461
|
-
|
462
|
-
if ((timestampMatch = WebVTTTimestampParser.exec(timestamp))) {
|
463
|
-
|
464
|
-
// WebVTT
|
465
|
-
|
466
|
-
timeData = timestampMatch.slice(1);
|
467
|
-
|
468
|
-
timeIn = parseInt((timeData[0]||0) * 60 * 60,10) + // Hours
|
469
|
-
parseInt((timeData[1]||0) * 60,10) + // Minutes
|
470
|
-
parseInt((timeData[2]||0),10) + // Seconds
|
471
|
-
parseFloat("0." + (timeData[3]||0)); // MS
|
472
|
-
|
473
|
-
timeOut = parseInt((timeData[4]||0) * 60 * 60,10) + // Hours
|
474
|
-
parseInt((timeData[5]||0) * 60,10) + // Minutes
|
475
|
-
parseInt((timeData[6]||0),10) + // Seconds
|
476
|
-
parseFloat("0." + (timeData[7]||0)); // MS
|
477
|
-
/*
|
478
|
-
if (timeData[8]) {
|
479
|
-
cueSettings = timeData[8];
|
480
|
-
}
|
481
|
-
*/
|
482
|
-
}
|
483
|
-
|
484
|
-
// We've got the timestamp - return all the other unmatched lines as the raw subtitle data
|
485
|
-
subtitleParts = subtitleParts.slice(0,subtitlePartIndex).concat(subtitleParts.slice(subtitlePartIndex+1));
|
486
|
-
break;
|
487
|
-
}
|
488
|
-
|
489
|
-
if (!timeIn && !timeOut) {
|
490
|
-
// We didn't extract any time information. Assume the cue is invalid!
|
491
|
-
webshims.warn("couldn't extract time information: "+[timeIn, timeOut, subtitleParts.join("\n"), id].join(' ; '));
|
492
|
-
return null;
|
493
|
-
}
|
494
|
-
/*
|
495
|
-
// Consolidate cue settings, convert defaults to object
|
496
|
-
var compositeCueSettings =
|
497
|
-
cueDefaults
|
498
|
-
.reduce(function(previous,current,index,array){
|
499
|
-
previous[current.split(":")[0]] = current.split(":")[1];
|
500
|
-
return previous;
|
501
|
-
},{});
|
502
|
-
|
503
|
-
// Loop through cue settings, replace defaults with cue specific settings if they exist
|
504
|
-
compositeCueSettings =
|
505
|
-
cueSettings
|
506
|
-
.split(/\s+/g)
|
507
|
-
.filter(function(set) { return set && !!set.length; })
|
508
|
-
// Convert array to a key/val object
|
509
|
-
.reduce(function(previous,current,index,array){
|
510
|
-
previous[current.split(":")[0]] = current.split(":")[1];
|
511
|
-
return previous;
|
512
|
-
},compositeCueSettings);
|
513
|
-
|
514
|
-
// Turn back into string like the TextTrackCue constructor expects
|
515
|
-
cueSettings = "";
|
516
|
-
for (var key in compositeCueSettings) {
|
517
|
-
if (compositeCueSettings.hasOwnProperty(key)) {
|
518
|
-
cueSettings += !!cueSettings.length ? " " : "";
|
519
|
-
cueSettings += key + ":" + compositeCueSettings[key];
|
520
|
-
}
|
521
|
-
}
|
522
|
-
*/
|
523
|
-
// The remaining lines are the subtitle payload itself (after removing an ID if present, and the time);
|
524
|
-
html = subtitleParts.join("\n");
|
525
|
-
tmpCue = new TextTrackCue(timeIn, timeOut, html);
|
526
|
-
if(id){
|
527
|
-
tmpCue.id = id;
|
528
|
-
}
|
529
|
-
return tmpCue;
|
530
|
-
};
|
531
|
-
})();
|
532
|
-
|
533
|
-
mediaelement.parseCaptions = function(captionData, track, complete) {
|
534
|
-
var subtitles = mediaelement.createCueList();
|
535
|
-
var cue, lazyProcess, regWevVTT;
|
536
|
-
var startDate;
|
537
|
-
var isWEBVTT;
|
538
|
-
if (captionData) {
|
539
|
-
|
540
|
-
regWevVTT = /^WEBVTT(\s*FILE)?/ig;
|
541
|
-
|
542
|
-
lazyProcess = function(i, len){
|
543
|
-
|
544
|
-
for(; i < len; i++){
|
545
|
-
cue = captionData[i];
|
546
|
-
if(regWevVTT.test(cue)){
|
547
|
-
isWEBVTT = true;
|
548
|
-
} else if(cue.replace(/\s*/ig,"").length){
|
549
|
-
if(!isWEBVTT){
|
550
|
-
webshims.error('please use WebVTT format. This is the standard');
|
551
|
-
complete(null);
|
552
|
-
break;
|
553
|
-
}
|
554
|
-
cue = mediaelement.parseCaptionChunk(cue, i);
|
555
|
-
if(cue){
|
556
|
-
track.addCue(cue);
|
557
|
-
}
|
558
|
-
}
|
559
|
-
if(startDate < (new Date().getTime()) - 30){
|
560
|
-
i++;
|
561
|
-
setTimeout(function(){
|
562
|
-
startDate = new Date().getTime();
|
563
|
-
lazyProcess(i, len);
|
564
|
-
}, 90);
|
565
|
-
|
566
|
-
break;
|
567
|
-
}
|
568
|
-
}
|
569
|
-
if(i >= len){
|
570
|
-
if(!isWEBVTT){
|
571
|
-
webshims.error('please use WebVTT format. This is the standard');
|
572
|
-
}
|
573
|
-
complete(track.cues);
|
574
|
-
}
|
575
|
-
};
|
576
|
-
|
577
|
-
captionData = captionData.replace(/\r\n/g,"\n");
|
578
|
-
|
579
|
-
setTimeout(function(){
|
580
|
-
captionData = captionData.replace(/\r/g,"\n");
|
581
|
-
setTimeout(function(){
|
582
|
-
startDate = new Date().getTime();
|
583
|
-
captionData = captionData.split(/\n\n+/g);
|
584
|
-
lazyProcess(0, captionData.length);
|
585
|
-
}, 9);
|
586
|
-
}, 9);
|
587
|
-
|
588
|
-
} else {
|
589
|
-
webshims.error("Required parameter captionData not supplied.");
|
590
|
-
}
|
591
|
-
};
|
592
|
-
|
593
|
-
|
594
|
-
mediaelement.createTrackList = function(mediaelem, baseData){
|
595
|
-
baseData = baseData || webshims.data(mediaelem, 'mediaelementBase') || webshims.data(mediaelem, 'mediaelementBase', {});
|
596
|
-
if(!baseData.textTracks){
|
597
|
-
baseData.textTracks = [];
|
598
|
-
webshims.defineProperties(baseData.textTracks, {
|
599
|
-
onaddtrack: {value: null},
|
600
|
-
onremovetrack: {value: null}
|
601
|
-
});
|
602
|
-
createEventTarget(baseData.textTracks);
|
603
|
-
}
|
604
|
-
return baseData.textTracks;
|
605
|
-
};
|
606
|
-
|
607
|
-
if(!Modernizr.track){
|
608
|
-
webshims.defineNodeNamesBooleanProperty(['track'], 'default');
|
609
|
-
webshims.reflectProperties(['track'], ['srclang', 'label']);
|
610
|
-
|
611
|
-
webshims.defineNodeNameProperties('track', {
|
612
|
-
src: {
|
613
|
-
//attr: {},
|
614
|
-
reflect: true,
|
615
|
-
propType: 'src'
|
616
|
-
}
|
617
|
-
});
|
618
|
-
}
|
619
|
-
|
620
|
-
webshims.defineNodeNameProperties('track', {
|
621
|
-
kind: {
|
622
|
-
attr: Modernizr.track ? {
|
623
|
-
set: function(value){
|
624
|
-
var trackData = webshims.data(this, 'trackData');
|
625
|
-
this.setAttribute('data-kind', value);
|
626
|
-
if(trackData){
|
627
|
-
trackData.attrKind = value;
|
628
|
-
}
|
629
|
-
},
|
630
|
-
get: function(){
|
631
|
-
var trackData = webshims.data(this, 'trackData');
|
632
|
-
if(trackData && ('attrKind' in trackData)){
|
633
|
-
return trackData.attrKind;
|
634
|
-
}
|
635
|
-
return this.getAttribute('kind');
|
636
|
-
}
|
637
|
-
} : {},
|
638
|
-
reflect: true,
|
639
|
-
propType: 'enumarated',
|
640
|
-
defaultValue: 'subtitles',
|
641
|
-
limitedTo: ['subtitles', 'captions', 'descriptions', 'chapters', 'metadata']
|
642
|
-
}
|
643
|
-
});
|
644
|
-
|
645
|
-
$.each(copyProps, function(i, copyProp){
|
646
|
-
var name = copyName[copyProp] || copyProp;
|
647
|
-
webshims.onNodeNamesPropertyModify('track', copyProp, function(){
|
648
|
-
var trackData = webshims.data(this, 'trackData');
|
649
|
-
var track = this;
|
650
|
-
if(trackData){
|
651
|
-
if(copyProp == 'kind'){
|
652
|
-
refreshTrack(this, trackData);
|
653
|
-
}
|
654
|
-
if(!supportTrackMod){
|
655
|
-
trackData.track[name] = $.prop(this, copyProp);
|
656
|
-
}
|
657
|
-
clearTimeout(trackData.changedTrackPropTimer);
|
658
|
-
trackData.changedTrackPropTimer = setTimeout(function(){
|
659
|
-
$(track).trigger('updatesubtitlestate');
|
660
|
-
}, 1);
|
661
|
-
}
|
662
|
-
});
|
663
|
-
});
|
664
|
-
|
665
|
-
|
666
|
-
webshims.onNodeNamesPropertyModify('track', 'src', function(val){
|
667
|
-
if(val){
|
668
|
-
var data = webshims.data(this, 'trackData');
|
669
|
-
var media;
|
670
|
-
if(data){
|
671
|
-
media = $(this).closest('video, audio');
|
672
|
-
if(media[0]){
|
673
|
-
mediaelement.loadTextTrack(media, this, data);
|
674
|
-
}
|
675
|
-
}
|
676
|
-
}
|
677
|
-
|
678
|
-
});
|
679
|
-
|
680
|
-
//
|
681
|
-
|
682
|
-
webshims.defineNodeNamesProperties(['track'], {
|
683
|
-
ERROR: {
|
684
|
-
value: 3
|
685
|
-
},
|
686
|
-
LOADED: {
|
687
|
-
value: 2
|
688
|
-
},
|
689
|
-
LOADING: {
|
690
|
-
value: 1
|
691
|
-
},
|
692
|
-
NONE: {
|
693
|
-
value: 0
|
694
|
-
},
|
695
|
-
readyState: {
|
696
|
-
get: function(){
|
697
|
-
return ($.prop(this, 'track') || {readyState: 0}).readyState;
|
698
|
-
},
|
699
|
-
writeable: false
|
700
|
-
},
|
701
|
-
track: {
|
702
|
-
get: function(){
|
703
|
-
return mediaelement.createTextTrack($(this).closest('audio, video')[0], this);
|
704
|
-
},
|
705
|
-
writeable: false
|
706
|
-
}
|
707
|
-
}, 'prop');
|
708
|
-
|
709
|
-
webshims.defineNodeNamesProperties(['audio', 'video'], {
|
710
|
-
textTracks: {
|
711
|
-
get: function(){
|
712
|
-
var media = this;
|
713
|
-
var baseData = webshims.data(media, 'mediaelementBase') || webshims.data(media, 'mediaelementBase', {});
|
714
|
-
var tracks = mediaelement.createTrackList(media, baseData);
|
715
|
-
if(!baseData.blockTrackListUpdate){
|
716
|
-
updateMediaTrackList.call(media, baseData, tracks);
|
717
|
-
}
|
718
|
-
return tracks;
|
719
|
-
},
|
720
|
-
writeable: false
|
721
|
-
},
|
722
|
-
addTextTrack: {
|
723
|
-
value: function(kind, label, lang){
|
724
|
-
var textTrack = mediaelement.createTextTrack(this, {
|
725
|
-
kind: dummyTrack.prop('kind', kind || '').prop('kind'),
|
726
|
-
label: label || '',
|
727
|
-
srclang: lang || ''
|
728
|
-
});
|
729
|
-
var baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
|
730
|
-
if (!baseData.scriptedTextTracks) {
|
731
|
-
baseData.scriptedTextTracks = [];
|
732
|
-
}
|
733
|
-
baseData.scriptedTextTracks.push(textTrack);
|
734
|
-
updateMediaTrackList.call(this);
|
735
|
-
return textTrack;
|
736
|
-
}
|
737
|
-
}
|
738
|
-
}, 'prop');
|
739
|
-
|
740
|
-
|
741
|
-
$(document).on('emptied ended updatetracklist', function(e){
|
742
|
-
if($(e.target).is('audio, video')){
|
743
|
-
var baseData = webshims.data(e.target, 'mediaelementBase');
|
744
|
-
if(baseData){
|
745
|
-
clearTimeout(baseData.updateTrackListTimer);
|
746
|
-
baseData.updateTrackListTimer = setTimeout(function(){
|
747
|
-
updateMediaTrackList.call(e.target, baseData);
|
748
|
-
}, 0);
|
749
|
-
}
|
750
|
-
}
|
751
|
-
});
|
752
|
-
|
753
|
-
var getNativeReadyState = function(trackElem, textTrack){
|
754
|
-
return textTrack.readyState || trackElem.readyState;
|
755
|
-
};
|
756
|
-
var stopOriginalEvent = function(e){
|
757
|
-
if(e.originalEvent){
|
758
|
-
e.stopImmediatePropagation();
|
759
|
-
}
|
760
|
-
};
|
761
|
-
var startTrackImplementation = function(){
|
762
|
-
if(webshims.implement(this, 'track')){
|
763
|
-
var shimedTrack = $.prop(this, 'track');
|
764
|
-
var origTrack = this.track;
|
765
|
-
var kind;
|
766
|
-
var readyState;
|
767
|
-
if(origTrack){
|
768
|
-
kind = $.prop(this, 'kind');
|
769
|
-
readyState = getNativeReadyState(this, origTrack);
|
770
|
-
if (origTrack.mode || readyState) {
|
771
|
-
shimedTrack.mode = numericModes[origTrack.mode] || origTrack.mode;
|
772
|
-
}
|
773
|
-
//disable track from showing + remove UI
|
774
|
-
if(kind != 'descriptions'){
|
775
|
-
origTrack.mode = (typeof origTrack.mode == 'string') ? 'disabled' : 0;
|
776
|
-
this.kind = 'metadata';
|
777
|
-
$(this).attr({kind: kind});
|
778
|
-
}
|
779
|
-
|
780
|
-
}
|
781
|
-
$(this).on('load error', stopOriginalEvent);
|
782
|
-
}
|
783
|
-
};
|
784
|
-
webshims.addReady(function(context, insertedElement){
|
785
|
-
var insertedMedia = insertedElement.filter('video, audio, track').closest('audio, video');
|
786
|
-
$('video, audio', context)
|
787
|
-
.add(insertedMedia)
|
788
|
-
.each(function(){
|
789
|
-
updateMediaTrackList.call(this);
|
790
|
-
})
|
791
|
-
.each(function(){
|
792
|
-
if(Modernizr.track){
|
793
|
-
var shimedTextTracks = $.prop(this, 'textTracks');
|
794
|
-
var origTextTracks = this.textTracks;
|
795
|
-
if(shimedTextTracks.length != origTextTracks.length){
|
796
|
-
webshims.error("textTracks couldn't be copied");
|
797
|
-
}
|
798
|
-
|
799
|
-
$('track', this).each(startTrackImplementation);
|
800
|
-
}
|
801
|
-
})
|
802
|
-
;
|
803
|
-
insertedMedia.each(function(){
|
804
|
-
var media = this;
|
805
|
-
var baseData = webshims.data(media, 'mediaelementBase');
|
806
|
-
if(baseData){
|
807
|
-
clearTimeout(baseData.updateTrackListTimer);
|
808
|
-
baseData.updateTrackListTimer = setTimeout(function(){
|
809
|
-
updateMediaTrackList.call(media, baseData);
|
810
|
-
}, 9);
|
811
|
-
}
|
812
|
-
});
|
813
|
-
});
|
814
|
-
|
815
|
-
if(Modernizr.track){
|
816
|
-
$('video, audio').trigger('trackapichange');
|
817
|
-
}
|
818
|
-
});
|
819
|
-
(function($){
|
820
|
-
if(Modernizr.track && Modernizr.texttrackapi && document.addEventListener){
|
821
|
-
var trackOptions = webshims.cfg.track;
|
822
|
-
var trackListener = function(e){
|
823
|
-
$(e.target).filter('track').each(changeApi);
|
824
|
-
};
|
825
|
-
var trackBugs = webshims.bugs.track;
|
826
|
-
var changeApi = function(){
|
827
|
-
if(trackBugs || (!trackOptions.override && $.prop(this, 'readyState') == 3)){
|
828
|
-
trackOptions.override = true;
|
829
|
-
webshims.reTest('track');
|
830
|
-
document.removeEventListener('error', trackListener, true);
|
831
|
-
if(this && $.nodeName(this, 'track')){
|
832
|
-
webshims.error("track support was overwritten. Please check your vtt including your vtt mime-type");
|
833
|
-
} else {
|
834
|
-
webshims.info("track support was overwritten. due to bad browser support");
|
835
|
-
}
|
836
|
-
return false;
|
837
|
-
}
|
838
|
-
};
|
839
|
-
var detectTrackError = function(){
|
840
|
-
document.addEventListener('error', trackListener, true);
|
841
|
-
if(trackBugs){
|
842
|
-
changeApi();
|
843
|
-
} else {
|
844
|
-
$('track').each(changeApi);
|
845
|
-
}
|
846
|
-
};
|
847
|
-
if(!trackOptions.override){
|
848
|
-
detectTrackError();
|
849
|
-
}
|
850
|
-
}
|
851
|
-
})(webshims.$)
|
852
|
-
webshims.register('track-ui', function($, webshims, window, document, undefined){
|
853
|
-
"use strict";
|
854
|
-
var options = webshims.cfg.track;
|
855
|
-
var enterE = {type: 'enter'};
|
856
|
-
var exitE = {type: 'exit'};
|
857
|
-
//descriptions are not really shown, but they are inserted into the dom
|
858
|
-
var showTracks = {subtitles: 1, captions: 1, descriptions: 1};
|
859
|
-
var mediaelement = webshims.mediaelement;
|
860
|
-
var usesNativeTrack = function(){
|
861
|
-
return !options.override && Modernizr.texttrackapi;
|
862
|
-
};
|
863
|
-
|
864
|
-
var trackDisplay = {
|
865
|
-
update: function(baseData, media){
|
866
|
-
if(!baseData.activeCues.length){
|
867
|
-
this.hide(baseData);
|
868
|
-
} else {
|
869
|
-
if(!compareArray(baseData.displayedActiveCues, baseData.activeCues)){
|
870
|
-
baseData.displayedActiveCues = baseData.activeCues;
|
871
|
-
if(!baseData.trackDisplay){
|
872
|
-
baseData.trackDisplay = $('<div class="cue-display"><span class="description-cues" aria-live="assertive" /></div>').insertAfter(media);
|
873
|
-
this.addEvents(baseData, media);
|
874
|
-
webshims.docObserve();
|
875
|
-
}
|
876
|
-
|
877
|
-
if(baseData.hasDirtyTrackDisplay){
|
878
|
-
media.triggerHandler('forceupdatetrackdisplay');
|
879
|
-
}
|
880
|
-
this.showCues(baseData);
|
881
|
-
}
|
882
|
-
}
|
883
|
-
},
|
884
|
-
showCues: function(baseData){
|
885
|
-
var element = $('<span class="cue-wrapper" />');
|
886
|
-
$.each(baseData.displayedActiveCues, function(i, cue){
|
887
|
-
var id = (cue.id) ? 'id="cue-id-'+cue.id +'"' : '';
|
888
|
-
var cueHTML = $('<span class="cue-line"><span '+ id+ ' class="cue" /></span>').find('span').html(cue.getCueAsHTML()).end();
|
889
|
-
if(cue.track.kind == 'descriptions'){
|
890
|
-
setTimeout(function(){
|
891
|
-
$('span.description-cues', baseData.trackDisplay).html(cueHTML);
|
892
|
-
}, 0);
|
893
|
-
} else {
|
894
|
-
element.prepend(cueHTML);
|
895
|
-
}
|
896
|
-
});
|
897
|
-
$('span.cue-wrapper', baseData.trackDisplay).remove();
|
898
|
-
baseData.trackDisplay.append(element);
|
899
|
-
},
|
900
|
-
addEvents: function(baseData, media){
|
901
|
-
if(options.positionDisplay){
|
902
|
-
var timer;
|
903
|
-
var positionDisplay = function(_force){
|
904
|
-
if(baseData.displayedActiveCues.length || _force === true){
|
905
|
-
baseData.trackDisplay.css({display: 'none'});
|
906
|
-
var uiElement = media.getShadowElement();
|
907
|
-
var offsetElement = uiElement.offsetParent();
|
908
|
-
var uiHeight = uiElement.innerHeight();
|
909
|
-
var uiWidth = uiElement.innerWidth();
|
910
|
-
var position = uiElement.position();
|
911
|
-
var displaySize = uiHeight * uiWidth;
|
912
|
-
baseData.trackDisplay.css({
|
913
|
-
left: position.left,
|
914
|
-
width: uiWidth,
|
915
|
-
height: uiHeight - 45,
|
916
|
-
top: position.top,
|
917
|
-
display: 'block'
|
918
|
-
});
|
919
|
-
|
920
|
-
baseData.trackDisplay.css('fontSize', Math.max(Math.round(uiHeight / 30), 7));
|
921
|
-
baseData.hasDirtyTrackDisplay = false;
|
922
|
-
} else {
|
923
|
-
baseData.hasDirtyTrackDisplay = true;
|
924
|
-
}
|
925
|
-
};
|
926
|
-
var delayed = function(e){
|
927
|
-
clearTimeout(timer);
|
928
|
-
timer = setTimeout(positionDisplay, 0);
|
929
|
-
};
|
930
|
-
var forceUpdate = function(){
|
931
|
-
positionDisplay(true);
|
932
|
-
};
|
933
|
-
media.on('playerdimensionchange mediaelementapichange updatetrackdisplay updatemediaelementdimensions swfstageresize', delayed);
|
934
|
-
media.on('forceupdatetrackdisplay', forceUpdate).onWSOff('updateshadowdom', delayed);
|
935
|
-
forceUpdate();
|
936
|
-
}
|
937
|
-
},
|
938
|
-
hide: function(baseData){
|
939
|
-
if(baseData.trackDisplay && baseData.displayedActiveCues.length){
|
940
|
-
baseData.displayedActiveCues = [];
|
941
|
-
$('span.cue-wrapper', baseData.trackDisplay).remove();
|
942
|
-
$('span.description-cues', baseData.trackDisplay).empty();
|
943
|
-
}
|
944
|
-
}
|
945
|
-
};
|
946
|
-
|
947
|
-
function compareArray(a1, a2){
|
948
|
-
var ret = true;
|
949
|
-
var i = 0;
|
950
|
-
var len = a1.length;
|
951
|
-
if(len != a2.length){
|
952
|
-
ret = false;
|
953
|
-
} else {
|
954
|
-
for(; i < len; i++){
|
955
|
-
if(a1[i] != a2[i]){
|
956
|
-
ret = false;
|
957
|
-
break;
|
958
|
-
}
|
959
|
-
}
|
960
|
-
}
|
961
|
-
return ret;
|
962
|
-
}
|
963
|
-
|
964
|
-
|
965
|
-
mediaelement.trackDisplay = trackDisplay;
|
966
|
-
|
967
|
-
if(!mediaelement.createCueList){
|
968
|
-
|
969
|
-
var cueListProto = {
|
970
|
-
getCueById: function(id){
|
971
|
-
var cue = null;
|
972
|
-
for(var i = 0, len = this.length; i < len; i++){
|
973
|
-
if(this[i].id === id){
|
974
|
-
cue = this[i];
|
975
|
-
break;
|
976
|
-
}
|
977
|
-
}
|
978
|
-
return cue;
|
979
|
-
}
|
980
|
-
};
|
981
|
-
|
982
|
-
mediaelement.createCueList = function(){
|
983
|
-
return $.extend([], cueListProto);
|
984
|
-
};
|
985
|
-
}
|
986
|
-
|
987
|
-
mediaelement.getActiveCue = function(track, media, time, baseData){
|
988
|
-
if(!track._lastFoundCue){
|
989
|
-
track._lastFoundCue = {index: 0, time: 0};
|
990
|
-
}
|
991
|
-
|
992
|
-
if(Modernizr.texttrackapi && !options.override && !track._shimActiveCues){
|
993
|
-
track._shimActiveCues = mediaelement.createCueList();
|
994
|
-
}
|
995
|
-
|
996
|
-
var i = 0;
|
997
|
-
var len;
|
998
|
-
var cue;
|
999
|
-
|
1000
|
-
for(; i < track.shimActiveCues.length; i++){
|
1001
|
-
cue = track.shimActiveCues[i];
|
1002
|
-
if(cue.startTime > time || cue.endTime < time){
|
1003
|
-
track.shimActiveCues.splice(i, 1);
|
1004
|
-
i--;
|
1005
|
-
if(cue.pauseOnExit){
|
1006
|
-
$(media).pause();
|
1007
|
-
}
|
1008
|
-
$(track).triggerHandler('cuechange');
|
1009
|
-
$(cue).triggerHandler('exit');
|
1010
|
-
} else if(track.mode == 'showing' && showTracks[track.kind] && $.inArray(cue, baseData.activeCues) == -1){
|
1011
|
-
baseData.activeCues.push(cue);
|
1012
|
-
}
|
1013
|
-
}
|
1014
|
-
|
1015
|
-
|
1016
|
-
len = track.cues.length;
|
1017
|
-
i = track._lastFoundCue.time < time ? track._lastFoundCue.index : 0;
|
1018
|
-
|
1019
|
-
for(; i < len; i++){
|
1020
|
-
cue = track.cues[i];
|
1021
|
-
|
1022
|
-
if(cue.startTime <= time && cue.endTime >= time && $.inArray(cue, track.shimActiveCues) == -1){
|
1023
|
-
track.shimActiveCues.push(cue);
|
1024
|
-
if(track.mode == 'showing' && showTracks[track.kind]){
|
1025
|
-
baseData.activeCues.push(cue);
|
1026
|
-
}
|
1027
|
-
$(track).triggerHandler('cuechange');
|
1028
|
-
$(cue).triggerHandler('enter');
|
1029
|
-
|
1030
|
-
track._lastFoundCue.time = time;
|
1031
|
-
track._lastFoundCue.index = i;
|
1032
|
-
|
1033
|
-
|
1034
|
-
}
|
1035
|
-
if(cue.startTime > time){
|
1036
|
-
break;
|
1037
|
-
}
|
1038
|
-
}
|
1039
|
-
};
|
1040
|
-
|
1041
|
-
if(usesNativeTrack()){
|
1042
|
-
(function(){
|
1043
|
-
var block;
|
1044
|
-
var triggerDisplayUpdate = function(elem){
|
1045
|
-
setTimeout(function(){
|
1046
|
-
block = true;
|
1047
|
-
$(elem).triggerHandler('updatetrackdisplay');
|
1048
|
-
block = false;
|
1049
|
-
}, 9);
|
1050
|
-
};
|
1051
|
-
|
1052
|
-
var createUpdateFn = function(nodeName, prop, type){
|
1053
|
-
var superType = '_sup'+type;
|
1054
|
-
var desc = {prop: {}};
|
1055
|
-
var superDesc;
|
1056
|
-
desc.prop[type] = function(){
|
1057
|
-
if(!block && usesNativeTrack()){
|
1058
|
-
triggerDisplayUpdate($(this).closest('audio, video'));
|
1059
|
-
}
|
1060
|
-
return superDesc.prop[superType].apply(this, arguments);
|
1061
|
-
};
|
1062
|
-
superDesc = webshims.defineNodeNameProperty(nodeName, prop, desc);
|
1063
|
-
};
|
1064
|
-
|
1065
|
-
createUpdateFn('track', 'track', 'get');
|
1066
|
-
|
1067
|
-
['audio', 'video'].forEach(function(nodeName){
|
1068
|
-
createUpdateFn(nodeName, 'textTracks', 'get');
|
1069
|
-
createUpdateFn('nodeName', 'addTextTrack', 'value');
|
1070
|
-
});
|
1071
|
-
})();
|
1072
|
-
$.propHooks.activeCues = {
|
1073
|
-
get: function(obj, value){
|
1074
|
-
return obj._shimActiveCues || obj.activeCues;
|
1075
|
-
}
|
1076
|
-
};
|
1077
|
-
}
|
1078
|
-
|
1079
|
-
webshims.addReady(function(context, insertedElement){
|
1080
|
-
$('video, audio', context)
|
1081
|
-
.add(insertedElement.filter('video, audio'))
|
1082
|
-
.filter(function(){
|
1083
|
-
return webshims.implement(this, 'trackui');
|
1084
|
-
})
|
1085
|
-
.each(function(){
|
1086
|
-
var baseData, trackList, updateTimer, updateTimer2;
|
1087
|
-
|
1088
|
-
var elem = $(this);
|
1089
|
-
var getDisplayCues = function(e){
|
1090
|
-
var track;
|
1091
|
-
var time;
|
1092
|
-
|
1093
|
-
if(!trackList || !baseData){
|
1094
|
-
trackList = elem.prop('textTracks');
|
1095
|
-
baseData = webshims.data(elem[0], 'mediaelementBase') || webshims.data(elem[0], 'mediaelementBase', {});
|
1096
|
-
if(!baseData.displayedActiveCues){
|
1097
|
-
baseData.displayedActiveCues = [];
|
1098
|
-
}
|
1099
|
-
}
|
1100
|
-
|
1101
|
-
if (!trackList){return;}
|
1102
|
-
time = elem.prop('currentTime');
|
1103
|
-
|
1104
|
-
if(!time && time !== 0){return;}
|
1105
|
-
baseData.activeCues = [];
|
1106
|
-
for(var i = 0, len = trackList.length; i < len; i++){
|
1107
|
-
track = trackList[i];
|
1108
|
-
if(track.mode != 'disabled' && track.cues && track.cues.length){
|
1109
|
-
mediaelement.getActiveCue(track, elem, time, baseData);
|
1110
|
-
}
|
1111
|
-
}
|
1112
|
-
|
1113
|
-
trackDisplay.update(baseData, elem);
|
1114
|
-
|
1115
|
-
};
|
1116
|
-
var onUpdate = function(e){
|
1117
|
-
clearTimeout(updateTimer);
|
1118
|
-
if(e && e.type == 'timeupdate'){
|
1119
|
-
getDisplayCues();
|
1120
|
-
updateTimer2 = setTimeout(onUpdate, 90);
|
1121
|
-
} else {
|
1122
|
-
updateTimer = setTimeout(getDisplayCues, 9);
|
1123
|
-
}
|
1124
|
-
};
|
1125
|
-
var addTrackView = function(){
|
1126
|
-
|
1127
|
-
elem
|
1128
|
-
.off('.trackview')
|
1129
|
-
.on('play.trackview timeupdate.trackview updatetrackdisplay.trackview', onUpdate)
|
1130
|
-
;
|
1131
|
-
};
|
1132
|
-
|
1133
|
-
elem.on('remove', function(e){
|
1134
|
-
if(!e.originalEvent && baseData && baseData.trackDisplay){
|
1135
|
-
setTimeout(function(){
|
1136
|
-
baseData.trackDisplay.remove();
|
1137
|
-
}, 4);
|
1138
|
-
}
|
1139
|
-
});
|
1140
|
-
|
1141
|
-
if(!usesNativeTrack()){
|
1142
|
-
addTrackView();
|
1143
|
-
} else {
|
1144
|
-
elem.on('mediaelementapichange trackapichange', function(){
|
1145
|
-
if(!usesNativeTrack() || elem.is('.nonnative-api-active')){
|
1146
|
-
addTrackView();
|
1147
|
-
} else {
|
1148
|
-
clearTimeout(updateTimer);
|
1149
|
-
clearTimeout(updateTimer2);
|
1150
|
-
|
1151
|
-
trackList = elem.prop('textTracks');
|
1152
|
-
baseData = webshims.data(elem[0], 'mediaelementBase') || webshims.data(elem[0], 'mediaelementBase', {});
|
1153
|
-
|
1154
|
-
$.each(trackList, function(i, track){
|
1155
|
-
if(track._shimActiveCues){
|
1156
|
-
delete track._shimActiveCues;
|
1157
|
-
}
|
1158
|
-
});
|
1159
|
-
trackDisplay.hide(baseData);
|
1160
|
-
elem.unbind('.trackview');
|
1161
|
-
}
|
1162
|
-
});
|
1163
|
-
}
|
1164
|
-
})
|
1165
|
-
;
|
1166
|
-
});
|
1167
|
-
});
|