<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">

window.whereAmI = "main world";

testRunner.setIsolatedWorldSecurityOrigin(632, "file:///");
testRunner.evaluateScriptInIsolatedWorld(632, "window.whereAmI = 'brave new world'");

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

    function onStartAuditCategory(results)
    {
        pendingOutput.push("category.onAuditStarted fired");
        var node = results.createResult("Test Formatters");
        node.addChild(results.createObject("({whereAmI: window.whereAmI})", "main world object"));
        node.addChild(results.createNode("document.getElementById('test-element')"));

        node.addChild(results.createObject("({whereAmI: window.whereAmI})", "content script object", { useContentScriptContext: true }));
        node.addChild(results.createNode("document.getElementById('test-element')", { useContentScriptContext: true }));

        results.addResult("Rule with details subtree (1)", "", results.Severity.Warning, node);
        results.done();
    }
    var category = webInspector.audits.addCategory("Extension audits", 20);
    category.onAuditStarted.addListener(onStartAuditCategory);

    function auditsDone()
    {
        pendingOutput.sort().forEach(output);
        nextTest();
    }
    webInspector.inspectedWindow.eval("", function() {
        extension_runAudits(auditsDone);
    });
}

</script>
</head>
<body onload="runTest()">
<p>Tests audit formatters performing evals on content scripts in WebInspector Extensions API</p>
<span id="test-element"><b></b></span>
</body>
</html>
