<!DOCTYPE html>
<title>Verifies preload=metadata doesn't buffer the entire clip.</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../../media-resources/media-file.js"></script>
<div id="log"></div>
<video controls preload=metadata></video>
<script>
async_test(function(t) {
  var have_metadata = false;
  var waiting_for_metadata = false;
  var video = document.querySelector("video");

  video.onloadedmetadata = t.step_func(function() {
    have_metadata = true;
    if (waiting_for_metadata)
      video.onsuspend();
  });

  video.onsuspend = t.step_func(function() {
    // The metadata event may not fire before suspend occurs, so wait if needed;
    // while not spec'd, it'd be nice if this wasn't true, see crbug.com/455866.
    if (!have_metadata) {
      waiting_for_metadata = true;
      return;
    }

    assert_equals(video.buffered.length, 1);
    assert_equals(video.seekable.length, 1);

    // If the entire clip wasn't buffered, the buffered range should be smaller
    // than the seekable range; which should be the duration since the server
    // supports range requests.
    assert_true(video.buffered.end(0) < video.duration);
    assert_equals(video.seekable.end(0), video.duration);
    assert_true(video.buffered.end(0) < video.seekable.end(0),
                video.buffered.end(0) + " < " + video.seekable.end(0));
    t.done();
  });

  // Use a .webm to ensure metadata is near the beginning of the file.
  var mediaFile = "resources/media-source/webm/test.webm";
  video.src = "http://127.0.0.1:8000/media/video-throttled-load.cgi?" +
      "nph=1&name=" + mediaFile + "&throttle=40&type=video/webm";
});
</script>
