<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="../resources/inspector-test.js"></script>
<script>
function xhrGet(url, asyncFlag = true) {
    let xhr = new XMLHttpRequest;
    xhr.open("GET", url, asyncFlag);
    xhr.send();
}

function createXHRForText() {
    xhrGet("resources/data.txt");
}

function createXHRForHTML() {
    xhrGet("resources/data.html");
}

function createXHRForJSON() {
    xhrGet("resources/data.json");
}

function createXHRForJSON2() {
    xhrGet(`resources/echo.php?mimetype=application/json&content={"json":true,"value":42}`);
}

function createXHRForJSON3() {
    xhrGet(`resources/echo.php?mimetype=application/vnd.api%2Bjson&content={"json":true,"value":999}`);
}

function createXHRForSVG() {
    xhrGet("resources/data.svg");
}

function createXHRForPNG() {
    xhrGet("/resources/square100.png");
}

function createSyncXHRForText() {
    xhrGet("resources/data.txt?sync", false);
}

function createSyncXHRForPNG() {
    xhrGet("/resources/square100.png?sync", false);
}

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

    function contentAsText(content) {
        return new Promise((resolve) => {
            if (typeof content === "string") {
                resolve(content)
                return;
            }
            WI.BlobUtilities.blobAsText(content, (text) => {
                resolve(text);
            });
        });
    }

    function addTestCase({name, description, expression, contentHandler}) {
        suite.addTestCase({
            name, description,
            test(resolve, reject) {
                InspectorTest.evaluateInPage(expression);
                WI.Frame.awaitEvent(WI.Frame.Event.ResourceWasAdded)
                    .then((event) => {
                        let resource = event.data.resource;
                        InspectorTest.expectEqual(resource.type, WI.Resource.Type.XHR, "Resource should be XHR type.");
                        return resource.requestContent();
                    })
                    .then(contentHandler)
                    .then(resolve, reject);
            }
        });
    }

    addTestCase({
        name: "Network.getResponseBody.XHR.Text",
        description: "Get text/plain content as text.",
        expression: `createXHRForText()`,
        contentHandler({error, sourceCode, content, rawBase64Encoded}) {
            InspectorTest.expectEqual(sourceCode.mimeType, "text/plain", "MIMEType should be 'text/plain'.");
            InspectorTest.expectEqual(rawBase64Encoded, false, "Content should not be base64Encoded.");
            InspectorTest.expectEqual(content, "Plain text resource.\n", "Text content should match data.txt.");
        }
    });

    addTestCase({
        name: "Network.getResponseBody.XHR.HTML",
        description: "Get text/html content as text.",
        expression: `createXHRForHTML()`,
        contentHandler({error, sourceCode, content, rawBase64Encoded}) {
            InspectorTest.expectEqual(sourceCode.mimeType, "text/html", "MIMEType should be 'text/html'.");
            InspectorTest.expectEqual(rawBase64Encoded, false, "Content should not be base64Encoded.");
            InspectorTest.expectEqual(content, "<span>Hello World</span>\n", "Text content should match data.html.");
        }
    });

    addTestCase({
        name: "Network.getResponseBody.XHR.JSON",
        description: "Get application/octet-stream content as base64Encoded text.",
        expression: `createXHRForJSON()`,
        contentHandler({error, sourceCode, content, rawBase64Encoded}) {
            InspectorTest.expectEqual(sourceCode.mimeType, "application/octet-stream", "MIMEType should be 'application/octet-stream'.");
            InspectorTest.expectEqual(rawBase64Encoded, true, "Content should be base64Encoded.");
            return contentAsText(content).then((text) => {
                InspectorTest.expectEqual(text, `{"json": true, "value": 42}\n`, "JSON content should match data.json.");
            });
        }
    });

    addTestCase({
        name: "Network.getResponseBody.XHR.JSON2",
        description: "Get application/json content as text.",
        expression: `createXHRForJSON2()`,
        contentHandler({error, sourceCode, content, rawBase64Encoded}) {
            InspectorTest.expectEqual(sourceCode.mimeType, "application/json", "MIMEType should be 'application/json'.");
            InspectorTest.expectEqual(rawBase64Encoded, false, "Content should not be base64Encoded.");
            InspectorTest.expectEqual(content, `{"json":true,"value":42}`, "JSON content should match specified content.");
        }
    });

    addTestCase({
        name: "Network.getResponseBody.XHR.JSON3",
        description: "Get arbitrary +json content as text.",
        expression: `createXHRForJSON3()`,
        contentHandler({error, sourceCode, content, rawBase64Encoded}) {
            InspectorTest.expectEqual(sourceCode.mimeType, "application/vnd.api+json", "MIMEType should be 'application/vnd.api+json'.");
            InspectorTest.expectEqual(rawBase64Encoded, false, "Content should not be base64Encoded.");
            InspectorTest.expectEqual(content, `{"json":true,"value":999}`, "JSON content should match specified content.");
        }
    });

    addTestCase({
        name: "Network.getResponseBody.XHR.SVG",
        description: "Get image/svg+xml content as text.",
        expression: `createXHRForSVG()`,
        contentHandler({error, sourceCode, content, rawBase64Encoded}) {
            InspectorTest.expectEqual(sourceCode.mimeType, "image/svg+xml", "MIMEType should be 'image/svg+xml'.");
            InspectorTest.expectEqual(rawBase64Encoded, false, "Content should not be base64Encoded.");
            InspectorTest.expectEqual(content,
`<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 200">
  <rect width="100%" height="50%" fill="green"/>
</svg>
`, "SVG content should be text.");
        }
    });

    addTestCase({
        name: "Network.getResponseBody.XHR.PNG",
        description: "Get image/png content.",
        expression: `createXHRForPNG()`,
        contentHandler({error, sourceCode, content, rawBase64Encoded}) {
            InspectorTest.expectEqual(sourceCode.mimeType, "image/png", "MIMEType should be 'image/png'.");
            InspectorTest.expectEqual(rawBase64Encoded, true, "Content should be base64Encoded.");
            InspectorTest.expectThat(content instanceof Blob, "Image content should be a Blob.");
        }
    });

    addTestCase({
        name: "Network.getResponseBody.XHR.Sync.Text",
        description: "Get text/plain content as text from a synchronous XHR.",
        expression: `createSyncXHRForText()`,
        contentHandler({error, sourceCode, content, rawBase64Encoded}) {
            InspectorTest.expectEqual(sourceCode.mimeType, "text/plain", "MIMEType should be 'text/plain'.");
            InspectorTest.expectEqual(rawBase64Encoded, false, "Content should not be base64Encoded.");
            InspectorTest.expectEqual(content, "Plain text resource.\n", "Text content should match data.txt.");
        }
    });

    addTestCase({
        name: "Network.getResponseBody.XHR.Sync.PNG",
        description: "Get image/png content from a synchronous XHR.",
        expression: `createSyncXHRForPNG()`,
        contentHandler({error, sourceCode, content, rawBase64Encoded}) {
            InspectorTest.expectEqual(sourceCode.mimeType, "image/png", "MIMEType should be 'image/png'.");
            InspectorTest.expectEqual(rawBase64Encoded, true, "Content should be base64Encoded.");
            InspectorTest.expectThat(content instanceof Blob, "Image content should be a Blob.");
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests for getting the content of XHR requests.</p>
</body>
</html>
