<!DOCTYPE html>
<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
    <head>
        <title>Test that the HTMLMediaElement preload 'none' attribute value is ignored for MediaStream used as srcObject and MediaStream object URLs used as src.</title>>
        <link rel="author" title="Matthew Wolenetz" href="mailto:wolenetz@chromium.org"/>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
    </head>
    <body>
        <p class="instructions">When prompted, accept to share your audio and video streams.</p>
        <h1 class="instructions">Description</h1>
        <p class="instructions">This test checks that the HTMLMediaElement preload 'none' attribute value is ignored for MediaStream used as srcObject and MediaStream object URLs used as src.</p>

        <audio preload="none"></audio>
        <video preload="none"></video>

        <script>
            function testPreloadNone(t, mediaElement, setSourceStreamFunc)
            {
                // The optional deferred load steps (for preload none) for MediaStream resources should be skipped.
                mediaElement.addEventListener("suspend", t.unreached_func("'suspend' should not be fired."));
                mediaElement.addEventListener("error", t.step_func(function() {
                  assert_unreached("'error' should not be fired, code=" + mediaElement.error.code);
                }));

                mediaElement.addEventListener("loadeddata", t.step_func(function()
                {
                    assert_equals(mediaElement.networkState, mediaElement.NETWORK_LOADING);
                    t.done();
                }));

                setSourceStreamFunc();
                assert_equals(mediaElement.networkState, mediaElement.NETWORK_NO_SOURCE); // Resource selection is active.
            }

            async_test(function(t)
            {
                var aud = document.querySelector("audio");
                navigator.mediaDevices.getUserMedia({audio:true})
                  .then(t.step_func(function(stream)
                  {
                      testPreloadNone(t, aud, t.step_func(function()
                      {
                          aud.src = URL.createObjectURL(stream);
                          t.add_cleanup(function() { URL.revokeObjectURL(aud.src); });
                      }));
                  }),
                  t.unreached_func("getUserMedia error callback was invoked."));
            }, "Test that preload 'none' is ignored for MediaStream object URL used as src");

            async_test(function(t)
            {
                var vid = document.querySelector("video");
                navigator.mediaDevices.getUserMedia({video:true})
                  .then(t.step_func(function(stream)
                  {
                      testPreloadNone(t, vid, t.step_func(function() { vid.srcObject = stream; }));
                  }), t.unreached_func("getUserMedia error callback was invoked."));
            }, "Test that preload 'none' is ignored for MediaStream used as srcObject");
        </script>
    </body>
</html>
