<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script src="../../http/tests/inspector/dom/resources/InspectorDOMListener.js"></script>
<!-- Loading the queries from external file to avoid having them show up in the results. -->
<script src="resources/dom-search-queries.js"></script>
<script>
function test()
{
    // Create a DOM listener to convert nodeIds to tag names.
    var dom = createDOMListener();

    // Caching the output to avoid searching through the log.
    var output = [];

    InspectorProtocol.sendCommand("DOM.getDocument", {}, onGotDocument);

    function onGotDocument(message) {
        InspectorProtocol.checkForError(message);
        dom.collectNode(message.result.root);
        performSearches(domSearchQueries, testFinished);
    }

    function performSearches(list, callback)
    {
        function next() {
            if (list.length)
                search(list.shift(), next);
            else
                callback();
        }
        next();
    }

    function search(query, callback)
    {
        output.push("=== Query: " + JSON.stringify(query) + " ===");
        InspectorProtocol.sendCommand("DOM.performSearch", {query: query}, function(message) {
            InspectorProtocol.checkForError(message);
            printSearchResults(message.result, callback);
        });
    }

    function printSearchResults(results, callback)
    {
        output.push("Count: " + results.resultCount);
        if (!results.resultCount)
            return callback();

        var options = {"searchId": results.searchId, "fromIndex": 0, "toIndex": results.resultCount};
        InspectorProtocol.sendCommand("DOM.getSearchResults", options, function onResultsReceived(message) {
            for (var nodeId of message.result.nodeIds)
                output.push(dom.getNodeIdentifier(nodeId));
            callback();
        });
    }

    function testFinished()
    {
        ProtocolTest.log(output.join("\n"));
        ProtocolTest.completeTest();
    }
}
</script>
</head>
<body onload="runTest()" class="main-frame">
    <p>Testing DOM.performSearch with no parent node ids.</p>
    <iframe src="resources/dom-search-iframe.html"></iframe>
</body>
</html>
