From 0201f2b7604e76062b68b8b1acbf098faf71d019 Mon Sep 17 00:00:00 2001 From: Joey Parrish Date: Mon, 10 Jan 2022 16:11:47 -0800 Subject: [PATCH] fix: Fix MediaCapabilities polyfill on Safari Fixes #3696 Fixes #3530 Change-Id: I2f2e248c9001e10013eb4b03af6b9ef49f28dc6c --- lib/polyfill/media_capabilities.js | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/lib/polyfill/media_capabilities.js b/lib/polyfill/media_capabilities.js index 91904f5d85..428f463f33 100644 --- a/lib/polyfill/media_capabilities.js +++ b/lib/polyfill/media_capabilities.js @@ -24,8 +24,6 @@ shaka.polyfill.MediaCapabilities = class { * @export */ static install() { - shaka.log.debug('MediaCapabilities: install'); - // Since MediaCapabilities is not fully supported on Chromecast yet, we // should always install polyfill for Chromecast. // TODO: re-evaluate MediaCapabilities in the future versions of Chromecast. @@ -40,17 +38,26 @@ shaka.polyfill.MediaCapabilities = class { // TODO: re-evaluate MediaCapabilities in the future versions of PS5 // Browsers. if (!shaka.util.Platform.isChromecast() && - !shaka.util.Platform.isApple() && - !shaka.util.Platform.isPS5() && - navigator.mediaCapabilities) { - shaka.log.debug( + !shaka.util.Platform.isApple() && + !shaka.util.Platform.isPS5() && + navigator.mediaCapabilities) { + shaka.log.info( 'MediaCapabilities: Native mediaCapabilities support found.'); return; } + shaka.log.info('MediaCapabilities: install'); + if (!navigator.mediaCapabilities) { navigator.mediaCapabilities = /** @type {!MediaCapabilities} */ ({}); } + + // Keep the patched MediaCapabilities object from being garbage-collected in + // Safari. + // See https://github.com/google/shaka-player/issues/3696#issuecomment-1009472718 + shaka.polyfill.MediaCapabilities.originalMcap = + navigator.mediaCapabilities; + navigator.mediaCapabilities.decodingInfo = shaka.polyfill.MediaCapabilities.decodingInfo_; } @@ -180,6 +187,16 @@ shaka.polyfill.MediaCapabilities = class { } }; +/** + * A copy of the MediaCapabilities instance, to prevent Safari from + * garbage-collecting the polyfilled method on it. We make it public and export + * it to ensure that it is not stripped out by the compiler. + * + * @type {MediaCapabilities} + * @export + */ +shaka.polyfill.MediaCapabilities.originalMcap = null; + // Install at a lower priority than MediaSource polyfill, so that we have // MediaSource available first. shaka.polyfill.register(shaka.polyfill.MediaCapabilities.install, -1);