| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- /*
- * 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));
|