<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="../resources/inspector-test.js"></script>
<script>

function loadSubresource(url)
{
    let link = document.createElement("link");
    link.rel = "stylesheet";
    link.href = url;
    document.head.appendChild(link);
}

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

    NetworkAgent.addInterception.invoke({
        url: "http://127.0.0.1:8000/inspector/network/resources/stylesheet.css",
        stage: InspectorBackend.Enum.Network.NetworkStage.Request,
    });

    function addBaselineTestCase({name, description, expression}) {
        suite.addTestCase({
            name,
            description,
            async test() {
                InspectorTest.log("Triggering load...");
                let [requestEvent, responseEvent, fetchResponse] = await Promise.all([
                    WI.Frame.awaitEvent(WI.Frame.Event.ResourceWasAdded),
                    WI.Resource.awaitEvent(WI.Resource.Event.ResponseReceived),
                    RuntimeAgent.evaluate(expression),
                ]);
                InspectorTest.log("Request URL: " + requestEvent.data.resource.url);
                InspectorTest.log("Response URL: " + responseEvent.target.url);
            }
        });
    }
    function addTestCase({name, description, expression, url}) {
        suite.addTestCase({
            name,
            description,
            async test() {
                InspectorTest.log("Triggering load...");
                let [requestEvent, requestInterceptedEvent, fetchResponse] = await Promise.all([
                    WI.Frame.awaitEvent(WI.Frame.Event.ResourceWasAdded),
                    WI.networkManager.awaitEvent(WI.NetworkManager.Event.RequestIntercepted),
                    RuntimeAgent.evaluate(expression),
                ]);
                InspectorTest.log("Request URL: " + requestEvent.data.resource.url);

                let [responseEvent, interceptResponse] = await Promise.all([
                    WI.Resource.awaitEvent(WI.Resource.Event.ResponseReceived),
                    NetworkAgent.interceptWithRequest.invoke({
                        requestId: requestInterceptedEvent.data.requestId,
                        url,
                    }),
                ]);
                InspectorTest.log("Response URL: " + responseEvent.target.url);
            }
        });
    }


    addBaselineTestCase({
        name: "Network.interceptRequest.URLWithoutFragmentBaseline",
        description: "Tests response url without fragment - baseline",
        expression: "loadSubresource('resources/stylesheet-with-sourcemap.css?one')",
    });

    addBaselineTestCase({
        name: "Network.interceptRequest.URLWithFragmentBaseline",
        description: "Tests response url with fragment - baseline",
        expression: "loadSubresource('resources/stylesheet-with-sourcemap.css?two#fragment')",
    });

    addTestCase({
        name: "Network.interceptRequest.URLAddFragment",
        description: "Tests request method interception with URL with fragment",
        expression: "loadSubresource('resources/stylesheet.css')",
        url: "http://127.0.0.1:8000/inspector/network/resources/stylesheet.css#fragment",
    });

    addTestCase({
        name: "Network.interceptRequest.URLRemoveFragment",
        description: "Tests request method interception that removes fragment",
        expression: "loadSubresource('resources/stylesheet.css#fragment')",
        url: "http://127.0.0.1:8000/inspector/network/resources/stylesheet.css",
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Test request interception in combination with fragments.</p>
</body>
</html>
