<!DOCTYPE html>
<title>Ensures content delivered with Content-Type: text/plain header is not prefetched</title>
<!-- Regression test for https://crbug.com/1160665 -->
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/preload/resources/preload_helper.js"></script>
<body>
    <script>
        setup({single_test: true});
        window.addEventListener("load", function() {
            verifyPreloadAndRTSupport();
            // This test works by loading a text/plain iframe containing a <script> tag.
            // It then injects some post-load JavaScript to serialize the Performance API
            // data and pass it back to this document.
            var prefetchingIframe = document.getElementById('prefetching-frame');
            window.addEventListener("message", function(msg) {
                // Parse the Performance API data passed from the plain text iframe.
                const entries = JSON.parse(msg.data);
                const resource_types = [];
                for (const entry of entries) {
                    resource_types.push(entry.entryType);
                }
                // If preloading is working correctly, should only see the text document
                // represented in the performance information. A 'resource' type indicates
                // that we've prefetched something.
                let resource_found = false;
                for (const t of resource_types) {
                    if (t == "resource") {
                        resource_found = true;
                        break;
                    }
                }
                assert_false(resource_found, "no resources should be present");
                done();
            });
            prefetchingIframe.addEventListener('load', function() {
                // Pass performance API info back to this document, process in above event handler.
                const passMsg = 'parent.postMessage(JSON.stringify(performance.getEntries()));';
                prefetchingIframe.contentWindow.eval(passMsg);
            });
            // Start the iframe load.
            prefetchingIframe.src = "avoid-prefetching-on-text-plain-inner.html";
        });
    </script>

    <iframe id="prefetching-frame"></iframe>
</body>
