From e75505aa44b4100503e4bf42be0a666bb446dcc9 Mon Sep 17 00:00:00 2001 From: theodab Date: Tue, 27 Feb 2024 12:07:25 -0800 Subject: [PATCH] fix: Fix waiting for empty init datas (#6292) Issue #6228 --- lib/media/drm_engine.js | 9 ++++++--- test/media/drm_engine_unit.js | 16 ++++++++++++++++ test/test/externs/jasmine.js | 3 ++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/lib/media/drm_engine.js b/lib/media/drm_engine.js index 5370432e96..3aeab3e1a8 100644 --- a/lib/media/drm_engine.js +++ b/lib/media/drm_engine.js @@ -697,9 +697,12 @@ shaka.media.DrmEngine = class { initDataOverride.initDataType, initDataOverride.initData); } - // If we have no sessions, we need to resolve the promise right now or else - // it will never get resolved. - if (!initDatas.length) { + // If there were no sessions to load, we need to resolve the promise right + // now or else it will never get resolved. + // We determine this by checking areAllSessionsLoaded_, rather than checking + // the number of initDatas, since the newInitData method can reject init + // datas in some circumstances. + if (this.areAllSessionsLoaded_()) { this.allSessionsLoaded_.resolve(); } diff --git a/test/media/drm_engine_unit.js b/test/media/drm_engine_unit.js index e333f5a437..b2d03c4161 100644 --- a/test/media/drm_engine_unit.js +++ b/test/media/drm_engine_unit.js @@ -163,6 +163,22 @@ describe('DrmEngine', () => { }); }); + + describe('createOrLoad', () => { + it('does not hang when given empty init data for offline', async () => { + tweakDrmInfos((drmInfos) => { + // An empty uint8array, like we make for fairplay content. + drmInfos[0].initData = [ + {initData: new Uint8Array(0), initDataType: 'cenc', keyId: null}, + ]; + }); + await drmEngine.initForStorage( + manifest.variants, /* usePersistentLicenses= */ false); + await drmEngine.createOrLoad(); + expect(drmEngine.initialized()).toBe(true); + }, /* timeout= */ 1000); + }); + describe('init', () => { it('stops on first available key system', async () => { // Accept both drm.abc and drm.def. Only one can be chosen. diff --git a/test/test/externs/jasmine.js b/test/test/externs/jasmine.js index 67d8116962..ab13382939 100644 --- a/test/test/externs/jasmine.js +++ b/test/test/externs/jasmine.js @@ -467,8 +467,9 @@ var xdescribe = function(name, callback) {}; /** * @param {string} name * @param {jasmine.Callback} callback + * @param {number=} timeout */ -var it = function(name, callback) {}; +var it = function(name, callback, timeout) {}; /**