/* * noVNC: HTML5 VNC client * Copyright (C) 2019 The noVNC Authors * Licensed under MPL 2.0 (see LICENSE.txt) * * See README.md for usage and integration instructions. */ // Fallback for all uncought errors function handleError(event, err) { try { const msg = document.getElementById('noVNC_fallback_errormsg'); // Work around Firefox bug: // https://bugzilla.mozilla.org/show_bug.cgi?id=1685038 if (event.message === "ResizeObserver loop completed with undelivered notifications.") { return false; } // Only show the initial error if (msg.hasChildNodes()) { return false; } let div = document.createElement("div"); div.classList.add('noVNC_message'); div.appendChild(document.createTextNode(event.message)); msg.appendChild(div); if (event.filename) { div = document.createElement("div"); div.className = 'noVNC_location'; let text = event.filename; if (event.lineno !== undefined) { text += ":" + event.lineno; if (event.colno !== undefined) { text += ":" + event.colno; } } div.appendChild(document.createTextNode(text)); msg.appendChild(div); } if (err && err.stack) { div = document.createElement("div"); div.className = 'noVNC_stack'; div.appendChild(document.createTextNode(err.stack)); msg.appendChild(div); } document.getElementById('noVNC_fallback_error') .classList.add("noVNC_open"); } catch (exc) { document.write("noVNC encountered an error."); } // Try to disable keyboard interaction, best effort try { // Remove focus from the currently focused element in order to // prevent keyboard interaction from continuing if (document.activeElement) { document.activeElement.blur(); } // Don't let any element be focusable when showing the error let keyboardFocusable = 'a[href], button, input, textarea, select, details, [tabindex]'; document.querySelectorAll(keyboardFocusable).forEach((elem) => { elem.setAttribute("tabindex", "-1"); }); } catch (exc) { // Do nothing } // Don't return true since this would prevent the error // from being printed to the browser console. return false; } window.addEventListener('error', evt => handleError(evt, evt.error)); window.addEventListener('unhandledrejection', evt => handleError(evt.reason, evt.reason));