📄 trace.js
字号:
/////////////////////////////////////////////////
// RegisterNamespaces
// Adds the specified namespace without clobbering it if it already exists.
/////////////////////////////////////////////////
function RegisterNamespaces()
{
for (var i=0;i<arguments.length;i++)
{
var astrParts = arguments[i].split(".")
var root = window;
for (var j=0; j < astrParts.length; j++)
{
if (!root[astrParts[j]])
{
root[astrParts[j]] = new Object();
}
root = root[astrParts[j]];
}
}
}
RegisterNamespaces("Web.Debug");
Web.Debug._Trace = function()
{
var m_this = this;
var m_cats = new Object();
var m_components = new Object();
var m_w;
var m_elCtrl;
var m_elCats;
var m_elTrace;
var m_bodyTrace;
var m_onDoneCBs = new Array();
var m_enterCount = 0;
m_cats["*"] = true;
this.htmPath = "/";
var m_q = new Array();
this.q = m_q;
var m_componentCount = 0;
this.registerForComplete = function(p_cb)
{
m_onDoneCBs.push(p_cb);
}
this.unregisterForComplete = function(p_cb)
{
m_onDoneCBs.remove(p_cb);
}
this.startComponent = function(p_name)
{
m_componentCount++;
m_components[p_name] = new _traceComponent(p_name);
if (m_w)
m_w.updateComponent(p_name);
}
this.componentDone = function(p_name)
{
m_componentCount--;
m_components[p_name].end = new Date();
if (m_w)
m_w.updateComponent(p_name);
if (m_componentCount == 0)
{
for (var i=m_onDoneCBs.length-1;i>=0;i--)
{
if (m_onDoneCBs[i])
m_onDoneCBs[i]();
}
}
}
this.registerCategory = function(cat)
{
if (m_cats[cat] == null)
{ m_cats[cat] = false;
}
if (m_w)
m_w.updateCats();
}
this.enableCategory = function(cat, enable)
{
if (m_cats[cat] != null)
{ m_cats[cat] = enable;
}
if (m_w)
m_w.updateCats();
}
function isEnabled(cat)
{
return ((m_cats[cat] == true) ||
((m_cats[cat] != false) && (m_cats["*"] == true)));
}
var write = function(type, cat, str, fcn, guid)
{
m_q.push({type:type,
category:cat,
text:str,
time:new Date(),
fcn:fcn,
guid:guid});
}
this.fcnEnter = function(cat, fcn)
{
if (isEnabled(cat))
{
// Generate a GUID of sorts
var guid = m_enterCount;
m_enterCount++;
if (arguments.callee.caller)
{
var sdf = stackDumpFrame(arguments.callee.caller);
var s = printStackDumpFrame(sdf);
}
else
{ var s = "";
}
var f = fcn ? fcn + " = " : "";
write("FcnEnter", cat, "Enter: " + f + s, fcn, guid);
return guid;
}
}
this.fcnExit = function(cat, fcn, guid)
{
if (isEnabled(cat))
{
if (arguments.callee.caller)
{
var sdf = stackDumpFrame(arguments.callee.caller);
var s = printStackDumpFrame(sdf);
}
else
{ var s = "";
}
var f = fcn ? fcn + " = " : "";
write("FcnExit", cat, "Exit: " + f + s, fcn, guid);
}
}
this.write = function(cat, str)
{
if (isEnabled(cat))
{
write("Print", cat, str);
}
}
this.categories = m_cats;
this.components = m_components;
this.open = function()
{
this.cancel();
//m_w = window.open(this.htmPath + "trace.htm","MSN_DEBUG","location=no,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no");
m_w = window.open(this.htmPath + "trace.htm", "MSN_DEBUG");
//m_w.document.open();
m_w.focus();
}
this.openCB = function()
{
m_w.setup(m_this);
m_w.updateCats(m_cats);
}
this.init = function()
{
document.attachEvent("onkeyup", display);
window.attachEvent("onerror", globalErr);
}
var globalErr = function(a,b,c)
{
var o = stackDump();
_trace.write("Exception", "<b>" + a + " " + b + " in " + c + "</b><br>" + o.toString());
displayPrompt();
return false;
}
// Create argument:argumentValue
var expandArguments = function(s,a)
{
var newargs = "";
var alist = s.split(",");
if (alist[0])
for (var arg=0;arg<alist.length;arg++)
{
if (arg>0)
newargs+=",";
//
// Hack so that if toString() fails, we don't.
// There is a case in LiveFramework where ToString will
// cause an exception. I've informed ScottI
//
var sarg = "";
var sarg = a[arg];
if (!sarg)
{ sarg = "null";
}
else
{ try
{ sarg = sarg.toString();
} catch (ex)
{ sarg = "[error]";
}
}
newargs += alist[arg] + ":" + sarg;
}
for (var i=arg;i<a.length;i++)
newargs+="," + a[i++];
return newargs;
}
var stackDumpFrame = function(frame)
{
var copyArgs = new Array()
for (var i=0;i < frame.arguments.length;i++)
{
copyArgs.push(frame.arguments[i])
}
return {f: frame,a: copyArgs};
}
var printStackDumpFrame = function(frame)
{
var f = frame.f.toString();
var a = frame.a;
var idxArgs = idxEnd = f.indexOf("(") + 1
var idxClose = f.indexOf(")")
var s = f.substring(0,idxArgs)
var c = f.substring(idxClose)
var newargs = expandArguments(f.substring(idxArgs,idxClose),a);
var ret = s + newargs + ")";
return ret;
}
var stackDump = function()
{
var start = arguments.callee.caller.caller;
var callStack = new Array();
while (start!=null)
{
callStack.push(stackDumpFrame(start));
start = start.caller;
}
this.toString = function()
{
var cs = c = s = "";
for (var j=0; j < callStack.length; j++)
{
var obj = callStack[j];
cs += "<dd>" + printStackDumpFrame(obj) + "<br>";
}
return cs;
}
var pushString = this.toString();
return this;
}
// Open debug window using ctrl-shift-T
var display = function()
{
if (window.event.ctrlKey && window.event.shiftKey && window.event.keyCode==84)
{ displayPrompt();
}
}
this.cancel = function()
{
var elDebug = document.getElementById("MSN_DEBUG");
if (elDebug) elDebug.removeNode(true);
}
var displayPrompt = function()
{
var elDebug = document.getElementById("MSN_DEBUG");
if (!elDebug)
{
try {
elDebug = document.createElement("DIV");
elDebug.id = "MSN_DEBUG";
elDebug.style.cssText = "width:200px;text-align:center;border:3px solid black;background:pink;position:absolute;top:2px;left:2px;z-index:100;font-family:verdana;font-size:8pt"
elDebug.innerHTML = "<A HREF=\"#\" ONCLICK=\"_trace.open();return false\">Display Trace Window</A> <BR> <A HREF=\"#\" ONCLICK=\"_trace.cancel();return false\">Cancel</A>";
document.body.appendChild(elDebug);
}
catch (ex)
{
alert("Error occurred - cannot trap");
}
}
}
}
function cb()
{ alert(2);
}
Web.Debug.Trace = new Web.Debug._Trace();
Web.Debug._Trace.Component = function(p_name)
{ this.name = p_name;
this.start = new Date();
this.end = null;
}
_trace = Web.Debug.Trace;
__p_trace = _trace;
__p_ = _trace;
_traceComponent = Web.Debug._Trace.Component;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -