UNPKG

videojs-contrib-eme

Version:

Supports Encrypted Media Extensions for playback of encrypted content in Video.js

281 lines (240 loc) 8.23 kB
import QUnit from 'qunit'; import videojs from 'video.js'; import {standard5July2016} from '../src/eme'; QUnit.module('videojs-contrib-eme eme'); QUnit.test('accepts a license URL as an option', function(assert) { const done = assert.async(); const origXhr = videojs.xhr; const xhrCalls = []; const callbacks = {}; videojs.xhr = (options) => { xhrCalls.push(options); }; navigator.requestMediaKeySystemAccess = (keySystem, options) => { return new Promise((resolve, reject) => { callbacks.requestMediaKeySystemAccess = resolve; }); }; standard5July2016({ video: {}, initDataType: '', initData: '', options: { keySystems: { 'com.widevine.alpha': 'some-url' } } }); const session = new videojs.EventTarget(); callbacks.requestMediaKeySystemAccess({ keySystem: 'com.widevine.alpha', createMediaKeys: () => { return { createSession: () => session }; } }); setTimeout(() => { session.trigger({ type: 'message', message: 'the-message' }); assert.equal(xhrCalls.length, 1, 'made one XHR'); assert.deepEqual(xhrCalls[0], { uri: 'some-url', method: 'POST', responseType: 'arraybuffer', body: 'the-message', headers: { 'Content-type': 'application/octet-stream' } }, 'made request with proper options'); videojs.xhr = origXhr; done(); }); }); QUnit.test('accepts a license URL as property', function(assert) { const done = assert.async(); const origXhr = videojs.xhr; const xhrCalls = []; const callbacks = {}; videojs.xhr = (options) => { xhrCalls.push(options); }; navigator.requestMediaKeySystemAccess = (keySystem, options) => { return new Promise((resolve, reject) => { callbacks.requestMediaKeySystemAccess = resolve; }); }; standard5July2016({ video: {}, initDataType: '', initData: '', options: { keySystems: { 'com.widevine.alpha': { url: 'some-url' } } } }); const session = new videojs.EventTarget(); callbacks.requestMediaKeySystemAccess({ keySystem: 'com.widevine.alpha', createMediaKeys: () => { return { createSession: () => session }; } }); setTimeout(() => { session.trigger({ type: 'message', message: 'the-message' }); assert.equal(xhrCalls.length, 1, 'made one XHR'); assert.deepEqual(xhrCalls[0], { uri: 'some-url', method: 'POST', responseType: 'arraybuffer', body: 'the-message', headers: { 'Content-type': 'application/octet-stream' } }, 'made request with proper options'); videojs.xhr = origXhr; done(); }); }); QUnit.test('5 July 2016 lifecycle', function(assert) { assert.expect(40); let done = assert.async(); let callbacks = {}; let callCounts = { requestMediaKeySystemAccess: 0, getCertificate: 0, getLicense: 0, createSession: 0, keySessionGenerateRequest: 0, keySessionUpdate: 0, createMediaKeys: 0 }; navigator.requestMediaKeySystemAccess = (keySystem, options) => { callCounts.requestMediaKeySystemAccess++; return new Promise((resolve, reject) => { callbacks.requestMediaKeySystemAccess = resolve; }); }; let getCertificate = (emeOptions, callback) => { callCounts.getCertificate++; callbacks.getCertificate = callback; }; let getLicense = (emeOptions, keyMessage, callback) => { callCounts.getLicense++; callbacks.getLicense = callback; }; let setMediaKeys; let video = { setMediaKeys: (mediaKeys) => { setMediaKeys = mediaKeys; } }; let options = { keySystems: { 'org.w3.clearkey': { getCertificate, getLicense } } }; let keySessionEventListeners = {}; let mediaKeys = { createSession: () => { callCounts.createSession++; return { addEventListener: (name, callback) => { keySessionEventListeners[name] = callback; }, generateRequest: () => { callCounts.keySessionGenerateRequest++; return new Promise(() => {}); }, update: () => { callCounts.keySessionUpdate++; } }; } }; let keySystemAccess = { keySystem: 'org.w3.clearkey', createMediaKeys: () => { callCounts.createMediaKeys++; return mediaKeys; } }; standard5July2016({ video, initDataType: '', initData: '', options }); // Step 1: get key system assert.equal(callCounts.requestMediaKeySystemAccess, 1, 'access requested'); assert.equal(callCounts.getCertificate, 0, 'certificate not requested'); assert.equal(callCounts.createMediaKeys, 0, 'media keys not created'); assert.notEqual(mediaKeys, setMediaKeys, 'media keys not yet set'); assert.equal(callCounts.createSession, 0, 'key session not created'); assert.equal(callCounts.keySessionGenerateRequest, 0, 'key session request not made'); assert.equal(callCounts.getLicense, 0, 'license not requested'); assert.equal(callCounts.keySessionUpdate, 0, 'key session not updated'); callbacks.requestMediaKeySystemAccess(keySystemAccess); // requestMediaKeySystemAccess promise resolution setTimeout(() => { // Step 2: get certificate assert.equal(callCounts.requestMediaKeySystemAccess, 1, 'access requested'); assert.equal(callCounts.getCertificate, 1, 'certificate requested'); assert.equal(callCounts.createMediaKeys, 0, 'media keys not created'); assert.notEqual(mediaKeys, setMediaKeys, 'media keys not yet set'); assert.equal(callCounts.createSession, 0, 'key session not created'); assert.equal(callCounts.keySessionGenerateRequest, 0, 'key session request not made'); assert.equal(callCounts.getLicense, 0, 'license not requested'); assert.equal(callCounts.keySessionUpdate, 0, 'key session not updated'); callbacks.getCertificate(null, ''); // getCertificate promise resolution setTimeout(() => { // Step 3: create media keys, set them, and generate key session request assert.equal(callCounts.requestMediaKeySystemAccess, 1, 'access requested'); assert.equal(callCounts.getCertificate, 1, 'certificate requested'); assert.equal(callCounts.createMediaKeys, 1, 'media keys created'); assert.equal(mediaKeys, setMediaKeys, 'media keys set'); assert.equal(callCounts.createSession, 1, 'key session created'); assert.equal(callCounts.keySessionGenerateRequest, 1, 'key session request made'); assert.equal(callCounts.getLicense, 0, 'license not requested'); assert.equal(callCounts.keySessionUpdate, 0, 'key session not updated'); keySessionEventListeners.message({}); // Step 4: get license assert.equal(callCounts.requestMediaKeySystemAccess, 1, 'access requested'); assert.equal(callCounts.getCertificate, 1, 'certificate requested'); assert.equal(callCounts.createMediaKeys, 1, 'media keys created'); assert.equal(mediaKeys, setMediaKeys, 'media keys set'); assert.equal(callCounts.createSession, 1, 'key session created'); assert.equal(callCounts.keySessionGenerateRequest, 1, 'key session request made'); assert.equal(callCounts.getLicense, 1, 'license requested'); assert.equal(callCounts.keySessionUpdate, 0, 'key session not updated'); callbacks.getLicense(); // getLicense promise resolution setTimeout(() => { // Step 5: update key session assert.equal(callCounts.requestMediaKeySystemAccess, 1, 'access requested'); assert.equal(callCounts.getCertificate, 1, 'certificate requested'); assert.equal(callCounts.createMediaKeys, 1, 'media keys created'); assert.equal(mediaKeys, setMediaKeys, 'media keys set'); assert.equal(callCounts.createSession, 1, 'key session created'); assert.equal(callCounts.keySessionGenerateRequest, 1, 'key session request made'); assert.equal(callCounts.getLicense, 1, 'license requested'); assert.equal(callCounts.keySessionUpdate, 1, 'key session updated'); done(); }); }); }); });