<html>
<head>
<script src="inspector-test.js"></script>
<script src="extensions-network-test.js"></script>
<script src="extensions-test.js"></script>
<script type="text/javascript">

function extension_doRequest(force, callback)
{
    function callbackWrapper(request)
    {
        var lastCallback = !request || /\?redirected=true$/.test(request.request.url);
        if (lastCallback)
            webInspector.network.onRequestFinished.removeListener(callbackWrapper);
        callback(request, lastCallback);
    }
    webInspector.network.onRequestFinished.addListener(callbackWrapper);
    webInspector.inspectedWindow.eval("doRequest(" + force + ")", function(result) {
        if (result)
            callbackWrapper(null);
    });
}

function extension_testGetRedirectRequestContent(nextTest)
{
    function onRequestFinished(request, lastCallback)
    {
        if (!lastCallback)
            return;
        extension_getRequestByUrl([ /redirect-methods-result.php\?status=302$/ ], function(request) {
            request.getContent(onContent);
        });
    }
    function onContent(content, encoding)
    {
        output("content: " + content + ", encoding: " + encoding);
        nextTest();
    }
    extension_doRequest(false, onRequestFinished);
}

function extension_testRedirectRequestInHAR(nextTest)
{
    function onRequestFinished(resource, lastCallback)
    {
        if (lastCallback)
            webInspector.network.getHAR(onHAR);
    }
    function onHAR(har)
    {
        var entries = har.entries;
        var urls = [];
        for (var i = 0; i < entries.length; ++i) {
            var url = entries[i].request.url;
            // Workaround for GTK DRT that requests favicon.ico along with the page.
            if (!/\/favicon\.ico$/.test(url))
                urls.push(url);
        }
        urls.sort();
        output("Requests in HAR:\n" + urls.join("\n"));
        nextTest();
    }
    extension_doRequest(false, onRequestFinished);
}

function extension_testRedirectRequestFinished(nextTest)
{
    function onRequestFinished(request, lastCallback)
    {
        output("Finished request: " + request.request.url);
        if (lastCallback)
            nextTest();
    }
    extension_doRequest(true, onRequestFinished);
}

var requestDone = false;

function doRequest(force)
{
    // Only do request once per test suite, to make tests independent on each other.
    // Returns true iff request is alredy done (so the caller shouldn't wait for onFinished).
    if (requestDone && !force)
        return true;
    requestDone = true;
    // We can't use XHR here -- the content for XHRs is pushed from back-end.
    var iframe = document.createElement("iframe");
    iframe.src = "/loading/resources/redirect-methods-result.php?status=302";
    document.body.appendChild(iframe);
    return false;
}

var test = function()
{
    InspectorTest.reloadPage(InspectorTest.runExtensionTests);
}

</script>
</head>
<body onload="runTest()">
<p>Tests WebInspector extension API returns valid data for redirected resources</p>
</body>
</html>
