Browse Source
Upgrade to video.js 5 and convert to a source handler
Upgrade to video.js 5 and convert to a source handler
Bump up to a vjs 5 release candidate. Make the necessary changes to work with the updated APIs. Convert the project from a subclass of the Flash tech to a source handler.pull/6/head

15 changed files with 688 additions and 3173 deletions
-
7example.html
-
244libs/qunit/qunit.css
-
2152libs/qunit/qunit.js
-
6package.json
-
4src/decrypter.js
-
2src/m3u8/m3u8-parser.js
-
37src/playlist-loader.js
-
400src/videojs-hls.js
-
92src/xhr.js
-
9test/karma.conf.js
-
9test/localkarma.conf.js
-
4test/segment-parser.js
-
14test/videojs-hls.html
-
847test/videojs-hls_test.js
-
34test/xhr_test.js
@ -1,244 +0,0 @@ |
|||
/** |
|||
* QUnit v1.11.0 - A JavaScript Unit Testing Framework |
|||
* |
|||
* http://qunitjs.com |
|||
* |
|||
* Copyright 2012 jQuery Foundation and other contributors |
|||
* Released under the MIT license. |
|||
* http://jquery.org/license |
|||
*/ |
|||
|
|||
/** Font Family and Sizes */ |
|||
|
|||
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult { |
|||
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif; |
|||
} |
|||
|
|||
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; } |
|||
#qunit-tests { font-size: smaller; } |
|||
|
|||
|
|||
/** Resets */ |
|||
|
|||
#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter { |
|||
margin: 0; |
|||
padding: 0; |
|||
} |
|||
|
|||
|
|||
/** Header */ |
|||
|
|||
#qunit-header { |
|||
padding: 0.5em 0 0.5em 1em; |
|||
|
|||
color: #8699a4; |
|||
background-color: #0d3349; |
|||
|
|||
font-size: 1.5em; |
|||
line-height: 1em; |
|||
font-weight: normal; |
|||
|
|||
border-radius: 5px 5px 0 0; |
|||
-moz-border-radius: 5px 5px 0 0; |
|||
-webkit-border-top-right-radius: 5px; |
|||
-webkit-border-top-left-radius: 5px; |
|||
} |
|||
|
|||
#qunit-header a { |
|||
text-decoration: none; |
|||
color: #c2ccd1; |
|||
} |
|||
|
|||
#qunit-header a:hover, |
|||
#qunit-header a:focus { |
|||
color: #fff; |
|||
} |
|||
|
|||
#qunit-testrunner-toolbar label { |
|||
display: inline-block; |
|||
padding: 0 .5em 0 .1em; |
|||
} |
|||
|
|||
#qunit-banner { |
|||
height: 5px; |
|||
} |
|||
|
|||
#qunit-testrunner-toolbar { |
|||
padding: 0.5em 0 0.5em 2em; |
|||
color: #5E740B; |
|||
background-color: #eee; |
|||
overflow: hidden; |
|||
} |
|||
|
|||
#qunit-userAgent { |
|||
padding: 0.5em 0 0.5em 2.5em; |
|||
background-color: #2b81af; |
|||
color: #fff; |
|||
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; |
|||
} |
|||
|
|||
#qunit-modulefilter-container { |
|||
float: right; |
|||
} |
|||
|
|||
/** Tests: Pass/Fail */ |
|||
|
|||
#qunit-tests { |
|||
list-style-position: inside; |
|||
} |
|||
|
|||
#qunit-tests li { |
|||
padding: 0.4em 0.5em 0.4em 2.5em; |
|||
border-bottom: 1px solid #fff; |
|||
list-style-position: inside; |
|||
} |
|||
|
|||
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running { |
|||
display: none; |
|||
} |
|||
|
|||
#qunit-tests li strong { |
|||
cursor: pointer; |
|||
} |
|||
|
|||
#qunit-tests li a { |
|||
padding: 0.5em; |
|||
color: #c2ccd1; |
|||
text-decoration: none; |
|||
} |
|||
#qunit-tests li a:hover, |
|||
#qunit-tests li a:focus { |
|||
color: #000; |
|||
} |
|||
|
|||
#qunit-tests li .runtime { |
|||
float: right; |
|||
font-size: smaller; |
|||
} |
|||
|
|||
.qunit-assert-list { |
|||
margin-top: 0.5em; |
|||
padding: 0.5em; |
|||
|
|||
background-color: #fff; |
|||
|
|||
border-radius: 5px; |
|||
-moz-border-radius: 5px; |
|||
-webkit-border-radius: 5px; |
|||
} |
|||
|
|||
.qunit-collapsed { |
|||
display: none; |
|||
} |
|||
|
|||
#qunit-tests table { |
|||
border-collapse: collapse; |
|||
margin-top: .2em; |
|||
} |
|||
|
|||
#qunit-tests th { |
|||
text-align: right; |
|||
vertical-align: top; |
|||
padding: 0 .5em 0 0; |
|||
} |
|||
|
|||
#qunit-tests td { |
|||
vertical-align: top; |
|||
} |
|||
|
|||
#qunit-tests pre { |
|||
margin: 0; |
|||
white-space: pre-wrap; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
#qunit-tests del { |
|||
background-color: #e0f2be; |
|||
color: #374e0c; |
|||
text-decoration: none; |
|||
} |
|||
|
|||
#qunit-tests ins { |
|||
background-color: #ffcaca; |
|||
color: #500; |
|||
text-decoration: none; |
|||
} |
|||
|
|||
/*** Test Counts */ |
|||
|
|||
#qunit-tests b.counts { color: black; } |
|||
#qunit-tests b.passed { color: #5E740B; } |
|||
#qunit-tests b.failed { color: #710909; } |
|||
|
|||
#qunit-tests li li { |
|||
padding: 5px; |
|||
background-color: #fff; |
|||
border-bottom: none; |
|||
list-style-position: inside; |
|||
} |
|||
|
|||
/*** Passing Styles */ |
|||
|
|||
#qunit-tests li li.pass { |
|||
color: #3c510c; |
|||
background-color: #fff; |
|||
border-left: 10px solid #C6E746; |
|||
} |
|||
|
|||
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; } |
|||
#qunit-tests .pass .test-name { color: #366097; } |
|||
|
|||
#qunit-tests .pass .test-actual, |
|||
#qunit-tests .pass .test-expected { color: #999999; } |
|||
|
|||
#qunit-banner.qunit-pass { background-color: #C6E746; } |
|||
|
|||
/*** Failing Styles */ |
|||
|
|||
#qunit-tests li li.fail { |
|||
color: #710909; |
|||
background-color: #fff; |
|||
border-left: 10px solid #EE5757; |
|||
white-space: pre; |
|||
} |
|||
|
|||
#qunit-tests > li:last-child { |
|||
border-radius: 0 0 5px 5px; |
|||
-moz-border-radius: 0 0 5px 5px; |
|||
-webkit-border-bottom-right-radius: 5px; |
|||
-webkit-border-bottom-left-radius: 5px; |
|||
} |
|||
|
|||
#qunit-tests .fail { color: #000000; background-color: #EE5757; } |
|||
#qunit-tests .fail .test-name, |
|||
#qunit-tests .fail .module-name { color: #000000; } |
|||
|
|||
#qunit-tests .fail .test-actual { color: #EE5757; } |
|||
#qunit-tests .fail .test-expected { color: green; } |
|||
|
|||
#qunit-banner.qunit-fail { background-color: #EE5757; } |
|||
|
|||
|
|||
/** Result */ |
|||
|
|||
#qunit-testresult { |
|||
padding: 0.5em 0.5em 0.5em 2.5em; |
|||
|
|||
color: #2b81af; |
|||
background-color: #D2E0E6; |
|||
|
|||
border-bottom: 1px solid white; |
|||
} |
|||
#qunit-testresult .module-name { |
|||
font-weight: bold; |
|||
} |
|||
|
|||
/** Fixture */ |
|||
|
|||
#qunit-fixture { |
|||
position: absolute; |
|||
top: -10000px; |
|||
left: -10000px; |
|||
width: 1000px; |
|||
height: 1000px; |
|||
} |
2152
libs/qunit/qunit.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,86 +1,22 @@ |
|||
(function(videojs){ |
|||
(function(videojs) { |
|||
'use strict'; |
|||
|
|||
/** |
|||
* Creates and sends an XMLHttpRequest. |
|||
* TODO - expose video.js core's XHR and use that instead |
|||
* |
|||
* @param options {string | object} if this argument is a string, it |
|||
* is intrepreted as a URL and a simple GET request is |
|||
* inititated. If it is an object, it should contain a `url` |
|||
* property that indicates the URL to request and optionally a |
|||
* `method` which is the type of HTTP request to send. |
|||
* @param callback (optional) {function} a function to call when the |
|||
* request completes. If the request was not successful, the first |
|||
* argument will be falsey. |
|||
* @return {object} the XMLHttpRequest that was initiated. |
|||
* A wrapper for videojs.xhr that tracks bandwidth. |
|||
*/ |
|||
videojs.Hls.xhr = function(url, callback) { |
|||
var |
|||
options = { |
|||
method: 'GET', |
|||
timeout: 45 * 1000 |
|||
}, |
|||
request, |
|||
abortTimeout; |
|||
|
|||
if (typeof callback !== 'function') { |
|||
callback = function() {}; |
|||
} |
|||
|
|||
if (typeof url === 'object') { |
|||
options = videojs.util.mergeOptions(options, url); |
|||
url = options.url; |
|||
} |
|||
|
|||
request = new window.XMLHttpRequest(); |
|||
request.open(options.method, url); |
|||
request.url = url; |
|||
request.requestTime = new Date().getTime(); |
|||
|
|||
if (options.responseType) { |
|||
request.responseType = options.responseType; |
|||
} |
|||
if (options.withCredentials) { |
|||
request.withCredentials = true; |
|||
} |
|||
if (options.timeout) { |
|||
abortTimeout = window.setTimeout(function() { |
|||
if (request.readyState !== 4) { |
|||
request.timedout = true; |
|||
request.abort(); |
|||
} |
|||
}, options.timeout); |
|||
} |
|||
|
|||
request.onreadystatechange = function() { |
|||
// wait until the request completes
|
|||
if (this.readyState !== 4) { |
|||
return; |
|||
videojs.Hls.xhr = function(options, callback) { |
|||
var request = videojs.xhr(options, function(error, request) { |
|||
if (request.response) { |
|||
request.responseTime = (new Date()).getTime(); |
|||
request.roundTripTime = request.responseTime - request.requestTime; |
|||
request.bytesReceived = request.response.byteLength || request.response.length; |
|||
request.bandwidth = Math.floor((request.bytesReceived / request.roundTripTime) * 8 * 1000); |
|||
} |
|||
|
|||
// clear outstanding timeouts
|
|||
window.clearTimeout(abortTimeout); |
|||
callback(error, request); |
|||
}); |
|||
|
|||
// request timeout
|
|||
if (request.timedout) { |
|||
return callback.call(this, 'timeout', url); |
|||
} |
|||
|
|||
// request aborted or errored
|
|||
if (this.status >= 400 || this.status === 0) { |
|||
return callback.call(this, true, url); |
|||
} |
|||
|
|||
if (this.response) { |
|||
this.responseTime = new Date().getTime(); |
|||
this.roundTripTime = this.responseTime - this.requestTime; |
|||
this.bytesReceived = this.response.byteLength || this.response.length; |
|||
this.bandwidth = Math.floor((this.bytesReceived / this.roundTripTime) * 8 * 1000); |
|||
} |
|||
|
|||
return callback.call(this, false, url); |
|||
}; |
|||
request.send(null); |
|||
request.requestTime = (new Date()).getTime(); |
|||
return request; |
|||
}; |
|||
|
|||
})(window.videojs); |
847
test/videojs-hls_test.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,34 +0,0 @@ |
|||
(function(window, videojs, undefined) { |
|||
'use strict'; |
|||
|
|||
/* |
|||
XHR test suite |
|||
*/ |
|||
|
|||
var xhr; |
|||
|
|||
module('XHR', { |
|||
setup: function() { |
|||
xhr = sinon.useFakeXMLHttpRequest(); |
|||
}, |
|||
|
|||
teardown: function() { |
|||
xhr.restore(); |
|||
} |
|||
}); |
|||
|
|||
test('handles xhr timeouts correctly', function () { |
|||
var error; |
|||
var clock = sinon.useFakeTimers(); |
|||
videojs.Hls.xhr({ |
|||
url: 'http://example.com', |
|||
timeout: 1 |
|||
}, function(innerError) { |
|||
error = innerError; |
|||
}); |
|||
clock.tick(1); |
|||
strictEqual(error, 'timeout', 'called with timeout error'); |
|||
clock.restore(); |
|||
}); |
|||
|
|||
})(window, window.videojs); |
Write
Preview
Loading…
Cancel
Save
Reference in new issue