| <html> | |
| <body> | |
| <script type="text/javascript"> | |
| // Since promises run asynchronously, use the pages title to keep track | |
| // of the result. | |
| function setResultInTitle(title) { | |
| if (title == "" || title == "success" || | |
| title == "Unsupported keySystem" || | |
| title == "None of the requested configurations were supported.") { | |
| document.title = title; | |
| } else { | |
| console.log("Unexpected result: " + title); | |
| document.title = "unexpected result"; | |
| } | |
| }; | |
| // Compares 2 arrays of MediaKeySystemMediaCapability, comparing only | |
| // |contentType|. This assumes the order is the same. Returns "success" | |
| // if they match, an error message if they don't. | |
| function verifyCapabilitiesAreEqual(actual, expected) { | |
| if (actual.length != expected.length) | |
| return "mismatched lengths"; | |
| for (var i = 0; i < actual.length; i++) { | |
| // Only compare |contentType|. Other properties are ignored. | |
| if (actual[i].contentType !== expected[i].contentType) | |
| return actual[i].contentType + " does not match " + | |
| expected[i].contentType + " at index " + i; | |
| } | |
| return "success"; | |
| } | |
| // Calls navigator.requestMediaKeySystemAccess() using the supplied codec | |
| // lists, and then verifies the result. Sets page title when done. | |
| function requestMediaKeySystemAccessAndVerifyConfiguration( | |
| keySystem, initDataType, audioCodecList, videoCodecList) { | |
| var configuration = { | |
| initDataTypes: [initDataType], | |
| audioCapabilities: [], | |
| videoCapabilities: [] | |
| }; | |
| if (audioCodecList !== null) { | |
| for (entry of audioCodecList) { | |
| configuration.audioCapabilities.push({contentType: entry}); | |
| }; | |
| } | |
| if (videoCodecList !== null) { | |
| for (entry of videoCodecList) { | |
| configuration.videoCapabilities.push({contentType: entry}); | |
| }; | |
| } | |
| // This is using promises which will run asynchronously. | |
| navigator.requestMediaKeySystemAccess(keySystem, [configuration]) | |
| .then(function(response) { | |
| var allowedConfig = response.getConfiguration(); | |
| if (allowedConfig.initDataTypes.length !== 1) { | |
| setResultInTitle("initDataType length mismatch"); | |
| return; | |
| } | |
| if (allowedConfig.initDataTypes[0] !== initDataType) { | |
| setResultInTitle("initDataType returned " + | |
| allowedConfig.initDataTypes[0] + | |
| ", expected " + initDataType); | |
| return; | |
| } | |
| if (audioCodecList !== null) { | |
| var result = | |
| verifyCapabilitiesAreEqual(allowedConfig.audioCapabilities, | |
| configuration.audioCapabilities); | |
| if (result !== "success") { | |
| setResultInTitle(result); | |
| return; | |
| } | |
| } else if (allowedConfig.audioCapabilities.length > 0) { | |
| setResultInTitle("audioCapabilities set when none expected"); | |
| return; | |
| } | |
| if (videoCodecList !== null) { | |
| setResultInTitle( | |
| verifyCapabilitiesAreEqual(allowedConfig.videoCapabilities, | |
| configuration.videoCapabilities)); | |
| return; | |
| } else if (allowedConfig.videoCapabilities.length > 0) { | |
| setResultInTitle("videoCapabilities set when none expected"); | |
| return; | |
| } | |
| setResultInTitle("success"); | |
| }) | |
| .catch(function(err) { setResultInTitle(err.message); }); | |
| }; | |
| function checkKeySystemWithMediaMimeType(keySystem, initDataType, | |
| audioCodecList, videoCodecList) { | |
| setResultInTitle(""); | |
| requestMediaKeySystemAccessAndVerifyConfiguration( | |
| keySystem, initDataType, audioCodecList, videoCodecList); | |
| }; | |
| </script> | |
| </body> | |
| </html> |