Skip to content

Commit cd4a2bf

Browse files
committed
Add validation for data-* attributes
1 parent 0a773a3 commit cd4a2bf

6 files changed

Lines changed: 69 additions & 31 deletions

File tree

build/ableplayer.js

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -98,40 +98,52 @@
9898
}
9999

100100
if ($(media).data('youtube-id') !== undefined && $(media).data('youtube-id') !== "") {
101-
// add validation
101+
// move this to <source> element
102102
this.youtubeId = $(media).data('youtube-id');
103103
}
104104

105105
if ($(media).data('volume') !== undefined && $(media).data('volume') !== "") {
106-
// add validation
107-
this.defaultVolume = $(media).data('volume');
106+
var volume = $(media).data('volume');
107+
if (volume >= 0 && volume <= 1) {
108+
this.defaultVolume = volume;
109+
}
108110
}
109111

110112
if ($(media).data('icon-type') !== undefined && $(media).data('icon-type') !== "") {
111-
// add validation
112-
this.iconType = $(media).data('icon-type');
113+
var iconType = $(media).data('icon-type');
114+
if (iconType === 'font' || iconType == 'image') {
115+
this.iconType = iconType;
116+
}
113117
}
114118

115119
if ($(media).data('seek-interval') !== undefined && $(media).data('seek-interval') !== "") {
116-
// add validation
117-
this.seekInterval = $(media).data('seek-interval');
120+
var seekInterval = $(media).data('seek-interval');
121+
if (/^[1-9][0-9]*$/.test(seekInterval)) { // must be a whole number greater than 0
122+
this.seekInterval = seekInterval;
123+
this.useFixedSeekInterval = true; // do not override with 1/10 of duration
124+
}
118125
}
119126

120127
if ($(media).data('show-now-playing') !== undefined && $(media).data('show-now-playing') !== "false") {
121128
this.showNowPlaying = true;
122129
}
123130

124131
if ($(media).data('fallback') !== undefined && $(media).data('fallback') !== "") {
125-
// add validation
126-
this.fallback = $(media).data('fallback');
132+
var fallback = $(media).data('fallback');
133+
if (fallback === 'jw') {
134+
this.fallback = fallback;
135+
}
127136
}
128137

129138
if ($(media).data('test-fallback') !== undefined && $(media).data('test-fallback') !== "false") {
130139
this.testFallback = true;
131140
}
132141

133142
if ($(media).data('lang') !== undefined && $(media).data('lang') !== "") {
134-
this.lang = $(media).data('lang');
143+
var lang = $(media).data('lang');
144+
if (lang.length == 2) {
145+
this.lang = lang;
146+
}
135147
}
136148

137149
if ($(media).data('lang-override') !== undefined && $(media).data('lang-override') !== "false") {
@@ -266,6 +278,8 @@
266278

267279
// Browsers that don't support seekbar sliders will use rewind and forward buttons
268280
// seekInterval = Number of seconds to seek forward or back with these buttons
281+
// NOTE: Unless user overrides this default with data-seek-interval attribute,
282+
// this value is replaced by 1/10 the duration of the media file, once the duration is known
269283
this.seekInterval = 10;
270284

271285
// In ABLE's predecessor (AAP) progress sliders were included in supporting browsers
@@ -572,9 +586,11 @@
572586
thisObj.$media[0].load();
573587
}
574588

575-
// 10 steps in seek interval; wait until the end so that we can fetch a duration.
576-
thisObj.seekInterval = Math.max(10, thisObj.getDuration() / 10);
577-
589+
if (this.useFixedSeekInterval === false) {
590+
// 10 steps in seek interval; wait until the end so that we can fetch a duration.
591+
thisObj.seekInterval = Math.max(10, thisObj.getDuration() / 10);
592+
}
593+
578594
deferred.resolve();
579595
});
580596

@@ -1136,6 +1152,7 @@
11361152
(function () {
11371153
// See section 4.1 of dev.w3.org/html5/webvtt for format details.
11381154
AblePlayer.prototype.parseWebVTT = function(text) {
1155+
11391156
// Normalize line ends to \n.
11401157
text.replace('\r\n', '\n').replace('\r', '\n');
11411158

@@ -1384,6 +1401,7 @@
13841401
}
13851402

13861403
var token = getCueToken(state);
1404+
13871405
// We'll use the tokens themselves as objects where possible.
13881406
if (token.type === 'string') {
13891407
current.children.push(token);
@@ -1453,7 +1471,6 @@
14531471
}
14541472
}
14551473
}
1456-
14571474
return result;
14581475
}
14591476

