<!DOCTYPE html>
<title>Verify that moving a video element to a new document, still loads it normally</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="media-file.js"></script>
<video></video>
<iframe></iframe>
<script>
    async_test(function(t) {
        var video = document.querySelector('video');
        navigator.webkitGetUserMedia(
          {video:true},
          t.step_func(stream => video.srcObject = stream),
          t.unreached_func("Did not get mediastream"));
        video.onloadeddata = this.step_func(function() {
            video.onloadeddata = null;
            assert_true(video.networkState == video.NETWORK_IDLE || video.networkState == video.NETWORK_LOADING);
            assert_greater_than(video.readyState, video.HAVE_METADATA);
            // Move the video element to iframe document from
            // main document and verify that it loads properly
            document.querySelector('iframe').contentDocument.body.appendChild(video);
            assert_equals(video.networkState, video.NETWORK_NO_SOURCE);
            assert_equals(video.readyState, video.HAVE_NOTHING);
            var actual_events = [];
            var expected_events = ['emptied', 'loadstart', 'loadeddata'];
            expected_events.forEach(function(type) {
                video.addEventListener(type, t.step_func(function() {
                    actual_events.push(type);
                    if (type == 'loadeddata') {
                        assert_array_equals(actual_events, expected_events);
                        t.done();
                    }
                }));
            });
        });
    });
</script>
