<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="../resources/inspector-test.js"></script>
<script>
function triggerOverrideLoad(urlSuffix) {
    let url = "http://127.0.0.1:8000/inspector/network/resources/override.txt";
    if (urlSuffix)
        url += urlSuffix;
    fetch(url).then(() => {
        TestPage.dispatchEventToFrontend("LoadComplete");
    });
}

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

    async function logResource(resource) {
        let responseSource = resource.responseSource === WI.Resource.ResponseSource.InspectorOverride ? String(resource.responseSource) : "<not-InspectorOverride>";
        InspectorTest.log(`  URL: ${resource.url}`);
        InspectorTest.log(`  MIME Type: ${resource.mimeType}`);
        InspectorTest.log(`  Status: ${resource.statusCode} ${resource.statusText}`);
        InspectorTest.log(`  Response Source: ${responseSource}`);
        InspectorTest.log(`  Response Headers:`);
        let keys = Object.keys(resource.responseHeaders);
        keys.sort();
        for (let name of keys) {
            let value = resource.responseHeaders[name];
            if (!name.startsWith("X-") && !name.startsWith("Content-"))
                value = "<filtered>";
            InspectorTest.log(`    ${name}: ${value}`);
        }

        let {rawContent, rawBase64Encoded} = await resource.requestContent();
        InspectorTest.log(`  Content: ${rawBase64Encoded ? "[base64] " : ""}${rawContent}`);
    }

    function addTestCase({name, description, expression, overrides}) {
        suite.addTestCase({
            name,
            description,
            async test() {
                let localResourceOverrides = overrides.map((override) => {
                    InspectorTest.log("Creating Local Resource Override for: " + override.url);
                    let localResourceOverride = WI.LocalResourceOverride.create(override.url, WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork, override);
                    WI.networkManager.addLocalResourceOverride(localResourceOverride);
                    return localResourceOverride;
                });

                InspectorTest.log("Triggering load...");
                let [resourceWasAddedEvent, responseReceivedEvent, loadCompleteEvent] = await Promise.all([
                    WI.Frame.awaitEvent(WI.Frame.Event.ResourceWasAdded),
                    WI.Resource.awaitEvent(WI.Resource.Event.ResponseReceived),
                    InspectorTest.awaitEvent("LoadComplete"),
                    InspectorTest.evaluateInPage(expression),
                ]);

                InspectorTest.log("Resource Loaded:");
                let resource = resourceWasAddedEvent.data.resource;
                await logResource(resource);

                for (let localResourceOverride of localResourceOverrides)
                    WI.networkManager.removeLocalResourceOverride(localResourceOverride);
            }
        });
    }

    addTestCase({
        name: "Network.interceptRequestWithResponse.Text",
        description: "Intercept request with text content.",
        expression: `triggerOverrideLoad()`,
        overrides: [{
            url: "http://127.0.0.1:8000/inspector/network/resources/override.txt",
            responseMIMEType: "text/plain",
            responseContent: `PASS - OVERRIDDEN TEXT`,
            responseBase64Encoded: false,
            responseStatusCode: 987,
            responseStatusText: "Override Status Text",
            responseHeaders: {
                "X-Override-Header-1": "Override-Header-Value-1",
                "X-Override-Header-2": "Override-Header-Value-2",
            },
        }],
    });

    addTestCase({
        name: "Network.interceptRequestWithResponse.JavaScript",
        description: "Intercept request with javascript content.",
        expression: `triggerOverrideLoad()`,
        overrides: [{
            url: "http://127.0.0.1:8000/inspector/network/resources/override.txt",
            responseMIMEType: "application/javascript",
            responseContent: `/* PASS */ (function() { /* OVERRIDDEN */ })();`,
            responseBase64Encoded: false,
            responseStatusCode: 200,
            responseStatusText: "Super OK",
            responseHeaders: {
                "X-Custom-Header": "Header value",
            },
        }],
    });

    addTestCase({
        name: "Network.interceptRequestWithResponse.Image",
        description: "Intercept request with image content.",
        expression: `triggerOverrideLoad()`,
        overrides: [{
            url: "http://127.0.0.1:8000/inspector/network/resources/override.txt",
            responseMIMEType: "image/png",
            responseContent: btoa("<data>"),
            responseBase64Encoded: true,
            responseStatusCode: 200,
            responseStatusText: "OK",
            responseHeaders: {},
        }],
    });

    addTestCase({
        name: "Network.interceptRequestWithResponse.URL.QueryString",
        description: "Test overrides with different query strings.",
        expression: `triggerOverrideLoad("?s=2")`,
        overrides: [{
            url: "http://127.0.0.1:8000/inspector/network/resources/override.txt",
            responseMIMEType: "text/plain",
            responseCase64Encoded: false,
            responseBontent: "PASS",
            responseStatusCode: 200,
            responseStatusText: "OK",
            responseHeaders: {"X-Expected": "PASS"},
        }],
    });

    addTestCase({
        name: "Network.interceptRequestWithResponse.URL.Fragment",
        description: "Test override for a load with a fragment.",
        expression: `triggerOverrideLoad("#frag")`,
        overrides: [{
            url: "http://127.0.0.1:8000/inspector/network/resources/override.txt",
            responseMIMEType: "text/plain",
            responseContent: "PASS",
            responseBase64Encoded: false,
            responseStatusCode: 200,
            responseStatusText: "OK",
            responseHeaders: {"X-Expected": "PASS"},
        }],
    });

    addTestCase({
        name: "Network.interceptRequestWithResponse.URL.CaseSensitive",
        description: "Test override for a load with a fragment.",
        expression: `triggerOverrideLoad("?CaSe=SeNsItIvE")`,
        overrides: [{
            url: "http://127.0.0.1:8000/inspector/network/resources/override.txt?case=sensitive",
            responseMIMEType: "text/plain",
            responseContent: "PASS",
            responseBase64Encoded: false,
            responseStatusCode: 200,
            responseStatusText: "OK",
            responseHeaders: {"X-Expected": "PASS"},
            isCaseSensitive: false,
        }]
    });

    addTestCase({
        name: "Network.interceptRequestWithResponse.URL.IsRegex",
        description: "Test override for a load with a fragment.",
        expression: `triggerOverrideLoad("?t=123456789")`,
        overrides: [{
            url: "\\/override\\.txt\\?t=\\d+",
            responseMIMEType: "text/plain",
            responseContent: "PASS",
            responseBase64Encoded: false,
            responseStatusCode: 200,
            responseStatusText: "OK",
            responseHeaders: {"X-Expected": "PASS"},
            isRegex: true,
        }]
    });

    addTestCase({
        name: "Network.interceptRequestWithResponse.URL.IsCaseSensitiveRegex",
        description: "Test override for a load with a fragment.",
        expression: `triggerOverrideLoad("?t=123456789")`,
        overrides: [{
            url: "\\/OvErRiDe\\.TxT\\?t=\\d+",
            responseMIMEType: "text/plain",
            responseContent: "PASS",
            responseBase64Encoded: false,
            responseStatusCode: 200,
            responseStatusText: "OK",
            responseHeaders: {"X-Expected": "PASS"},
            isCaseSensitive: false,
            isRegex: true,
        }]
    });

    addTestCase({
        name: "Network.interceptRequestWithResponse.404",
        description: "Test for a 404 override.",
        expression: `triggerOverrideLoad()`,
        overrides: [{
            url: "http://127.0.0.1:8000/inspector/network/resources/override.txt",
            responseMIMEType: "text/plain",
            responseContent: "PASS",
            responseBase64Encoded: false,
            responseStatusCode: 404,
            responseStatusText: "Not Found",
            responseHeaders: {"X-Expected": "PASS"},
        }],
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Test request interception with response.</p>
<script src="resources/override.js"></script>
</body>
</html>
