<!DOCTYPE html>
<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>
        <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>
        <div id=log></div>

        <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.srcObject = stream; }));
                  }),
                  t.unreached_func("getUserMedia error callback was invoked."));
            }, "Test that preload 'none' is ignored for MediaStream object URL used as srcObject for audio");

            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 for video");
        </script>
    </body>
</html>
