<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function createJSONXHR() {
    let xhr = new XMLHttpRequest;
    xhr.open("GET", "resources/data.json?" + Math.random(), true);
    xhr.send();
}

function createJSONBlobXHR() {
    let xhr = new XMLHttpRequest;
    xhr.open("GET", "resources/data.json?" + Math.random(), true);
    xhr.responseType = "blob";
    xhr.send();
}

function test()
{
    let suite = InspectorTest.createAsyncSuite("XHR.Blob");

    const jsonContent = `{"alpha":"beta","gamma":12345}\n`;

    suite.addTestCase({
        name: "XHR.JSONContent",
        description: "Ensure an XMLHttpRequest with JSON content still gives us text.",
        test(resolve, reject) {
            InspectorTest.evaluateInPage("createJSONXHR()");
            WI.Frame.singleFireEventListener(WI.Frame.Event.ResourceWasAdded, (event) => {
                let resource = event.data.resource;
                InspectorTest.expectThat(resource instanceof WI.Resource, "Resource should be created.");
                resource.singleFireEventListener(WI.Resource.Event.LoadingDidFinish, (event) => {
                    InspectorTest.pass("Resource should complete loading.");
                    resource.requestContent().then(() => {
                        InspectorTest.expectThat(resource.content === jsonContent, "Resource has expected content.");
                    }).then(resolve, reject);
                });
            });
        }
    });

    suite.addTestCase({
        name: "XHR.JSONContent.Blob",
        description: "Ensure an XMLHttpRequest with JSON content and a responseType of blob still gives us text.",
        test(resolve, reject) {
            InspectorTest.evaluateInPage("createJSONBlobXHR()");
            WI.Frame.singleFireEventListener(WI.Frame.Event.ResourceWasAdded, (event) => {
                let resource = event.data.resource;
                InspectorTest.expectThat(resource instanceof WI.Resource, "Resource should be created.");
                resource.singleFireEventListener(WI.Resource.Event.LoadingDidFinish, (event) => {
                    InspectorTest.pass("Resource should complete loading.");
                    resource.requestContent().then(() => {
                        InspectorTest.expectThat(resource.content === jsonContent, "Resource has expected content.");
                    }).then(resolve, reject);
                });
            });
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests that an XMLHttpRequest resource gives us JSON text even if it is marked as having blob content.</p>
</body>
</html>
