diff --git a/.eslintignore b/.eslintignore index e183abefe829..c42d5279fc18 100644 --- a/.eslintignore +++ b/.eslintignore @@ -11,6 +11,10 @@ # Exclude expected objdirs. obj*/ +# dom/ exclusions which should be removed (aka ESLint enabled) +dom/media/test/ +!dom/media/test/marionette/yttest/*.js + # build/ third-party code build/pgo/js-input/ @@ -155,8 +159,6 @@ dom/encoding/test/file_utf16_be_bom.js dom/encoding/test/file_utf16_le_bom.js # Not parsable -dom/media/test/marionette/yttest/duration_test.js -dom/media/test/marionette/yttest/until_end_test.js dom/tests/mochitest/general/test_focusrings.xul dom/html/test/test_bug677658.html diff --git a/dom/media/test/AutoplayTestUtils.js b/dom/media/test/AutoplayTestUtils.js index 5f34f15b61b8..125a3244390d 100644 --- a/dom/media/test/AutoplayTestUtils.js +++ b/dom/media/test/AutoplayTestUtils.js @@ -1,5 +1,3 @@ -/* import-globals-from manifest.js */ - function playAndPostResult(muted, parent_window) { let element = document.createElement("video"); element.preload = "auto"; @@ -9,13 +7,13 @@ function playAndPostResult(muted, parent_window) { document.body.appendChild(element); let allowedToPlay = element.allowedToPlay; element.play().then( - () => { - parent_window.postMessage({ played: true, allowedToPlay }, "*"); - }, - () => { - parent_window.postMessage({ played: false, allowedToPlay }, "*"); - } - ); + () => { + parent_window.postMessage({played: true, allowedToPlay}, "*"); + }, + () => { + parent_window.postMessage({played: false, allowedToPlay}, "*"); + } + ); } function nextWindowMessage() { @@ -32,15 +30,10 @@ const autoplayPermission = "autoplay-media"; async function pushAutoplayAllowedPermission() { return new Promise((resolve, reject) => { - SpecialPowers.pushPermissions( - [ - { - type: autoplayPermission, - allow: true, - context: document, - }, - ], - resolve - ); + SpecialPowers.pushPermissions([{ + 'type': autoplayPermission, + 'allow': true, + 'context': document + }], resolve); }); } diff --git a/dom/media/test/background_video.js b/dom/media/test/background_video.js index 963aa1023bbc..66b36e58a9e8 100644 --- a/dom/media/test/background_video.js +++ b/dom/media/test/background_video.js @@ -1,35 +1,33 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// This file expects manager to be defined in the global scope. -/* global manager */ -/* import-globals-from manifest.js */ +/* jshint esversion: 6, -W097 */ +/* globals SimpleTest, SpecialPowers, document, info, is, manager, ok */ "use strict"; function startTest(test) { info(test.desc); SimpleTest.waitForExplicitFinish(); - SpecialPowers.pushPrefEnv({ set: test.prefs }, () => { + SpecialPowers.pushPrefEnv({ 'set': test.prefs }, () => { manager.runTests(test.tests, test.runTest); }); } function nextVideoEnded(video) { - return nextEvent(video, "ended"); + return nextEvent(video, 'ended'); } function nextVideoPlaying(video) { - return nextEvent(video, "playing"); + return nextEvent(video, 'playing'); } function nextVideoResumes(video) { - return nextEvent(video, "mozexitvideosuspend"); + return nextEvent(video, 'mozexitvideosuspend'); } function nextVideoSuspends(video) { - return nextEvent(video, "mozentervideosuspend"); + return nextEvent(video, 'mozentervideosuspend'); } /** @@ -38,14 +36,10 @@ function nextVideoSuspends(video) { */ function appendVideoToDoc(url, token, width, height) { // Default size of (160, 120) is used by other media tests. - if (width === undefined) { - width = 160; - } - if (height === undefined) { - height = (3 * width) / 4; - } + if (width === undefined) { width = 160; } + if (height === undefined) { height = 3 * width / 4; } - let v = document.createElement("video"); + let v = document.createElement('video'); v.token = token; v.width = width; v.height = height; @@ -56,14 +50,10 @@ function appendVideoToDoc(url, token, width, height) { function appendVideoToDocWithoutLoad(token, width, height) { // Default size of (160, 120) is used by other media tests. - if (width === undefined) { - width = 160; - } - if (height === undefined) { - height = (3 * width) / 4; - } + if (width === undefined) { width = 160; } + if (height === undefined) { height = 3*width/4; } - let v = document.createElement("video"); + let v = document.createElement('video'); v.token = token; document.body.appendChild(v); v.width = width; @@ -74,13 +64,7 @@ function appendVideoToDocWithoutLoad(token, width, height) { function loadAndWaitUntilLoadedmetadata(video, url, preloadType = "metadata") { return new Promise((resolve, reject) => { video.preload = preloadType; - video.addEventListener( - "loadedmetadata", - () => { - resolve(); - }, - true - ); + video.addEventListener("loadedmetadata", () => { resolve(); }, true); video.src = url; }); } @@ -111,9 +95,7 @@ function waitUntilVisible(video) { * @returns {Promise} Promise that is resolved when video 'playing' event fires. */ function waitUntilPlaying(video) { - var p = once(video, "playing", () => { - ok(true, `${video.token} played.`); - }); + var p = once(video, 'playing', () => { ok(true, `${video.token} played.`); }); Log(video.token, "Start playing"); video.play(); return p; @@ -130,9 +112,7 @@ function waitUntilEnded(video) { return Promise.resolve(); } - return once(video, "ended", () => { - ok(true, `${video.token} ended`); - }); + return once(video, 'ended', () => { ok(true, `${video.token} ended`); }); } /** @@ -141,10 +121,10 @@ function waitUntilEnded(video) { * suspend timer. */ function testSuspendTimerStartedWhenHidden(video) { - var p = once(video, "mozstartvideosuspendtimer").then(() => { - ok(true, `${video.token} suspend begins`); + var p = once(video, 'mozstartvideosuspendtimer').then(() => { + ok(true, `${video.token} suspend begins`) }); - Log(video.token, "Set Hidden"); + Log(video.token, 'Set Hidden'); video.setVisible(false); return p; } @@ -154,7 +134,7 @@ function testSuspendTimerStartedWhenHidden(video) { * @returns {Promise} Promise that is resolved when video decode suspends. */ function testVideoSuspendsWhenHidden(video) { - let p = once(video, "mozentervideosuspend").then(() => { + let p = once(video, 'mozentervideosuspend').then(() => { ok(true, `${video.token} suspends`); }); Log(video.token, "Set hidden"); @@ -167,7 +147,7 @@ function testVideoSuspendsWhenHidden(video) { * @returns {Promise} Promise that is resolved when video decode resumes. */ function testVideoResumesWhenShown(video) { - var p = once(video, "mozexitvideosuspend").then(() => { + var p = once(video, 'mozexitvideosuspend').then(() => { ok(true, `${video.token} resumes`); }); Log(video.token, "Set visible"); @@ -180,7 +160,7 @@ function testVideoResumesWhenShown(video) { * @returns {Promise} Promise that is resolved when video decode resumes. */ function testVideoOnlySeekCompletedWhenShown(video) { - var p = once(video, "mozvideoonlyseekcompleted").then(() => { + var p = once(video, 'mozvideoonlyseekcompleted').then(() => { ok(true, `${video.token} resumes`); }); Log(video.token, "Set visible"); @@ -194,12 +174,8 @@ function testVideoOnlySeekCompletedWhenShown(video) { */ function checkVideoDoesntSuspend(video) { let p = Promise.race([ - waitUntilEnded(video).then(() => { - ok(true, `${video.token} ended before decode was suspended`); - }), - once(video, "mozentervideosuspend", () => { - Promise.reject(new Error(`${video.token} suspended`)); - }), + waitUntilEnded(video).then(() => { ok(true, `${video.token} ended before decode was suspended`) }), + once(video, 'mozentervideosuspend', () => { Promise.reject(new Error(`${video.token} suspended`)) }) ]); Log(video.token, "Set hidden."); video.setVisible(false); @@ -214,7 +190,7 @@ function checkVideoDoesntSuspend(video) { function waitTil(video, time) { Log(video.token, `Waiting for time to reach ${time}s`); return new Promise(resolve => { - video.addEventListener("timeupdate", function timeUpdateEvent() { + video.addEventListener('timeupdate', function timeUpdateEvent() { if (video.currentTime > time) { video.removeEventListener(name, timeUpdateEvent); resolve(); diff --git a/dom/media/test/can_play_type_dash.js b/dom/media/test/can_play_type_dash.js index b4760545db7a..ec5764be23dd 100644 --- a/dom/media/test/can_play_type_dash.js +++ b/dom/media/test/can_play_type_dash.js @@ -11,10 +11,10 @@ function check_dash(v, enabled) { check("application/dash+xml; codecs=vorbis", "probably"); check("application/dash+xml; codecs=vorbis,vp8", "probably"); check("application/dash+xml; codecs=vorbis,vp8.0", "probably"); - check('application/dash+xml; codecs="vorbis,vp8"', "probably"); - check('application/dash+xml; codecs="vorbis,vp8.0"', "probably"); - check('application/dash+xml; codecs="vp8, vorbis"', "probably"); - check('application/dash+xml; codecs="vp8.0, vorbis"', "probably"); + check("application/dash+xml; codecs=\"vorbis,vp8\"", "probably"); + check("application/dash+xml; codecs=\"vorbis,vp8.0\"", "probably"); + check("application/dash+xml; codecs=\"vp8, vorbis\"", "probably"); + check("application/dash+xml; codecs=\"vp8.0, vorbis\"", "probably"); check("application/dash+xml; codecs=vp8", "probably"); check("application/dash+xml; codecs=vp8.0", "probably"); diff --git a/dom/media/test/can_play_type_ogg.js b/dom/media/test/can_play_type_ogg.js index c03f8b2d3efd..8f03b96aeb5e 100644 --- a/dom/media/test/can_play_type_ogg.js +++ b/dom/media/test/can_play_type_ogg.js @@ -1,3 +1,4 @@ + function check_ogg(v, enabled, finish) { function check(type, expected) { is(v.canPlayType(type), enabled ? expected : "", type); @@ -14,7 +15,7 @@ function check_ogg(v, enabled, finish) { check("audio/ogg; codecs=vorbis", "probably"); check("video/ogg; codecs=vorbis", "probably"); check("video/ogg; codecs=vorbis,theora", "probably"); - check('video/ogg; codecs="vorbis, theora"', "probably"); + check("video/ogg; codecs=\"vorbis, theora\"", "probably"); check("video/ogg; codecs=theora", "probably"); resolve(); @@ -24,35 +25,33 @@ function check_ogg(v, enabled, finish) { // Verify Opus support function verify_opus_support() { return new Promise(function(resolve, reject) { - var OpusEnabled = SpecialPowers.getBoolPref( - "media.opus.enabled", - undefined - ); + var OpusEnabled = undefined; + try { + OpusEnabled = SpecialPowers.getBoolPref("media.opus.enabled"); + } catch (ex) { + // SpecialPowers failed, perhaps because Opus isn't compiled in + console.log("media.opus.enabled pref not found; skipping Opus validation"); + } if (OpusEnabled != undefined) { resolve(); } else { - console.log( - "media.opus.enabled pref not found; skipping Opus validation" - ); reject(); } }); } function opus_enable() { - return SpecialPowers.pushPrefEnv({ - set: [["media.opus.enabled", true]], - }).then(function() { - check("audio/ogg; codecs=opus", "probably"); - }); + return SpecialPowers.pushPrefEnv({"set": [['media.opus.enabled', true]]}) + .then(function() { + check("audio/ogg; codecs=opus", "probably"); + }); } function opus_disable() { - return SpecialPowers.pushPrefEnv({ - set: [["media.opus.enabled", false]], - }).then(function() { - check("audio/ogg; codecs=opus", ""); - }); + return SpecialPowers.pushPrefEnv({"set": [['media.opus.enabled', false]]}) + .then(function() { + check("audio/ogg; codecs=opus", ""); + }); } function unspported_ogg() { @@ -65,8 +64,9 @@ function check_ogg(v, enabled, finish) { } basic_test() - .then(verify_opus_support) - .then(opus_enable) - .then(opus_disable) - .then(unspported_ogg, unspported_ogg); + .then(verify_opus_support) + .then(opus_enable) + .then(opus_disable) + .then(unspported_ogg, unspported_ogg); + } diff --git a/dom/media/test/can_play_type_wave.js b/dom/media/test/can_play_type_wave.js index 9c76eebbe109..4a2a48f42b42 100644 --- a/dom/media/test/can_play_type_wave.js +++ b/dom/media/test/can_play_type_wave.js @@ -15,15 +15,15 @@ function check_wave(v, enabled) { check("audio/wave; codecs=7", "probably"); // "no codecs" should be supported, I guess check("audio/wave; codecs=", "maybe"); - check('audio/wave; codecs=""', "maybe"); + check("audio/wave; codecs=\"\"", "maybe"); // Unsupported Wave codecs check("audio/wave; codecs=0", ""); check("audio/wave; codecs=2", ""); check("audio/wave; codecs=xyz,1", ""); check("audio/wave; codecs=1,xyz", ""); - check('audio/wave; codecs="xyz, 1"', ""); + check("audio/wave; codecs=\"xyz, 1\"", ""); // empty codec names check("audio/wave; codecs=,", ""); - check('audio/wave; codecs="0, 1,"', ""); + check("audio/wave; codecs=\"0, 1,\"", ""); } diff --git a/dom/media/test/can_play_type_webm.js b/dom/media/test/can_play_type_webm.js index ee57da66c6e2..8965ce63ce54 100644 --- a/dom/media/test/can_play_type_webm.js +++ b/dom/media/test/can_play_type_webm.js @@ -1,18 +1,14 @@ async function check_webm(v, enabled) { function check(type, expected) { - is( - v.canPlayType(type), - enabled ? expected : "", - type + "='" + expected + "'" - ); + is(v.canPlayType(type), enabled ? expected : "", type + "='" + expected + "'"); } // WebM types check("video/webm", "maybe"); check("audio/webm", "maybe"); - var video = ["vp8", "vp8.0", "vp9", "vp9.0"]; - var audio = ["vorbis", "opus"]; + var video = ['vp8', 'vp8.0', 'vp9', 'vp9.0']; + var audio = ['vorbis', 'opus']; audio.forEach(function(acodec) { check("audio/webm; codecs=" + acodec, "probably"); @@ -21,8 +17,8 @@ async function check_webm(v, enabled) { video.forEach(function(vcodec) { check("video/webm; codecs=" + vcodec, "probably"); audio.forEach(function(acodec) { - check('video/webm; codecs="' + vcodec + ", " + acodec + '"', "probably"); - check('video/webm; codecs="' + acodec + ", " + vcodec + '"', "probably"); + check("video/webm; codecs=\"" + vcodec + ", " + acodec + "\"", "probably"); + check("video/webm; codecs=\"" + acodec + ", " + vcodec + "\"", "probably"); }); }); @@ -31,9 +27,17 @@ async function check_webm(v, enabled) { check("video/webm; codecs=xyz,vorbis", ""); check("video/webm; codecs=vorbis,xyz", ""); - await SpecialPowers.pushPrefEnv({ set: [["media.av1.enabled", true]] }); - check('video/webm; codecs="av1"', "probably"); + function getPref(name) { + var pref = false; + try { + pref = SpecialPowers.getBoolPref(name); + } catch(ex) { } + return pref; + } - await SpecialPowers.pushPrefEnv({ set: [["media.av1.enabled", false]] }); - check('video/webm; codecs="av1"', ""); + await SpecialPowers.pushPrefEnv({"set": [["media.av1.enabled", true]]}); + check("video/webm; codecs=\"av1\"", "probably"); + + await SpecialPowers.pushPrefEnv({"set": [["media.av1.enabled", false]]}); + check("video/webm; codecs=\"av1\"", ""); } diff --git a/dom/media/test/chromeHelper.js b/dom/media/test/chromeHelper.js index ff83660fe2f7..cac77d51d5cb 100644 --- a/dom/media/test/chromeHelper.js +++ b/dom/media/test/chromeHelper.js @@ -4,20 +4,16 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -/* eslint-env mozilla/frame-script */ - "use strict"; -// eslint-disable-next-line mozilla/use-services -const dirSvc = Cc["@mozilla.org/file/directory_service;1"].getService( - Ci.nsIProperties -); +const dirSvc = Cc["@mozilla.org/file/directory_service;1"]. + getService(Ci.nsIProperties); -addMessageListener("media-test:getcwd", () => { +addMessageListener('media-test:getcwd', () => { let cwd; try { cwd = dirSvc.get("CurWorkD", Ci.nsIFile).path; } finally { - sendAsyncMessage("media-test:cwd", cwd); + sendAsyncMessage('media-test:cwd', cwd); } }); diff --git a/dom/media/test/cloneElementVisually_helpers.js b/dom/media/test/cloneElementVisually_helpers.js index ab81aad9ed67..77cffc499de5 100644 --- a/dom/media/test/cloneElementVisually_helpers.js +++ b/dom/media/test/cloneElementVisually_helpers.js @@ -1,7 +1,5 @@ -const TEST_VIDEO_1 = - "http://mochi.test:8888/tests/dom/media/test/bipbop_225w_175kbps.mp4"; -const TEST_VIDEO_2 = - "http://mochi.test:8888/tests/dom/media/test/pixel_aspect_ratio.mp4"; +const TEST_VIDEO_1 = "http://mochi.test:8888/tests/dom/media/test/bipbop_225w_175kbps.mp4"; +const TEST_VIDEO_2 = "http://mochi.test:8888/tests/dom/media/test/pixel_aspect_ratio.mp4"; const LONG_VIDEO = "http://mochi.test:8888/tests/dom/media/test/gizmo.mp4"; /** @@ -11,11 +9,11 @@ const LONG_VIDEO = "http://mochi.test:8888/tests/dom/media/test/gizmo.mp4"; async function setup() { await SpecialPowers.pushPrefEnv({ set: [ - ["media.test.video-suspend", true], - ["media.suspend-bkgnd-video.enabled", true], - ["media.suspend-bkgnd-video.delay-ms", 500], - ["media.dormant-on-pause-timeout-ms", 0], - ["media.cloneElementVisually.testing", true], + [ "media.test.video-suspend", true ], + [ "media.suspend-bkgnd-video.enabled", true ], + [ "media.suspend-bkgnd-video.delay-ms", 500 ], + [ "media.dormant-on-pause-timeout-ms", 0 ], + [ "media.cloneElementVisually.testing", true ], ], }); @@ -91,19 +89,11 @@ async function assertVideosMatch(video1, video2) { let video2Frame = captureFrameImageData(video2); let left = document.getElementById("left"); - let leftCtx = getWrappedScaledCanvasContext( - left, - video1Frame.width, - video1Frame.height - ); + let leftCtx = getWrappedScaledCanvasContext(left, video1Frame.width, video1Frame.height); leftCtx.putImageData(video1Frame, 0, 0); let right = document.getElementById("right"); - let rightCtx = getWrappedScaledCanvasContext( - right, - video2Frame.width, - video2Frame.height - ); + let rightCtx = getWrappedScaledCanvasContext(right, video2Frame.width, video2Frame.height); rightCtx.putImageData(video2Frame, 0, 0); if (video1Frame.data.length != video2Frame.data.length) { @@ -220,7 +210,7 @@ async function ensureVideoSuspendable(video) { video.setVisible(false); await suspendPromise; ok(true, "Suspended after the video was made invisible."); - video.setVisible(true); + video.setVisible(true) ok(!video.hasSuspendTaint(), "Should still be suspendable."); @@ -230,3 +220,5 @@ async function ensureVideoSuspendable(video) { ok(true, "Shutdown decoder after the video was paused."); await video.play(); } + + diff --git a/dom/media/test/eme.js b/dom/media/test/eme.js index 4fac0440b372..5a062800de76 100644 --- a/dom/media/test/eme.js +++ b/dom/media/test/eme.js @@ -1,14 +1,10 @@ -/* import-globals-from manifest.js */ - const CLEARKEY_KEYSYSTEM = "org.w3.clearkey"; -const gCencMediaKeySystemConfig = [ - { - initDataTypes: ["cenc"], - videoCapabilities: [{ contentType: "video/mp4" }], - audioCapabilities: [{ contentType: "audio/mp4" }], - }, -]; +const gCencMediaKeySystemConfig = [{ + initDataTypes: ['cenc'], + videoCapabilities: [{ contentType: 'video/mp4' }], + audioCapabilities: [{ contentType: 'audio/mp4' }], +}]; function IsMacOSSnowLeopardOrEarlier() { var re = /Mac OS X (\d+)\.(\d+)/; @@ -21,21 +17,23 @@ function IsMacOSSnowLeopardOrEarlier() { return major == 10 && minor <= 6; } -function bail(message) { +function bail(message) +{ return function(err) { if (err) { - message += "; " + String(err); + message += "; " + String(err) } ok(false, message); if (err) { info(String(err)); } SimpleTest.finish(); - }; + } } -function ArrayBufferToString(arr) { - var str = ""; +function ArrayBufferToString(arr) +{ + var str = ''; var view = new Uint8Array(arr); for (var i = 0; i < view.length; i++) { str += String.fromCharCode(view[i]); @@ -43,7 +41,8 @@ function ArrayBufferToString(arr) { return str; } -function StringToArrayBuffer(str) { +function StringToArrayBuffer(str) +{ var arr = new ArrayBuffer(str.length); var view = new Uint8Array(arr); for (var i = 0; i < str.length; i++) { @@ -52,15 +51,16 @@ function StringToArrayBuffer(str) { return arr; } -function StringToHex(str) { +function StringToHex(str){ var res = ""; for (var i = 0; i < str.length; ++i) { - res += ("0" + str.charCodeAt(i).toString(16)).slice(-2); + res += ("0" + str.charCodeAt(i).toString(16)).slice(-2); } return res; } -function Base64ToHex(str) { +function Base64ToHex(str) +{ var bin = window.atob(str.replace(/-/g, "+").replace(/_/g, "/")); var res = ""; for (var i = 0; i < bin.length; i++) { @@ -69,56 +69,46 @@ function Base64ToHex(str) { return res; } -function HexToBase64(hex) { +function HexToBase64(hex) +{ var bin = ""; for (var i = 0; i < hex.length; i += 2) { bin += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); } - return window - .btoa(bin) - .replace(/=/g, "") - .replace(/\+/g, "-") - .replace(/\//g, "_"); + return window.btoa(bin).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"); } -function TimeRangesToString(trs) { +function TimeRangesToString(trs) +{ var l = trs.length; - if (l === 0) { - return "-"; - } + if (l === 0) { return "-"; } var s = ""; var i = 0; for (;;) { s += trs.start(i) + "-" + trs.end(i); - if (++i === l) { - return s; - } + if (++i === l) { return s; } s += ","; } } -function SourceBufferToString(sb) { - return ( - "SourceBuffer{" + - "AppendMode=" + - (sb.AppendMode || "-") + - ", updating=" + - (sb.updating ? "true" : "false") + - ", buffered=" + - TimeRangesToString(sb.buffered) + - ", audioTracks=" + - (sb.audioTracks ? sb.audioTracks.length : "-") + - ", videoTracks=" + - (sb.videoTracks ? sb.videoTracks.length : "-") + - "}" - ); +function SourceBufferToString(sb) +{ + return ("SourceBuffer{" + + "AppendMode=" + (sb.AppendMode || "-") + + ", updating=" + (sb.updating ? "true" : "false") + + ", buffered=" + TimeRangesToString(sb.buffered) + + ", audioTracks=" + (sb.audioTracks ? sb.audioTracks.length : "-") + + ", videoTracks=" + (sb.videoTracks ? sb.videoTracks.length : "-") + + "}"); } -function SourceBufferListToString(sbl) { +function SourceBufferListToString(sbl) +{ return "SourceBufferList[" + sbl.map(SourceBufferToString).join(", ") + "]"; } -function GenerateClearKeyLicense(licenseRequest, keyStore) { +function GenerateClearKeyLicense(licenseRequest, keyStore) +{ var msgStr = ArrayBufferToString(licenseRequest); var msg = JSON.parse(msgStr); @@ -130,51 +120,47 @@ function GenerateClearKeyLicense(licenseRequest, keyStore) { if (key) { keys.push({ - kty: "oct", - kid: id64, - k: HexToBase64(key), + "kty": "oct", + "kid": id64, + "k": HexToBase64(key) }); } } - return new TextEncoder().encode( - JSON.stringify({ - keys, - type: msg.type || "temporary", - }) - ); + return new TextEncoder().encode(JSON.stringify({ + "keys" : keys, + "type" : msg.type || "temporary" + })); } function UpdateSessionFunc(test, token, sessionType, resolve, reject) { return function(ev) { var license = GenerateClearKeyLicense(ev.message, test.keys); - Log( - token, - "sending update message to CDM: " + new TextDecoder().decode(license) - ); - ev.target - .update(license) - .then(function() { - Log(token, "MediaKeySession update ok!"); - resolve(ev.target); - }) - .catch(function(reason) { - reject(`${token} MediaKeySession update failed: ${reason}`); - }); - }; + Log(token, "sending update message to CDM: " + (new TextDecoder().decode(license))); + ev.target.update(license).then(function() { + Log(token, "MediaKeySession update ok!"); + resolve(ev.target); + }).catch(function(reason) { + reject(`${token} MediaKeySession update failed: ${reason}`); + }); + } } -function MaybeCrossOriginURI(test, uri) { +function MaybeCrossOriginURI(test, uri) +{ if (test.crossOrigin) { return "https://example.com:443/tests/dom/media/test/allowed.sjs?" + uri; + } else { + return uri; } - return uri; } -function AppendTrack(test, ms, track, token) { +function AppendTrack(test, ms, track, token) +{ return new Promise(function(resolve, reject) { var sb; var curFragment = 0; + var resolved = false; var fragments = track.fragments; var fragmentFile; @@ -182,6 +168,7 @@ function AppendTrack(test, ms, track, token) { if (curFragment >= fragments.length) { Log(token, track.name + ": end of track"); resolve(); + resolved = true; return; } @@ -192,10 +179,7 @@ function AppendTrack(test, ms, track, token) { req.responseType = "arraybuffer"; req.addEventListener("load", function() { - Log( - token, - track.name + ": fetch of " + fragmentFile + " complete, appending" - ); + Log(token, track.name + ": fetch of " + fragmentFile + " complete, appending"); sb.appendBuffer(new Uint8Array(req.response)); }); @@ -206,26 +190,14 @@ function AppendTrack(test, ms, track, token) { reject(`${token} - ${track.name}: aborted fetching ${fragmentFile}`); }); - Log( - token, - track.name + - ": addNextFragment() fetching next fragment " + - fragmentFile - ); + Log(token, track.name + ": addNextFragment() fetching next fragment " + fragmentFile); req.send(null); } Log(token, track.name + ": addSourceBuffer(" + track.type + ")"); sb = ms.addSourceBuffer(track.type); sb.addEventListener("updateend", function() { - Log( - token, - track.name + - ": updateend for " + - fragmentFile + - ", " + - SourceBufferToString(sb) - ); + Log(token, track.name + ": updateend for " + fragmentFile + ", " + SourceBufferToString(sb)); addNextFragment(); }); @@ -235,7 +207,8 @@ function AppendTrack(test, ms, track, token) { //Returns a promise that is resolved when the media element is ready to have //its play() function called; when it's loaded MSE fragments. -function LoadTest(test, elem, token, endOfStream = true) { +function LoadTest(test, elem, token, endOfStream = true) +{ if (!test.tracks) { ok(false, token + " test does not have a tracks list"); return Promise.reject(); @@ -245,27 +218,19 @@ function LoadTest(test, elem, token, endOfStream = true) { elem.src = URL.createObjectURL(ms); elem.crossOrigin = test.crossOrigin || false; - return new Promise(function(resolve, reject) { - ms.addEventListener( - "sourceopen", - function() { - Log(token, "sourceopen"); - Promise.all( - test.tracks.map(function(track) { - return AppendTrack(test, ms, track, token); - }) - ) - .then(function() { - Log(token, "Tracks loaded, calling MediaSource.endOfStream()"); - if (endOfStream) { - ms.endOfStream(); - } - resolve(); - }) - .catch(reject); - }, - { once: true } - ); + return new Promise(function (resolve, reject) { + ms.addEventListener("sourceopen", function () { + Log(token, "sourceopen"); + Promise.all(test.tracks.map(function(track) { + return AppendTrack(test, ms, track, token); + })).then(function() { + Log(token, "Tracks loaded, calling MediaSource.endOfStream()"); + if (endOfStream) { + ms.endOfStream(); + } + resolve(); + }).catch(reject); + }, {once: true}); }); } @@ -283,7 +248,7 @@ function EMEPromise() { * or will be rejected with a string that describes the failure. */ function CreateMediaKeys(v, test, token) { - let p = new EMEPromise(); + let p = new EMEPromise; function streamType(type) { var x = test.tracks.find(o => o.name == type); @@ -293,24 +258,21 @@ function CreateMediaKeys(v, test, token) { function onencrypted(ev) { var options = { initDataTypes: [ev.initDataType] }; if (streamType("video")) { - options.videoCapabilities = [{ contentType: streamType("video") }]; + options.videoCapabilities = [{contentType: streamType("video")}]; } if (streamType("audio")) { - options.audioCapabilities = [{ contentType: streamType("audio") }]; + options.audioCapabilities = [{contentType: streamType("audio")}]; } - navigator.requestMediaKeySystemAccess(CLEARKEY_KEYSYSTEM, [options]).then( - keySystemAccess => { - keySystemAccess - .createMediaKeys() - .then(p.resolve, () => - p.reject(`${token} Failed to create MediaKeys object.`) - ); - }, - () => p.reject(`${token} Failed to request key system access.`) - ); + navigator.requestMediaKeySystemAccess(CLEARKEY_KEYSYSTEM, [options]) + .then(keySystemAccess => { + keySystemAccess.createMediaKeys().then( + p.resolve, + () => p.reject(`${token} Failed to create MediaKeys object.`) + ); + }, () => p.reject(`${token} Failed to request key system access.`)); } - v.addEventListener("encrypted", onencrypted, { once: true }); + v.addEventListener("encrypted", onencrypted, {once: true}); return p.promise; } @@ -320,13 +282,14 @@ function CreateMediaKeys(v, test, token) { * with a string that describes the failure. */ function CreateAndSetMediaKeys(v, test, token) { - let p = new EMEPromise(); + let p = new EMEPromise; CreateMediaKeys(v, test, token).then(mediaKeys => { - v.setMediaKeys(mediaKeys).then(p.resolve, () => - p.reject(`${token} Failed to set MediaKeys on