diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 5aed9600d587d53ebcb8f12cc133b1d5f55441e5..0000000000000000000000000000000000000000 Binary files a/.DS_Store and /dev/null differ diff --git a/src/designviewer.cpp b/src/designviewer.cpp index 228ed446042a8f48b9646ac6f4b944e4b7bb6586..faf436447de08c51cbec5b30ad59befd5f3eb7f2 100644 --- a/src/designviewer.cpp +++ b/src/designviewer.cpp @@ -46,18 +46,6 @@ #include <QtGui/private/qzipreader_p.h> #endif -std::function<void(char *, size_t, char *)> g_setFileDataCallback; -extern "C" EMSCRIPTEN_KEEPALIVE void qt_callSetFileData(char *content, - size_t contentSize, - char *fileName) -{ - if (g_setFileDataCallback == nullptr) - return; - - g_setFileDataCallback(content, contentSize, fileName); - g_setFileDataCallback = nullptr; -} - DesignViewer::DesignViewer() { qDebug() << "DesignViewer constructor"; diff --git a/src/main.cpp b/src/main.cpp index 541e4e20f3d89119f872876a005c957faf02e2ff..4d8e4f9f42226811503b46bc8275db69c2d31f8d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -27,11 +27,13 @@ #include <QSurfaceFormat> #include <QtQuick3D/QQuick3D> +#include <emscripten.h> + #include "designviewer.h" void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) { - QString logPrefix, logSuffix, newLog; + QString logPrefix, logSuffix, newLog, jsCode; FILE *logFile = stdout; QByteArray localMsg = msg.toLocal8Bit(); @@ -52,6 +54,8 @@ void messageHandler(QtMsgType type, const QMessageLogContext &context, const QSt case QtCriticalMsg: logPrefix = QStringLiteral("Critical: "); logFile = stderr; + jsCode = QStringLiteral("logError('%1');").arg(localMsg.constData()); + emscripten_run_script(jsCode.toStdString().c_str()); break; case QtFatalMsg: logPrefix = QStringLiteral("Fatal: "); diff --git a/www/index.html b/www/index.html index 87e83e18a9a4b8b0ebd4695790e4ce8f4de8b521..ea7a1ad3ce720c55117b3e0146517975ff87b0b4 100644 --- a/www/index.html +++ b/www/index.html @@ -66,6 +66,8 @@ <div id="title">Qt Design Viewer</div> <div id="subtitle" class="subtitleclass"></div> <div id="qtstatus"></div> + <div id="qterrormessages"></div> + <div id="qtbugreport"></div> <noscript >JavaScript is disabled. Please enable JavaScript to use this application.</noscript @@ -164,6 +166,15 @@ </p> <p id="versioninfo_main">Version: 1.0.0</p> </div> + + <div id="err_user_feedback"> + <span + class="closebtn" + onclick="this.parentElement.style.display='none';" + >×</span + > + <div id="err_user_feedback_text"></div> + </div> <script src="qtdesignviewer.js"></script> <script src="scripts/script.js" type="text/javascript"></script> <script src="qtloader.js" type="text/javascript"></script> diff --git a/www/scripts/script.js b/www/scripts/script.js index 5ebe8163fb5aef0ac7a92209e71b6b1084ad3c84..dd45283f87d3e7cae24084f37b15e172d1ff8717 100644 --- a/www/scripts/script.js +++ b/www/scripts/script.js @@ -65,11 +65,35 @@ window.addEventListener( ); function logError(error) { - console.error(error); - console.error(error.stack); + const spinner = document.querySelector("#qtspinner"); + const container = document.querySelector('#qtcontainer'); const status = document.querySelector('#qtstatus'); - status.innerHTML = 'An error occurred while running the project.<br><br>Error Message:<br>' + error + ' <br><br>Please check the logs for more information.<br>Reloading in 10 seconds.'; - setTimeout(() => location.reload(), 10000); + const error_message = document.querySelector('#qterrormessages'); + const bugreport = document.querySelector('#qtbugreport'); + + container.style.display = 'none'; + spinner.style.display = 'block'; + status.style.display = 'block'; + error_message.style.display = 'block'; + bugreport.style.display = 'block'; + + status.innerHTML = 'An error occurred while running the project. Please check the console logs for more information.<br><br>Critical Error Message(s):<br>'; + + var bugreport_text; + + if (error instanceof Error) { // Assume it's a JS error + console.log(error.stack); + error_message.innerHTML += error.message + '<br>'; + } else { // Assume it's a string + console.log(error); + error_message.innerHTML += error + '<br>'; + } + bugreport_text = error_message.innerHTML + + const reportLink = document.createElement('a'); + reportLink.href = 'https://bugreports.qt.io/secure/CreateIssueDetails!init.jspa?pid=11740&issuetype=1&components=24729&versions=20809&summary=Design+Viewer+Crash&description=' + encodeURIComponent('Error:\n' + bugreport_text); + + bugreport.innerHTML = '<br><br>You can easily report this issue at <a href="' + reportLink.href + '">Qt Bug Reports.</a>'; } function handleFileSelection(event) { @@ -243,21 +267,14 @@ async function loadProjector() { }, onExit: exitData => { console.log("onExit: " + exitData.code + " " + exitData.text); - status.innerHTML = 'Application exit'; if (exitData.code === 0) { status.innerHTML += ' with success.'; return; } - status.innerHTML += ' with an error.'; - status.innerHTML += '<br><br>Exit code:<br>' + exitData.code; - status.innerHTML += '<br><br>Exit message:<br>' + exitData.text; - - const reportLink = document.createElement('a'); - reportLink.href = 'https://bugreports.qt.io/secure/CreateIssueDetails!init.jspa?pid=11740&issuetype=1&components=24729&versions=20809&summary=Design+Viewer+Crash&description=' + encodeURIComponent('Exit code:\n' + exitData.code + '\n\nExit message:\n' + exitData.text); - - status.innerHTML += '<br><br>You can report this issue at <a href="' + reportLink.href + '">Qt Bug Reports.</a>'; + console.error("Exit code: " + exitData.code); + console.error("Exit data: " + JSON.stringify(exitData)); }, entryFunction: window.createQtAppInstance, containerElements: [container]