summaryrefslogtreecommitdiffstats
path: root/dom/media/mediasource/test/mediasource.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/mediasource/test/mediasource.js')
-rw-r--r--dom/media/mediasource/test/mediasource.js130
1 files changed, 130 insertions, 0 deletions
diff --git a/dom/media/mediasource/test/mediasource.js b/dom/media/mediasource/test/mediasource.js
new file mode 100644
index 000000000..6a464096a
--- /dev/null
+++ b/dom/media/mediasource/test/mediasource.js
@@ -0,0 +1,130 @@
+// Helpers for Media Source Extensions tests
+
+function runWithMSE(testFunction) {
+ function bootstrapTest() {
+ var ms = new MediaSource();
+
+ var el = document.createElement("video");
+ el.src = URL.createObjectURL(ms);
+ el.preload = "auto";
+
+ document.body.appendChild(el);
+ SimpleTest.registerCleanupFunction(function () {
+ el.parentNode.removeChild(el);
+ });
+
+ testFunction(ms, el);
+ }
+
+ addLoadEvent(function () {
+ SpecialPowers.pushPrefEnv({"set": [
+ [ "media.mediasource.enabled", true ],
+ ]},
+ bootstrapTest);
+ });
+}
+
+function fetchWithXHR(uri, onLoadFunction) {
+ var p = new Promise(function(resolve, reject) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", uri, true);
+ xhr.responseType = "arraybuffer";
+ xhr.addEventListener("load", function () {
+ is(xhr.status, 200, "fetchWithXHR load uri='" + uri + "' status=" + xhr.status);
+ resolve(xhr.response);
+ });
+ xhr.send();
+ });
+
+ if (onLoadFunction) {
+ p.then(onLoadFunction);
+ }
+
+ return p;
+};
+
+function range(start, end) {
+ var rv = [];
+ for (var i = start; i < end; ++i) {
+ rv.push(i);
+ }
+ return rv;
+}
+
+function once(target, name, cb) {
+ var p = new Promise(function(resolve, reject) {
+ target.addEventListener(name, function onceEvent() {
+ target.removeEventListener(name, onceEvent);
+ resolve();
+ });
+ });
+ if (cb) {
+ p.then(cb);
+ }
+ return p;
+}
+
+function timeRangeToString(r) {
+ var str = "TimeRanges: ";
+ for (var i = 0; i < r.length; i++) {
+ str += "[" + r.start(i) + ", " + r.end(i) + ")";
+ }
+ return str;
+}
+
+function loadSegment(sb, typedArrayOrArrayBuffer) {
+ var typedArray = (typedArrayOrArrayBuffer instanceof ArrayBuffer) ? new Uint8Array(typedArrayOrArrayBuffer)
+ : typedArrayOrArrayBuffer;
+ info(`Loading buffer: [${typedArray.byteOffset}, ${typedArray.byteOffset + typedArray.byteLength})`);
+ var beforeBuffered = timeRangeToString(sb.buffered);
+ return new Promise(function(resolve, reject) {
+ once(sb, 'update').then(function() {
+ var afterBuffered = timeRangeToString(sb.buffered);
+ info(`SourceBuffer buffered ranges grew from ${beforeBuffered} to ${afterBuffered}`);
+ resolve();
+ });
+ sb.appendBuffer(typedArray);
+ });
+}
+
+function fetchAndLoad(sb, prefix, chunks, suffix) {
+
+ // Fetch the buffers in parallel.
+ var buffers = {};
+ var fetches = [];
+ for (var chunk of chunks) {
+ fetches.push(fetchWithXHR(prefix + chunk + suffix).then(((c, x) => buffers[c] = x).bind(null, chunk)));
+ }
+
+ // Load them in series, as required per spec.
+ return Promise.all(fetches).then(function() {
+ var rv = Promise.resolve();
+ for (var chunk of chunks) {
+ rv = rv.then(loadSegment.bind(null, sb, buffers[chunk]));
+ }
+ return rv;
+ });
+}
+
+//Register timeout function to dump debugging logs.
+SimpleTest.registerTimeoutFunction(function() {
+ for (var v of document.getElementsByTagName("video")) {
+ v.mozDumpDebugInfo();
+ }
+ for (var a of document.getElementsByTagName("audio")) {
+ a.mozDumpDebugInfo();
+ }
+});
+
+function waitUntilTime(target, targetTime) {
+ return new Promise(function(resolve, reject) {
+ target.addEventListener("waiting", function onwaiting() {
+ info("Got a waiting event at " + target.currentTime);
+ if (target.currentTime >= targetTime) {
+ ok(true, "Reached target time of: " + targetTime);
+ target.removeEventListener("waiting", onwaiting);
+ resolve();
+ }
+ });
+ });
+}