Skip to content

Commit

Permalink
fix: Work around override of MediaCapabilities polyfill in Apple brow…
Browse files Browse the repository at this point in the history
…sers (#3668)

See also #3696

Closes #3530

Change-Id: Ied2e644f8a5d170ef70386dc2a39b51fc95a691f
  • Loading branch information
Álvaro Velad Galván authored and joeyparrish committed Oct 12, 2021
1 parent a44e9ab commit 9f553b2
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 20 deletions.
16 changes: 16 additions & 0 deletions externs/media_capabilities.js
@@ -0,0 +1,16 @@
/*! @license
* Shaka Player
* Copyright 2016 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/

/**
* @fileoverview Externs for Shaka MediaCapabilities which were missing in the
* Closure compiler.
*
* @externs
*/


/** @type {MediaCapabilities} */
window.shakaMediaCapabilities;
16 changes: 9 additions & 7 deletions lib/polyfill/media_capabilities.js
Expand Up @@ -39,14 +39,16 @@ shaka.polyfill.MediaCapabilities = class {
navigator.mediaCapabilities) {
shaka.log.debug(
'MediaCapabilities: Native mediaCapabilities support found.');
return;
}

if (!navigator.mediaCapabilities) {
navigator.mediaCapabilities = /** @type {!MediaCapabilities} */ ({});
} else {
if (!navigator.mediaCapabilities) {
navigator.mediaCapabilities = /** @type {!MediaCapabilities} */ ({});
}
navigator.mediaCapabilities.decodingInfo =
shaka.polyfill.MediaCapabilities.decodingInfo_;
}
navigator.mediaCapabilities.decodingInfo =
shaka.polyfill.MediaCapabilities.decodingInfo_;
// Workaround because in Apple browsers there is no way to overwrite
// MediaCapabilities.
window.shakaMediaCapabilities = navigator.mediaCapabilities;
}

