Skip to content

Commit 0201f2b

Browse files
committed
fix: Fix MediaCapabilities polyfill on Safari
Fixes shaka-project#3696 Fixes shaka-project#3530 Change-Id: I2f2e248c9001e10013eb4b03af6b9ef49f28dc6c
1 parent dfc44cb commit 0201f2b

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

lib/polyfill/media_capabilities.js

+23-6
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ shaka.polyfill.MediaCapabilities = class {
2424
* @export
2525
*/
2626
static install() {
27-
shaka.log.debug('MediaCapabilities: install');
28-
2927
// Since MediaCapabilities is not fully supported on Chromecast yet, we
3028
// should always install polyfill for Chromecast.
3129
// TODO: re-evaluate MediaCapabilities in the future versions of Chromecast.
@@ -40,17 +38,26 @@ shaka.polyfill.MediaCapabilities = class {
4038
// TODO: re-evaluate MediaCapabilities in the future versions of PS5
4139
// Browsers.
4240
if (!shaka.util.Platform.isChromecast() &&
43-
!shaka.util.Platform.isApple() &&
44-
!shaka.util.Platform.isPS5() &&
45-
navigator.mediaCapabilities) {
46-
shaka.log.debug(
41+
!shaka.util.Platform.isApple() &&
42+
!shaka.util.Platform.isPS5() &&
43+
navigator.mediaCapabilities) {
44+
shaka.log.info(
4745
'MediaCapabilities: Native mediaCapabilities support found.');
4846
return;
4947
}
5048

49+
shaka.log.info('MediaCapabilities: install');
50+
5151
if (!navigator.mediaCapabilities) {
5252
navigator.mediaCapabilities = /** @type {!MediaCapabilities} */ ({});
5353
}
54+
55+
// Keep the patched MediaCapabilities object from being garbage-collected in
56+
// Safari.
57+
// See https://github.com/google/shaka-player/issues/3696#issuecomment-1009472718
58+
shaka.polyfill.MediaCapabilities.originalMcap =
59+
navigator.mediaCapabilities;
60+
5461
navigator.mediaCapabilities.decodingInfo =
5562
shaka.polyfill.MediaCapabilities.decodingInfo_;
5663
}
@@ -180,6 +187,16 @@ shaka.polyfill.MediaCapabilities = class {
180187
}
181188
};
182189

190+
/**
191+
* A copy of the MediaCapabilities instance, to prevent Safari from
192+
* garbage-collecting the polyfilled method on it. We make it public and export
193+
* it to ensure that it is not stripped out by the compiler.
194+
*
195+
* @type {MediaCapabilities}
196+
* @export
197+
*/
198+
shaka.polyfill.MediaCapabilities.originalMcap = null;
199+
183200
// Install at a lower priority than MediaSource polyfill, so that we have
184201
// MediaSource available first.
185202
shaka.polyfill.register(shaka.polyfill.MediaCapabilities.install, -1);

0 commit comments

Comments
 (0)