Index: chrome/browser/browser_main_gtk.cc |
diff --git a/chrome/browser/browser_main_gtk.cc b/chrome/browser/browser_main_gtk.cc |
index 520c652bbd7053e4c712bb2a913c6cf30e05b345..25147c8df1567ff4cbe6e3d1e20b63496d30b631 100644 |
--- a/chrome/browser/browser_main_gtk.cc |
+++ b/chrome/browser/browser_main_gtk.cc |
@@ -4,8 +4,12 @@ |
#include "chrome/browser/browser_main.h" |
+#include "app/x11_util.h" |
+#include "app/x11_util_internal.h" |
#include "base/command_line.h" |
#include "base/debug_util.h" |
+#include "chrome/browser/browser_list.h" |
+#include "chrome/browser/browser_main_gtk.h" |
#include "chrome/browser/browser_main_win.h" |
#include "chrome/browser/metrics/metrics_service.h" |
#include "chrome/common/result_codes.h" |
@@ -14,6 +18,30 @@ |
#include "chrome/app/breakpad_linux.h" |
#endif |
+namespace { |
+ |
+// Indicates that we're currently responding to an IO error (by shutting down). |
+bool g_in_x11_io_error_handler = false; |
+ |
+int BrowserX11ErrorHandler(Display* d, XErrorEvent* error) { |
+ if (!g_in_x11_io_error_handler) |
+ LOG(ERROR) << x11_util::GetErrorEventDescription(error); |
+ return 0; |
+} |
+ |
+int BrowserX11IOErrorHandler(Display* d) { |
+ // If there's an IO error it likely means the X server has gone away |
+ if (!g_in_x11_io_error_handler) { |
+ g_in_x11_io_error_handler = true; |
+ LOG(ERROR) << "X IO Error detected"; |
+ BrowserList::WindowsSessionEnding(); |
+ } |
+ |
+ return 0; |
+} |
+ |
+} // namespace |
+ |
void DidEndMainMessageLoop() { |
} |
@@ -46,3 +74,11 @@ bool CheckMachineLevelInstall() { |
void PrepareRestartOnCrashEnviroment(const CommandLine &parsed_command_line) { |
} |
+ |
+void SetBrowserX11ErrorHandlers() { |
+ // Set up error handlers to make sure profile gets written if X server |
+ // goes away. |
+ x11_util::SetX11ErrorHandlers( |
+ BrowserX11ErrorHandler, |
+ BrowserX11IOErrorHandler); |
+} |