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);