<!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.step_func_done(function(e) {
          assert_equals(video.networkState, video.NETWORK_LOADING);
          assert_equals(video.readyState, video.HAVE_NOTHING);
        }));
        var video = document.createElement('video');
        video.src = url;
        video.addEventListener('error', t.unreached_func("no error events should be dispatched"));
    }, 0);
}, "Check no auto-revoking behavior with URL.createObjectURL(MediaSource).");
</script>
</body>
</html>
