From f66492d357010a2e5ec11e07fd6db9825184d37d Mon Sep 17 00:00:00 2001
From: Andrew Dolgov <fox@madoka.volgo-balt.ru>
Date: Sat, 20 Apr 2013 10:43:21 +0400
Subject: [PATCH] better javascript error reporting, save error reports in
 tt-rss log

---
 classes/rpc.php | 11 +++++++++++
 js/functions.js | 38 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/classes/rpc.php b/classes/rpc.php
index 61c815b36..750aa2cb1 100644
--- a/classes/rpc.php
+++ b/classes/rpc.php
@@ -634,5 +634,16 @@ class RPC extends Handler_Protected {
 		}
 	}
 
+	function log() {
+		$logmsg = $this->dbh->escape_string($_REQUEST['logmsg']);
+
+		if ($logmsg) {
+			Logger::get()->log_error(E_USER_WARNING,
+				$logmsg, '[client-js]', 0, false);
+		}
+
+		echo json_encode(array("message" => "HOST_ERROR_LOGGED"));
+
+	}
 }
 ?>
diff --git a/js/functions.js b/js/functions.js
index 04be58bf7..8442e1c9f 100644
--- a/js/functions.js
+++ b/js/functions.js
@@ -50,6 +50,21 @@ function exception_error(location, e, ext_info) {
 			}
 		}
 
+		try {
+			new Ajax.Request("backend.php", {
+				parameters: {op: "rpc", method: "log", logmsg: msg},
+				onComplete: function (transport) {
+					console.log(transport.responseText);
+				} });
+
+		} catch (eii) {
+			console.log("Exception while trying to log the error.");
+			console.log(eii);
+		}
+
+		msg += "<p>"+ __("The error will be reported to the configured log destination.") +
+			"</p>";
+
 		var content = "<div class=\"fatalError\">" +
 			"<pre>" + msg + "</pre>";
 
@@ -106,7 +121,28 @@ function exception_error(location, e, ext_info) {
 
 		dialog.show();
 
-	} catch (e) {
+	} catch (ei) {
+		console.log("Exception while trying to report an exception. Oh boy.");
+		console.log(ei);
+		console.log("Original exception:");
+		console.log(e);
+
+		msg += "\n\nAdditional exception caught while trying to show the error dialog.\n\n" +  format_exception_error('exception_error', ei);
+
+		try {
+			new Ajax.Request("backend.php", {
+				parameters: {op: "rpc", method: "log", logmsg: msg},
+				onComplete: function (transport) {
+					console.log(transport.responseText);
+				} });
+
+		} catch (eii) {
+			console.log("Third exception while trying to log the error! Seriously?");
+			console.log(eii);
+		}
+
+		msg += "\n\nThe error will be reported to the configured log destination.";
+
 		alert(msg);
 	}
 
-- 
GitLab