<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<link rel="stylesheet" href="resources/search-stylesheet.css">
<script src="resources/search-script.js"></script>
<script>
function triggerDownloadingResources() {
    let worker = new Worker("resources/search-worker.js");

    let xhr = new XMLHttpRequest;
    xhr.open("GET", "resources/search-xhr.txt", true);
    xhr.addEventListener("load", done);
    xhr.send();

    function done() {
        TestPage.dispatchEventToFrontend('PageIsReady');
    }
}

function test()
{
    function sanitizeURL(url) {
        return url.replace(/^.*?LayoutTests\//, "");
    }

    let suite = InspectorTest.createAsyncSuite("Page.searchInResources and Page.searchInResource");

    let searchResults;
    const searchString = "SEARCH-STRING";

    suite.addTestCase({
        name: "SearchAllResources",
        description: "Able to find text results in different resources.",
        test(resolve, reject) {
            PageAgent.searchInResources(searchString, (error, results) => {
                InspectorTest.assert(!error, "Should not be a protocol error.");
                InspectorTest.expectThat(results.length > 0, "Should find results in multiple resources.");
                searchResults = results.sort((a, b) => a.url.localeCompare(b.url));
                for (let result of searchResults)
                    InspectorTest.log(`FOUND: ${sanitizeURL(result.url)} (${result.matchesCount})`);
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "SearchInScriptResource",
        description: "Able to find text results in an individual Script resource.",
        test(resolve, reject) {
            let result = searchResults.find((result) => /search-script\.js$/.test(result.url));
            if (!result)
                reject();

            PageAgent.searchInResource(result.frameId, result.url, searchString, (error, matches) => {
                InspectorTest.assert(!error, "Should not be a protocol error.");
                InspectorTest.expectThat(matches.length === result.matchesCount, "Should find previously mentioned number of matches.");
                for (let match of matches)
                    InspectorTest.log(`MATCH: ${JSON.stringify(match)}`);
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "SearchInXHRResource",
        description: "Able to find text results in an individual XHR resource.",
        test(resolve, reject) {
            let result = searchResults.find((result) => /search-xhr\.txt$/.test(result.url));
            if (!result)
                reject();

            const isRegex = undefined;
            const caseSensitive = undefined;

            PageAgent.searchInResource(result.frameId, result.url, searchString, caseSensitive, isRegex, result.requestId, (error, matches) => {
                InspectorTest.assert(!error, "Should not be a protocol error.");
                InspectorTest.expectThat(matches.length === result.matchesCount, "Should find previously mentioned number of matches.");
                for (let match of matches)
                    InspectorTest.log(`MATCH: ${JSON.stringify(match)}`);
                resolve();
            });
        }
    });

    InspectorTest.awaitEvent("PageIsReady")
    .then((event) => {
        suite.runTestCasesAndFinish();
    });

    InspectorTest.evaluateInPage("triggerDownloadingResources()");
}
</script>
</head>
<body onload="runTest()">
<p>Tests for the Page.searchInResources and Page.searchInResource commands.</p>
</body>
</html>