@@ -1477,7 +1494,7 @@
14771494
// End of file.
14781495
c = '\u0004';
14791496
}
1480-
1497+
14811498
if (tokenState === 'data') {
14821499
if (c === '&') {
14831500
buffer = '&';
@@ -4427,6 +4444,7 @@ console.log('number of matching parent elements: ' + prevHeading.length);
44274444
};
44284445

44294446
AblePlayer.prototype.handleRewind = function() {
4447+
console.log('rewinding ' + this.seekInterval + ' seconds');
44304448
var targetTime = this.getElapsed() - this.seekInterval;
44314449
if (targetTime < 0) {
44324450
this.seekTo(0);
@@ -4437,6 +4455,7 @@ console.log('number of matching parent elements: ' + prevHeading.length);
44374455
};
44384456

44394457
AblePlayer.prototype.handleFastForward = function() {
4458+
console.log('fast forwarding ' + this.seekInterval + ' seconds');
44404459
var targetTime = this.getElapsed() + this.seekInterval;
44414460

44424461
if (targetTime > this.getDuration()) {

media/wwa_captions_en.vtt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ NOTE This VTT file includes a few extras:
1717
[ music ]
1818

1919
00:00:09.165 --> 00:00:10.792
20-
<v Narrator> You want these people.
20+
<v Narrator> You want</v> these people.
2121

2222
00:00:10.792 --> 00:00:13.759
2323
They order your products, sign up for your services,

scripts/ableplayer-base.js

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -98,40 +98,52 @@
9898
}
9999

100100
if ($(media).data('youtube-id') !== undefined && $(media).data('youtube-id') !== "") {
101-
// add validation
101+
// move this to <source> element
102102
this.youtubeId = $(media).data('youtube-id');
103103
}
104104

105105
if ($(media).data('volume') !== undefined && $(media).data('volume') !== "") {
106-
// add validation
107-
this.defaultVolume = $(media).data('volume');
106+
var volume = $(media).data('volume');
107+
if (volume >= 0 && volume <= 1) {
108+
this.defaultVolume = volume;
109+
}
108110
}
109111

110112
if ($(media).data('icon-type') !== undefined && $(media).data('icon-type') !== "") {
111-
// add validation
112-
this.iconType = $(media).data('icon-type');
113+
var iconType = $(media).data('icon-type');
114+
if (iconType === 'font' || iconType == 'image') {
115+
this.iconType = iconType;
116+
}
113117
}
114118

115119
if ($(media).data('seek-interval') !== undefined && $(media).data('seek-interval') !== "") {
116-
// add validation
117-
this.seekInterval = $(media).data('seek-interval');
120+
var seekInterval = $(media).data('seek-interval');
121+
if (/^[1-9][0-9]*$/.test(seekInterval)) { // must be a whole number greater than 0
122+
this.seekInterval = seekInterval;
123+
this.useFixedSeekInterval = true; // do not override with 1/10 of duration
124+
}
118125
}
119126

120127
if ($(media).data('show-now-playing') !== undefined && $(media).data('show-now-playing') !== "false") {
121128
this.showNowPlaying = true;
122129
}
123130

124131
if ($(media).data('fallback') !== undefined && $(media).data('fallback') !== "") {
125-
// add validation
126-
this.fallback = $(media).data('fallback');
132+
var fallback = $(media).data('fallback');
133+
if (fallback === 'jw') {
134+
this.fallback = fallback;
135+
}
127136
}
128137

129138
if ($(media).data('test-fallback') !== undefined && $(media).data('test-fallback') !== "false") {
130139
this.testFallback = true;
131140
}
132141

133142
if ($(media).data('lang') !== undefined && $(media).data('lang') !== "") {
134-
this.lang = $(media).data('lang');
143+
var lang = $(media).data('lang');
144+
if (lang.length == 2) {
145+
this.lang = lang;
146+
}
135147
}
136148

137149
if ($(media).data('lang-override') !== undefined && $(media).data('lang-override') !== "false") {

scripts/control.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,7 @@
560560
};
561561

562562
AblePlayer.prototype.handleRewind = function() {
563+
console.log('rewinding ' + this.seekInterval + ' seconds');
563564
var targetTime = this.getElapsed() - this.seekInterval;
564565
if (targetTime < 0) {
565566
this.seekTo(0);
@@ -570,6 +571,7 @@
570571
};
571572

572573
AblePlayer.prototype.handleFastForward = function() {
574+
console.log('fast forwarding ' + this.seekInterval + ' seconds');
573575
var targetTime = this.getElapsed() + this.seekInterval;
574576

575577
if (targetTime > this.getDuration()) {

scripts/initialize.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828

2929
// Browsers that don't support seekbar sliders will use rewind and forward buttons
3030
// seekInterval = Number of seconds to seek forward or back with these buttons
31+
// NOTE: Unless user overrides this default with data-seek-interval attribute,
32+
// this value is replaced by 1/10 the duration of the media file, once the duration is known
3133
this.seekInterval = 10;
3234

3335
// In ABLE's predecessor (AAP) progress sliders were included in supporting browsers
@@ -334,9 +336,11 @@
334336
thisObj.$media[0].load();
335337
}
336338

337-
// 10 steps in seek interval; wait until the end so that we can fetch a duration.
338-
thisObj.seekInterval = Math.max(10, thisObj.getDuration() / 10);
339-
339+
if (this.useFixedSeekInterval === false) {
340+
// 10 steps in seek interval; wait until the end so that we can fetch a duration.
341+
thisObj.seekInterval = Math.max(10, thisObj.getDuration() / 10);
342+
}
343+
340344
deferred.resolve();
341345
});
342346

scripts/webvtt.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
(function () {
22
// See section 4.1 of dev.w3.org/html5/webvtt for format details.
33
AblePlayer.prototype.parseWebVTT = function(text) {
4+
45
// Normalize line ends to \n.
56
text.replace('\r\n', '\n').replace('\r', '\n');
67

@@ -249,6 +250,7 @@
249250
}
250251

251252
var token = getCueToken(state);
253+
252254
// We'll use the tokens themselves as objects where possible.
253255
if (token.type === 'string') {
254256
current.children.push(token);
@@ -318,7 +320,6 @@
318320
}
319321
}
320322
}
321-
322323
return result;
323324
}
324325

@@ -342,7 +343,7 @@
342343
// End of file.
343344
c = '\u0004';
344345
}
345-
346+
346347
if (tokenState === 'data') {
347348
if (c === '&') {
348349
buffer = '&';

0 commit comments

Comments
 (0)