<!DOCTYPE HTML>
<html>
<head>
  <!-- The bug number is pulled from the test URL -->
  <title>JSD Test for Bug AUTOFILLED</title>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
  <script type="application/javascript" src="jsd-test.js"></script>
  <script type="application/javascript">
var BUG = 617870;
var TEST_SCRIPT = "test-bug617870-callhooks.js";
document.getElementsByTagName("title")[0].innerHTML = "JSD Test for Bug " + BUG;

netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");

SimpleTest.waitForExplicitFinish();

var hits = { gn: [], ge: [], fn: [], fe: [] };
var numGlobalNonevals = 0;
var numFunctionNonevals = 0;
var numGlobalEvals = 0;
var numFunctionEvals = 0;
function runTest() {
    netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
    jsd.topLevelHook = {
        onCall: function(frame,type) {
            netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
            if (frame.script.fileName.indexOf(TEST_SCRIPT) != -1) {
                var desc = frame.script.fileName + ":" + frame.line + " (" + frame.functionName + ")";
                if (type == Ci.jsdICallHook.TYPE_TOPLEVEL_START) {
                    if (frame.callingFrame === null) {
                        numGlobalNonevals++;
                        hits.gn.push(desc);
                    } else if (frame.callee === null) {
                        numGlobalEvals++;
                        hits.ge.push(desc);
                    } else {
                        numFunctionEvals++;
                        hits.fe.push(desc);
                    }
                }
                dumpStack(frame, "TOPLEVEL(" + type + ")");
           }
        }
    };
    jsd.functionHook = {
        onCall: function(frame,type) {
            netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
            if (frame.script.fileName.indexOf(TEST_SCRIPT) != -1) {
                if (type == Ci.jsdICallHook.TYPE_FUNCTION_CALL) {
                    var desc = frame.script.fileName + ":" + frame.line + " (" + frame.functionName + ")";
                    numFunctionNonevals++;
                    hits.fn.push(desc);
                }
                dumpStack(frame, "FUNCTION(" + type + ")");
            }
        }
    };
    loadScript(TEST_SCRIPT, document.getElementById("test"));
}

function setupTest() {
  var buglink = document.getElementById("buglink");
  buglink.href = "https://bugzilla.mozilla.org/show_bug.cgi?id=" + BUG;
  buglink.innerHTML = "Mozilla Bug " + BUG;
}
  </script>
</head>
<body onLoad='setupTest(); setupJSD();'>

<a id="buglink" target="_blank"></a>
<p id="display"></p>

<div id="content" style="display: none">
  <pre id='test'>
  </pre>
</div>

<div id='test-output'>
</div>

</body>
</html>
