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

var test = function()
{
    var setup =
        "window.testDiv = document.createElement('div');\n" +
        "window.deliveryCount = 0;\n" +
        "var observer = new WebKitMutationObserver(function(records) {\n" +
        "    window.deliveryCount++;\n" +
        "});\n" +
        "observer.observe(window.testDiv, { attributes: true });";
    
    var mutateAndPause = 
        "function mutateAndPause() {\n" +
        "    window.testDiv.setAttribute('foo', 'baz');\n" +
        "    debugger;\n" +
        "};\n" +
        "setTimeout(mutateAndPause, 0);";

    InspectorTest.startDebuggerTest(step1);

    function step1()
    {
        InspectorTest.evaluateInConsole(setup, function() {
            InspectorTest.addResult("DIV and observer setup.");
            InspectorTest.evaluateInConsoleAndDump("deliveryCount", step2);
        });
    }

    function step2()
    {
        InspectorTest.evaluateInConsole("window.testDiv.setAttribute('foo', 'bar')", function() {
            InspectorTest.addResult("setAttribute should have triggered delivery.");
            InspectorTest.evaluateInConsoleAndDump("deliveryCount", step3); 
        });
    }

    function step3()
    {
        InspectorTest.evaluateInConsole(mutateAndPause, InspectorTest.addResult.bind(InspectorTest, "mutateAndPause invoked."));
        InspectorTest.waitUntilPaused(step4);
    }

    function step4() {
        InspectorTest.addResult("Delivery should not have taken place.");
        InspectorTest.evaluateInConsoleAndDump("deliveryCount", function() {
            InspectorTest.resumeExecution(step5);
        });
    }

    function step5() {
        InspectorTest.addResult("Second delivery should now have happened.");
        InspectorTest.evaluateInConsoleAndDump("deliveryCount", InspectorTest.completeDebuggerTest);
    }
}

</script>
</head>

<body onload="runTest()">
<p>
Tests that DOM Mutation Observers do not attempt to deliver mutation records while the debugger is paused.<a href="https://bugs.webkit.org/show_bug.cgi?id=105810">Bug 105810</a>
</p>

</body>
</html>
