SelfHost/Test Environment/admin/spiderbasic/debug.js
2025-12-15 19:46:13 +01:00

204 lines
6.3 KiB
JavaScript

spider.debug = {
y : 0,
window : null,
editorGadget : null,
disabled: false,
fatalError: false,
Init : function() {
// A webview is attached, don't display the built-in debug window
if (window.spiderDebug)
{
return;
}
this.window = spider_OpenWindow(-1, 0, 0, 350, 150, "SpiderBasic - Debug output", (1 << 4) | (1 << 5));
this.editorGadget = spider_EditorGadget(-1, 5, 5, spider_WindowWidth(spider.debug.window) - 10, spider_WindowHeight(spider.debug.window) - 10, (1 << 0));
spider_StickyWindow(this.window, 1);
// Position the window in the top/right corner
spider_ResizeWindow(this.window, spider_DesktopWidth() - spider_WindowWidth(this.window, 1)-10, 10, -0xFFFF , -0xFFFF)
spider_BindEvent(4, // PB_Event_CloseWindow
function() {
spider_CloseWindow(spider.debug.window);
spider.debug.disabled = true;
},
this.window);
spider_BindEvent(7, // PB_Event_SizeWindow
function() {
spider_ResizeGadget(spider.debug.editorGadget, 5, 5, spider_WindowWidth(spider.debug.window) - 10, spider_WindowHeight(spider.debug.window) - 10);
},
this.window);
},
RawPrint : function(text) {
if (this.editorGadget && !this.disabled)
{
spider_SetGadgetText(this.editorGadget, spider_GetGadgetText(this.editorGadget)+text+"\n");
var editorTextArea = spider_GadgetID(this.editorGadget).gadget.domNode;
// Use jquery animate to scroll down automatically
$(editorTextArea).animate({
scrollTop:$(editorTextArea)[0].scrollHeight - $(editorTextArea).height()
},0);
}
},
Print : function(text) {
if (spider.debug.fatalError) // Don't do anything if the program has already crash
return;
// log in browser console first, just in case the GUI text doesn't work
console.log(text);
// A webview is attached, forward the debug to the IDE debug output
if (window.spiderDebug)
{
window.spiderDebug({"command": 5, "text": ""+text });
}
else
{
this.RawPrint(text);
}
},
CheckSingleFlags : function(parameter, flags, allowedFlags)
{
var callerName = spider.debug.CheckSingleFlags.caller.name;
var functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
if (allowedFlags.indexOf(flags) === -1)
throw new Error(functionName+"(): : invalid value specified for parameter '"+parameter+"'.", { cause: "spider" });
},
CheckCombinationFlags : function(parameter, flags, allowedFlags)
{
var callerName = spider.debug.CheckCombinationFlags.caller.name;
var functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
var allFlags = 0;
for (var k = 0; k < allowedFlags.length; k++)
{
allFlags |= allowedFlags[k];
}
if ((allFlags & flags) !== flags) // Something is wrong is the specified value doesn't fit in the flags
throw new Error(functionName+"(): : invalid value specified for parameter '"+parameter+"'.", { cause: "spider" });
},
Error : function(text, callerName)
{
if (spider.debug.fatalError) // Don't do anything if the program has already crash
return;
if (typeof callerName === "undefined")
{
callerName = spider.debug.Error.caller.name;
}
functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
throw new Error(functionName+"(): "+text, { cause: "spider" });
},
CheckId : function(callerName, ObjectName, id)
{
if (spider.debug.fatalError) // Don't do anything if the program has already crash
return;
var functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
if (id < -1)
throw new Error(functionName+"(): #"+ObjectName+" object number can't be negative (value: "+id+").", { cause: "spider" });
else if (id >= 10000)
throw new Error(functionName+"(): #"+ObjectName+" object number is very high (over 10000), are you sure of that ?", { cause: "spider" });
},
CheckObject : function(callerName, ObjectName, isObject)
{
if (spider.debug.fatalError) // Don't do anything if the program has already crash
return;
var functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
if (isObject === 0)
throw new Error(functionName+"(): The specified #"+ObjectName+" is not initialised.", { cause: "spider" });
},
DebuggerLineGetLine : function(a)
{
return ((a) & ((1 << 20)-1));
},
DebuggerLineGetFile : function(a)
{
return (((a) >> 20) & ((1 << (32-20))-1));
},
DisplayError : function(text)
{
if (spider.debug.fatalError) // Don't do anything if the program has already crash
return;
// A webview is attached
if (window.spiderDebug)
{
window.spiderDebug( { "command": 8, "lineId": spiderLine, "text": text } );
}
else
{
var line = spider.debug.DebuggerLineGetLine(spiderLine)+1;
var fileIndex = spider.debug.DebuggerLineGetFile(spiderLine);
var filename = spider.debugFilename;
if (fileIndex > 0) // It's an include file
{
filename = spider.debugIncludes[fileIndex-1];
}
spider.debug.Print(filename+":"+line+" "+text);
}
}
};
// temporary Shortcut
spider.Debug = function(text) {
spider.debug.Print(text);
};
// temporary Shortcut
function debug(text) {
spider.debug.Print(text);
}
// global error handler
window.addEventListener("error", (event) => {
if (spider.debug.fatalError) // Don't do anything if the program has already crash
return;
var text;
if (event.error.cause == "spider") // It's a SpiderBasic exception
{
text = event.error.message;
}
else
{
// Not a SpiderBasic exception, put the full details
text = `${event.type}: ${event.message} (${event.filename}, line: ${event.lineno})`;
}
spider.debug.DisplayError(text);
spider.debug.fatalError = true;
});