From 09d9f72db289aff51c20fd83538fbb40b3ee652c Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 10 Apr 2021 02:51:38 +0300 Subject: [PATCH] add unresponsive listener --- index.js | 44 ++++++++++++++++++++----- plugins/in-app-menu/back.js | 10 +----- preload.js | 2 +- providers/{logger.js => frontLogger.js} | 2 +- 4 files changed, 39 insertions(+), 19 deletions(-) rename providers/{logger.js => frontLogger.js} (87%) diff --git a/index.js b/index.js index 7fd88754..addd98ed 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,7 @@ const path = require("path"); const electron = require("electron"); +const { dialog } = require("electron"); const is = require("electron-is"); const unhandled = require("electron-unhandled"); const { autoUpdater } = require("electron-updater"); @@ -144,7 +145,11 @@ function createMainWindow() { }); } }); - + + win.webContents.on("render-process-gone", (event, webContents, details) => { + showUnresponsiveDialog(win, details); + }); + win.once("ready-to-show", () => { if (config.get("options.appVisible")) { win.show(); @@ -154,13 +159,7 @@ function createMainWindow() { return win; } -let createdWindow = false; -app.on("browser-window-created", (event, win) => { - //Ensures listeners are registered only once - if (createdWindow) { - return; - } - createdWindow = true; +app.once("browser-window-created", (event, win) => { loadPlugins(win); win.webContents.on("did-fail-load", ( @@ -325,3 +324,32 @@ app.on("ready", () => { }); } }); + +function showUnresponsiveDialog(win, details) { + if (!!details) { + console.log("Unresponsive Error!\n"+JSON.stringify(details, null, "\t")) + } + dialog.showMessageBox(win, { + type: "error", + title: "Window Unresponsive", + message: "The Application is Unresponsive", + details: "We are sorry for the inconveniance! please choose what to do with the application:", + buttons: ["Wait", "Relaunch", "Quit"], + cancelId: 0 + }).then( response => { + switch (response) { + case 1: //if relaunch - relaunch+exit + app.relaunch(); + case 2: + app.exit(); + break; + case 0: + default: + return; + //maybe set a timer and afterwards check responsivness and call function again if failed + } + }); +} + +module.exports.aDialog = showUnresponsiveDialog; + diff --git a/plugins/in-app-menu/back.js b/plugins/in-app-menu/back.js index 938c5475..8365ac8b 100644 --- a/plugins/in-app-menu/back.js +++ b/plugins/in-app-menu/back.js @@ -7,8 +7,6 @@ const config = require("../../config"); const { setApplicationMenu } = require("../../menu"); const { injectCSS } = require("../utils"); -//check that menu doesn't get created twice -let calledReadyToShow = false; //tracks menu visibility let visible = true; // win hook for fixing menu @@ -30,13 +28,7 @@ module.exports = (winImport) => { // css for custom scrollbar + disable drag area(was causing bugs) injectCSS(win.webContents, path.join(__dirname, "style.css")); - win.on("ready-to-show", () => { - // (apparently ready-to-show is called twice) - if (calledReadyToShow) { - return; - } - - calledReadyToShow = true; + win.once("ready-to-show", () => { setApplicationMenu(win); diff --git a/preload.js b/preload.js index f25dd6b7..5fcb2e07 100644 --- a/preload.js +++ b/preload.js @@ -34,7 +34,7 @@ document.addEventListener("DOMContentLoaded", () => { fileExists(songInfoProviderPath, require(songInfoProviderPath)); // inject front logger - const loggerPath = path.join(__dirname, "providers", "logger.js") + const loggerPath = path.join(__dirname, "providers", "frontLogger.js") fileExists(loggerPath, require(loggerPath)); // Add action for reloading diff --git a/providers/logger.js b/providers/frontLogger.js similarity index 87% rename from providers/logger.js rename to providers/frontLogger.js index 730a3dfa..210e3ff8 100644 --- a/providers/logger.js +++ b/providers/frontLogger.js @@ -3,7 +3,7 @@ const { ipcRenderer } = require("electron"); function logToString(log) { let string = (typeof log === "string") ? log : log.toString(); if (!string || string.includes("[object Object]")) { - string = JSON.stringify(log); + string = JSON.stringify(log, null, "\t"); } return string; }