/**
Expand Down
4 changes: 2 additions & 2 deletions lib/util/stream_utils.js
Expand Up @@ -333,7 +333,7 @@ shaka.util.StreamUtils = class {
*/
static async filterManifestByMediaCapabilities(
manifest, usePersistentLicenses) {
goog.asserts.assert(navigator.mediaCapabilities,
goog.asserts.assert(window.shakaMediaCapabilities,
'MediaCapabilities should be valid.');

await shaka.util.StreamUtils.getDecodingInfosForVariants(
Expand Down Expand Up @@ -422,7 +422,7 @@ shaka.util.StreamUtils = class {
return;
}

const mediaCapabilities = navigator.mediaCapabilities;
const mediaCapabilities = window.shakaMediaCapabilities;

const operations = [];
const getVariantDecodingInfos = (async (variant, decodingConfig) => {
Expand Down
6 changes: 3 additions & 3 deletions test/media/drm_engine_unit.js
Expand Up @@ -37,7 +37,7 @@ function testDrmEngine(useMediaCapabilities) {
navigator.requestMediaKeySystemAccess;
const originalLogError = shaka.log.error;
const originalBatchTime = shaka.media.DrmEngine.KEY_STATUS_BATCH_TIME;
const originalDecodingInfo = navigator.mediaCapabilities.decodingInfo;
const originalDecodingInfo = window.shakaMediaCapabilities.decodingInfo;

/** @type {!jasmine.Spy} */
let requestMediaKeySystemAccessSpy;
Expand Down Expand Up @@ -88,7 +88,7 @@ function testDrmEngine(useMediaCapabilities) {
navigator.requestMediaKeySystemAccess =
shaka.test.Util.spyFunc(requestMediaKeySystemAccessSpy);
decodingInfoSpy = jasmine.createSpy('decodingInfo');
navigator.mediaCapabilities.decodingInfo =
window.shakaMediaCapabilities.decodingInfo =
shaka.test.Util.spyFunc(decodingInfoSpy);

logErrorSpy = jasmine.createSpy('shaka.log.error');
Expand Down Expand Up @@ -165,7 +165,7 @@ function testDrmEngine(useMediaCapabilities) {

navigator.requestMediaKeySystemAccess =
originalRequestMediaKeySystemAccess;
navigator.mediaCapabilities.decodingInfo = originalDecodingInfo;
window.shakaMediaCapabilities.decodingInfo = originalDecodingInfo;
shaka.log.error = originalLogError;
});

Expand Down
10 changes: 5 additions & 5 deletions test/player_unit.js
Expand Up @@ -36,7 +36,7 @@ describe('Player', () => {
const originalLogWarn = shaka.log.warning;
const originalLogAlwaysWarn = shaka.log.alwaysWarn;
const originalIsTypeSupported = window.MediaSource.isTypeSupported;
const originalDecodingInfo = navigator.mediaCapabilities.decodingInfo;
const originalDecodingInfo = window.shakaMediaCapabilities.decodingInfo;

const fakeManifestUri = 'fake-manifest-uri';
const fakeMimeType = 'application/test';
Expand Down Expand Up @@ -93,7 +93,7 @@ describe('Player', () => {
// Since this is not an integration test, we don't want MediaCapabilities to
// fail assertions based on browser support for types. Pretend that all
// video and audio types are supported.
navigator.mediaCapabilities.decodingInfo = async (config) => {
window.shakaMediaCapabilities.decodingInfo = async (config) => {
await Promise.resolve();
const videoType = config['video'] ?
config['video'].contentType.split('/')[0] : null;
Expand Down Expand Up @@ -177,7 +177,7 @@ describe('Player', () => {
shaka.log.alwaysWarn = originalLogAlwaysWarn;
window.MediaSource.isTypeSupported = originalIsTypeSupported;
shaka.media.ManifestParser.unregisterParserByMime(fakeMimeType);
navigator.mediaCapabilities.decodingInfo = originalDecodingInfo;
window.shakaMediaCapabilities.decodingInfo = originalDecodingInfo;
}
});

Expand Down Expand Up @@ -2463,7 +2463,7 @@ describe('Player', () => {
it('throws CONTENT_UNSUPPORTED_BY_BROWSER', async () => {
window.MediaSource.isTypeSupported = (mimeType) => false;

navigator.mediaCapabilities.decodingInfo = async (config) => {
window.shakaMediaCapabilities.decodingInfo = async (config) => {
await Promise.resolve();
return {supported: false};
};
Expand Down Expand Up @@ -2837,7 +2837,7 @@ describe('Player', () => {
});

if (useMediaCapabilities) {
navigator.mediaCapabilities.decodingInfo = async (config) => {
window.shakaMediaCapabilities.decodingInfo = async (config) => {
await Promise.resolve();
const videoType = config['video'] ? config['video'].contentType : '';
if (videoType.includes('video') &&
Expand Down
6 changes: 3 additions & 3 deletions test/util/stream_utils_unit.js
Expand Up @@ -16,14 +16,14 @@ describe('StreamUtils', () => {
/** @type {!jasmine.Spy} */
let decodingInfoSpy;

const originalDecodingInfo = navigator.mediaCapabilities.decodingInfo;
const originalDecodingInfo = window.shakaMediaCapabilities.decodingInfo;

beforeEach(() => {
decodingInfoSpy = jasmine.createSpy('decodingInfo');
});

afterEach(() => {
navigator.mediaCapabilities.decodingInfo = originalDecodingInfo;
window.shakaMediaCapabilities.decodingInfo = originalDecodingInfo;
});

describe('filterStreamsByLanguageAndRole', () => {
Expand Down Expand Up @@ -511,7 +511,7 @@ describe('StreamUtils', () => {
});

it('handles decodingInfo exception', async () => {
navigator.mediaCapabilities.decodingInfo =
window.shakaMediaCapabilities.decodingInfo =
shaka.test.Util.spyFunc(decodingInfoSpy);
// If decodingInfo() fails, setDecodingInfo should finish without throwing
// an exception, and the variant should have no decodingInfo result.
Expand Down

0 comments on commit 9f553b2

Please sign in to comment.