2 * Copyright 2013 vtt.js Contributors
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 (function(root, vttjs) {
19 var autoKeyword = "auto";
20 var directionSetting = {
33 function findDirectionSetting(value) {
34 if (typeof value !== "string") {
37 var dir = directionSetting[value.toLowerCase()];
38 return dir ? value.toLowerCase() : false;
41 function findAlignSetting(value) {
42 if (typeof value !== "string") {
45 var align = alignSetting[value.toLowerCase()];
46 return align ? value.toLowerCase() : false;
49 function extend(obj) {
51 for (; i < arguments.length; i++) {
52 var cobj = arguments[i];
61 function VTTCue(startTime, endTime, text) {
63 var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent);
67 cue = document.createElement('custom');
69 baseObj.enumerable = true;
73 * Shim implementation specific properties. These properties are not in
77 // Lets us know when the VTTCue's data has changed in such a way that we need
78 // to recompute its display state. This lets us compute its display state
80 cue.hasBeenReset = false;
83 * VTTCue and TextTrackCue properties
84 * http://dev.w3.org/html5/webvtt/#vttcue-interface
88 var _pauseOnExit = false;
89 var _startTime = startTime;
90 var _endTime = endTime;
94 var _snapToLines = true;
96 var _lineAlign = "start";
98 var _positionAlign = "middle";
100 var _align = "middle";
102 Object.defineProperty(cue,
103 "id", extend({}, baseObj, {
107 set: function(value) {
112 Object.defineProperty(cue,
113 "pauseOnExit", extend({}, baseObj, {
117 set: function(value) {
118 _pauseOnExit = !!value;
122 Object.defineProperty(cue,
123 "startTime", extend({}, baseObj, {
127 set: function(value) {
128 if (typeof value !== "number") {
129 throw new TypeError("Start time must be set to a number.");
132 this.hasBeenReset = true;
136 Object.defineProperty(cue,
137 "endTime", extend({}, baseObj, {
141 set: function(value) {
142 if (typeof value !== "number") {
143 throw new TypeError("End time must be set to a number.");
146 this.hasBeenReset = true;
150 Object.defineProperty(cue,
151 "text", extend({}, baseObj, {
155 set: function(value) {
157 this.hasBeenReset = true;
161 Object.defineProperty(cue,
162 "region", extend({}, baseObj, {
166 set: function(value) {
168 this.hasBeenReset = true;
172 Object.defineProperty(cue,
173 "vertical", extend({}, baseObj, {
177 set: function(value) {
178 var setting = findDirectionSetting(value);
179 // Have to check for false because the setting an be an empty string.
180 if (setting === false) {
181 throw new SyntaxError("An invalid or illegal string was specified.");
184 this.hasBeenReset = true;
188 Object.defineProperty(cue,
189 "snapToLines", extend({}, baseObj, {
193 set: function(value) {
194 _snapToLines = !!value;
195 this.hasBeenReset = true;
199 Object.defineProperty(cue,
200 "line", extend({}, baseObj, {
204 set: function(value) {
205 if (typeof value !== "number" && value !== autoKeyword) {
206 throw new SyntaxError("An invalid number or illegal string was specified.");
209 this.hasBeenReset = true;
213 Object.defineProperty(cue,
214 "lineAlign", extend({}, baseObj, {
218 set: function(value) {
219 var setting = findAlignSetting(value);
221 throw new SyntaxError("An invalid or illegal string was specified.");
223 _lineAlign = setting;
224 this.hasBeenReset = true;
228 Object.defineProperty(cue,
229 "position", extend({}, baseObj, {
233 set: function(value) {
234 if (value < 0 || value > 100) {
235 throw new Error("Position must be between 0 and 100.");
238 this.hasBeenReset = true;
242 Object.defineProperty(cue,
243 "positionAlign", extend({}, baseObj, {
245 return _positionAlign;
247 set: function(value) {
248 var setting = findAlignSetting(value);
250 throw new SyntaxError("An invalid or illegal string was specified.");
252 _positionAlign = setting;
253 this.hasBeenReset = true;
257 Object.defineProperty(cue,
258 "size", extend({}, baseObj, {
262 set: function(value) {
263 if (value < 0 || value > 100) {
264 throw new Error("Size must be between 0 and 100.");
267 this.hasBeenReset = true;
271 Object.defineProperty(cue,
272 "align", extend({}, baseObj, {
276 set: function(value) {
277 var setting = findAlignSetting(value);
279 throw new SyntaxError("An invalid or illegal string was specified.");
282 this.hasBeenReset = true;
287 * Other <track> spec defined properties
290 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#text-track-cue-display-state
291 cue.displayState = undefined;
302 VTTCue.prototype.getCueAsHTML = function() {
303 // Assume WebVTT.convertCueToDOMTree is on the global.
304 return WebVTT.convertCueToDOMTree(window, this.text);
307 root.VTTCue = root.VTTCue || VTTCue;
308 vttjs.VTTCue = VTTCue;
309 }(this, (this.vttjs || {})));