<!doctype html>
<html lang="en">
    <head>
    </head>
    <body>
        <video></video>
        <p>Test Encrypted Media extension of HTMLMediaElement <em>canPlayType()</em> method.</p>
        <p>The test is designed to pass with any implementation regardless of supported media types and relies on the expected log to detect the expected results for some types.
           To get sufficient coverage, it is important that an implementation support clearkey encryption of at least one of the types below.</p>

        <script src=../video-test.js></script>
        <script>
            video = mediaElement = document.getElementsByTagName('video')[0];

            consoleWrite("Always return the empty string for no type.");
            testExpected("video.canPlayType()", "");

            consoleWrite("<br>Always return the empty string for an empty type.");
            testExpected("video.canPlayType('')", "");
            testExpected("video.canPlayType('', '')", "");
            testExpected("video.canPlayType('', null)", "");
            testExpected("video.canPlayType('', undefined)", "");
            testExpected("video.canPlayType('', 'webkit-org.w3.clearkey')", "");
            testExpected("video.canPlayType('', 'WeBkIt-OrG.W3.ClEaRkEy')", "");
            testExpected("video.canPlayType('', 'com.example.invalid')", "");

            consoleWrite("<br>Always return the empty string for when no container is specified.");
            testExpected("video.canPlayType('video/')", "");
            testExpected("video.canPlayType('video/', '')", "");
            testExpected("video.canPlayType('video/', null)", "");
            testExpected("video.canPlayType('video/', undefined)", "");
            testExpected("video.canPlayType('video/', 'webkit-org.w3.clearkey')", "");
            testExpected("video.canPlayType('video/', 'WeBkIt-OrG.W3.ClEaRkEy')", "");
            testExpected("video.canPlayType('video/', 'com.example.invalid')", "");

            consoleWrite("<br>Always return the empty string for an unsupported container.");
            testExpected("video.canPlayType('video/blahblah')", "");
            testExpected("video.canPlayType('video/blahblah', '')", "");
            testExpected("video.canPlayType('video/blahblah', null)", "");
            testExpected("video.canPlayType('video/blahblah', undefined)", "");
            testExpected("video.canPlayType('video/blahblah', 'webkit-org.w3.clearkey')", "");
            testExpected("video.canPlayType('video/blahblah', 'WeBkIt-OrG.W3.ClEaRkEy')", "");
            testExpected("video.canPlayType('video/blahblah', 'com.example.invalid')", "");

            consoleWrite("<br>Empty key system parameters should not affect the result of video/mp4 types.");
            var mp4Result = video.canPlayType('video/mp4; Codecs=\"avc1.4D400C\"');
            var mp4ResultLogString = "Result of video.canPlayType('video/mp4; Codecs=\"avc1.4D400C\"'): '" + mp4Result + "'";
            consoleWrite(mp4ResultLogString);
            testExpected("video.canPlayType('video/mp4; Codecs=\"avc1.4D400C\"', '')", mp4Result);
            testExpected("video.canPlayType('video/mp4; Codecs=\"avc1.4D400C\"', null)", mp4Result);
            testExpected("video.canPlayType('video/mp4; Codecs=\"avc1.4D400C\"', undefined)", mp4Result);
            consoleWrite("There are currently no implementations supporting encryption of video/mp4.");
            testExpected("video.canPlayType('video/mp4; Codecs=\"avc1.4D400C\"', 'webkit-org.w3.clearkey')", "");
            testExpected("video.canPlayType('video/mp4; Codecs=\"avc1.4D400C\"', 'WeBkIt-OrG.W3.ClEaRkEy')", "");
            testExpected("video.canPlayType('video/mp4; Codecs=\"avc1.4D400C\"', 'com.example.invalid')", "");

            consoleWrite("<br>Empty key system parameters should not affect the result of audio/mpeg types.");
            var mpegResult = video.canPlayType('audio/mpeg');
            var mpegResultLogString = "Result of video.canPlayType('audio/mpeg'): '" + mpegResult + "'";
            consoleWrite(mpegResultLogString);
            testExpected("video.canPlayType('audio/mpeg', '')", mpegResult);
            testExpected("video.canPlayType('audio/mpeg', null)", mpegResult);
            testExpected("video.canPlayType('audio/mpeg', undefined)", mpegResult);
            consoleWrite("There are currently no implementations supporting encryption of audio/mpeg.");
            testExpected("video.canPlayType('audio/mpeg', 'webkit-org.w3.clearkey')", "");
            testExpected("video.canPlayType('audio/mpeg', 'WeBkIt-OrG.W3.ClEaRkEy')", "");
            testExpected("video.canPlayType('audio/mpeg', 'com.example.invalid')", "");

            consoleWrite("<br>Empty key system parameters should not affect the result of audio/wav types.");
            var wavResult = video.canPlayType('audio/wav');
            var wavResultLogString = "Result of video.canPlayType('audio/wav'): '" + wavResult + "'";
            consoleWrite(wavResultLogString);
            testExpected("video.canPlayType('audio/wav', '')", wavResult);
            testExpected("video.canPlayType('audio/wav', null)", wavResult);
            testExpected("video.canPlayType('audio/wav', undefined)", wavResult);
            consoleWrite("There are currently no implementations supporting encryption of audio/wav.");
            testExpected("video.canPlayType('audio/wav', 'webkit-org.w3.clearkey')", "");
            testExpected("video.canPlayType('audio/wav', 'WeBkIt-OrG.W3.ClEaRkEy')", "");
            testExpected("video.canPlayType('audio/wav', 'com.example.invalid')", "");

            consoleWrite("<br>Empty key system parameters should not affect the result of video/webm types.");
            var webmResult = video.canPlayType('video/webm');
            var webmResultLogString = "Result of video.canPlayType('video/webm'): '" + webmResult + "'";
            consoleWrite(webmResultLogString);
            testExpected("video.canPlayType('video/webm', '')", webmResult);
            testExpected("video.canPlayType('video/webm', null)", webmResult);
            testExpected("video.canPlayType('video/webm', undefined)", webmResult);
            consoleWrite("All implementations that support WebM and Encrypted Media support encrypted WebM.");
            testExpected("video.canPlayType('video/webm', 'webkit-org.w3.clearkey')", webmResult);
            testExpected("video.canPlayType('video/webm', 'WeBkIt-OrG.W3.ClEaRkEy')", webmResult);
            testExpected("video.canPlayType('video/webm', 'com.example.invalid')", "");

            endTest();
        </script>
    </body>
</html>
