<!doctype html>
<html>
<head>
  <meta charset='utf-8'>
  <title>Revoking a created URL with URL.revokeObjectURL(url)</title>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
</head>
<body>
<div id="log"></div>
<script>
async_test(function(t) {
    var mediaSource = new MediaSource();
    var url = window.URL.createObjectURL(mediaSource);
    window.URL.revokeObjectURL(url);
    mediaSource.addEventListener('sourceopen',
                                 t.unreached_func("url should not reference MediaSource."));
    var video = document.createElement('video');
    video.src = url;
    video.addEventListener('error', t.step_func_done(function(e) {
        assert_equals(e.target.error.code,
                      MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,
                      'Expected error code');
        assert_equals(mediaSource.readyState, 'closed');
    }));
}, "Check revoking behavior of URL.revokeObjectURL(url).");
async_test(function(t) {
    var mediaSource = new MediaSource();
    var url = window.URL.createObjectURL(mediaSource);
    var video = document.createElement('video');
    var unexpectedErrorHandler = t.unreached_func("Unexpected error.")
    video.addEventListener('error', unexpectedErrorHandler);
    video.src = url;
    window.URL.revokeObjectURL(url);
    mediaSource.addEventListener('sourceopen', t.step_func_done(function(e) {
        assert_equals(mediaSource.readyState, 'open');
        mediaSource.endOfStream();
        video.removeEventListener('error', unexpectedErrorHandler);
    }));
}, "Check referenced MediaSource can open after URL.revokeObjectURL(url).");
async_test(function(t) {
    var mediaSource = new MediaSource();
    var url = window.URL.createObjectURL(mediaSource);
    setTimeout(function() {
        mediaSource.addEventListener('sourceopen',
                                     t.unreached_func("url should not reference MediaSource."));
        var video = document.createElement('video');
        video.src = url;
        video.addEventListener('error', t.step_func_done(function(e) {
            assert_equals(e.target.error.code,
                          MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,
                          'Expected error code');
            assert_equals(mediaSource.readyState, 'closed');
        }));
    }, 0);
}, "Check auto-revoking behavior with URL.createObjectURL(MediaSource).");
</script>
</body>
</html>
