<html>
<head>
<script src="../../http/tests/inspector/inspector-test.js"></script>
<script src="../../http/tests/inspector/extensions-test.js"></script>
<script src="../audits/audits-test.js"></script>
<script src="extensions-audits-tests.js"></script>

<script type="text/javascript">

function extension_testAudits(nextTest)
{
    var pendingOutput = [];

    function onStartAuditCategory(results)
    {
        pendingOutput.push("category.onAuditStarted fired");
        results.addResult("Passed rule", "this rule always passes ok", results.Severity.Info);
        results.addResult("Failed rule (42)", "this rule always fails", results.Severity.Severe);

        var node = results.createResult("Subtree");
        node.addChild("Some url: ", results.createURL("http://www.webkit.org", "WebKit"), " more text ", results.createURL("http://www.google.com"));
        var nestedNode = node.addChild("... and a snippet");
        nestedNode.expanded = true;
        nestedNode.addChild(results.createSnippet("function rand()\n{\n    return 4;\n}"));
        nestedNode.addChild(results.createResourceLink("file:///path/to/error.html", 10));
        nestedNode.addChild(results.createObject("({a: 42, b: 'foo'})", "object details"));
        nestedNode.addChild(results.createNode("document.getElementById('test-element')"));

        webInspector.inspectedWindow.eval("location.href", function(inspectedPageURL) {
            nestedNode.addChild(results.createResourceLink(inspectedPageURL, 20));

            evaluateOnFrontend("InspectorTest.dumpAuditProgress(); reply();", function() {
                results.addResult("Rule with details subtree (1)", "This rule has a lot of details", results.Severity.Warning, node);
                results.updateProgress(10, 20);
                evaluateOnFrontend("InspectorTest.dumpAuditProgress(); reply();", results.done.bind(results));
            });
        });
    }
    function onStartAuditFailedCategory()
    {
        pendingOutput.push("failedCategory.onAuditStarted fired, throwing exception");
        throw "oops!";
    }
    function onStartAuditDisabledCategory(results)
    {
        pendingOutput.push("FAIL: disabledCategory.onAuditStarted fired");
        results.done();
    }

    var category = webInspector.audits.addCategory("Extension audits");
    category.onAuditStarted.addListener(onStartAuditCategory);

    var failedCategory = webInspector.audits.addCategory("Extension audits that fail", 2);
    failedCategory.onAuditStarted.addListener(onStartAuditFailedCategory);

    var disabledCategory = webInspector.audits.addCategory("Disabled extension audits", 2);
    disabledCategory.onAuditStarted.addListener(onStartAuditDisabledCategory);

    function auditsDone()
    {
        pendingOutput.sort().forEach(output);
        nextTest();
    }
    extension_runAudits(auditsDone);
}

</script>
</head>
<body onload="runTest()">
<p>Tests audits support in WebInspector Extensions API</p>
<span id="test-element"><b></b></span>
</body>
</html>
