diff --git a/src/js/src/js/solitude.js b/src/js/src/js/solitude.js index c01fbc4..51be3b4 100644 --- a/src/js/src/js/solitude.js +++ b/src/js/src/js/solitude.js @@ -74,7 +74,7 @@ link.href = solitude.createURL(blob); link.download = filename; - link.click() + link.click(); } function io(solitude) { diff --git a/src/js/src/main/app.html b/src/js/src/main/app.html index b8b4571..e420b7c 100644 --- a/src/js/src/main/app.html +++ b/src/js/src/main/app.html @@ -116,11 +116,58 @@ } } - window.kernelLogger = window.kernelLogger ? window.kernelLogger : new CoreLogger(1000, 6); - window.kernelLogger.info("loaded kernelLogger"); + const ringBufferSize = 1000; + const logSeverity = 6; + window.kernelLogger = window.kernelLogger ?? new CoreLogger(ringBufferSize, logSeverity); + window.kernelLogger.info(`Loaded kernelLogger with ringBufferSize=${ringBufferSize}, logSeverity=${logSeverity}`); + const errorHandler = window.addEventListener("error", (e) => { + window.kernelLogger.err("製作者が予期していないエラーが発生しました:") + .err(`${e.message}`) + .err(`in ${e.filename} at ${e.lineno}-${e.colno}`) + .err(`stack:${e.stack}`) + .flush(); + }); + + const rejectionHandler = window.addEventListener("unhandledrejection", (e) => { + const reason = e.reason; + let errorMessage = "予期せぬエラーが発生しました"; + + if (reason instanceof Error) { + // 1. Errorオブジェクトの場合 (最も多い) + errorMessage = reason.message; + } else if (typeof reason === 'string') { + // 2. 文字列がそのまま渡ってきた場合 + errorMessage = reason; + } else if (reason && typeof reason === 'object') { + // 3. オブジェクトの場合 + errorMessage = reason.message || JSON.stringify(reason); + } else if (reason !== undefined && reason !== null) { + // 4. その他のプリミティブなど + errorMessage = String(reason); + } + + window.kernelLogger.err(`未処理のPromiseエラーを検知しました: ${errorMessage}`); + if (reason.hasOwnProperty("stack")) { + window.kernelLogger.err(`stack:${reason.stack}`); + } + window.kernelLogger.flush(); + }); + + const observer = new MutationObserver((mutations) => { + mutations.forEach(m => { + m.addedNodes.forEach(node => { + if (node.nodeType === 1) { + window.kernelLogger.info("発見:" + node.tagName); + } + }); + }); + }); + + // document自体を監視すれば、その後のbody生成も検知可能! + observer.observe(document, { childList: true, subtree: true }); - + diff --git a/src/js/src/main/app.js b/src/js/src/main/app.js index 53aae40..64a10bf 100644 --- a/src/js/src/main/app.js +++ b/src/js/src/main/app.js @@ -1,10 +1,10 @@ import { Que } from "../js/Que.js"; -import { graftSolitude } from "..//js/solitude.js"; +import { graftSolitude } from "../js/solitude.js"; +import { webconfig } from "./WebConfig.js" import { SyslogStmt } from "../js/SyslogStmt.js"; import { LogReceiverReadyMessage } from "./shared/LogReceiverReadyMessage.js"; -import { webconfig } from "./WebConfig.js"; -window.addEventListener('load', main(document)); +document.addEventListener('DOMContentLoaded', main(document)); function main(document) { const kernelLogger = window.kernelLogger