Linux: Install xlib error handlers to avoid crash on X11 error (issue #1337).

git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@1844 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
Marshall Greenblatt 2014-09-24 17:22:27 +00:00
parent 39ca06a66d
commit 418303a1ff
3 changed files with 78 additions and 0 deletions

View File

@ -46,6 +46,21 @@ class MainBrowserProvider : public OSRBrowserProvider {
} }
} g_main_browser_provider; } g_main_browser_provider;
int XErrorHandlerImpl(Display *display, XErrorEvent *event) {
LOG(WARNING)
<< "X error received: "
<< "type " << event->type << ", "
<< "serial " << event->serial << ", "
<< "error_code " << static_cast<int>(event->error_code) << ", "
<< "request_code " << static_cast<int>(event->request_code) << ", "
<< "minor_code " << static_cast<int>(event->minor_code);
return 0;
}
int XIOErrorHandlerImpl(Display *display) {
return 0;
}
void destroy(GtkWidget* widget, gpointer data) { void destroy(GtkWidget* widget, gpointer data) {
// Quitting CEF is handled in ClientHandler::OnBeforeClose(). // Quitting CEF is handled in ClientHandler::OnBeforeClose().
} }
@ -403,6 +418,11 @@ int main(int argc, char* argv[]) {
// Populate the settings based on command line arguments. // Populate the settings based on command line arguments.
AppGetSettings(settings); AppGetSettings(settings);
// Install xlib error handlers so that the application won't be terminated
// on non-fatal errors.
XSetErrorHandler(XErrorHandlerImpl);
XSetIOErrorHandler(XIOErrorHandlerImpl);
// Initialize CEF. // Initialize CEF.
CefInitialize(main_args, settings, app.get(), NULL); CefInitialize(main_args, settings, app.get(), NULL);

View File

@ -4,6 +4,28 @@
#include "cefsimple/simple_app.h" #include "cefsimple/simple_app.h"
#include <X11/Xlib.h>
namespace {
int XErrorHandlerImpl(Display *display, XErrorEvent *event) {
LOG(WARNING)
<< "X error received: "
<< "type " << event->type << ", "
<< "serial " << event->serial << ", "
<< "error_code " << static_cast<int>(event->error_code) << ", "
<< "request_code " << static_cast<int>(event->request_code) << ", "
<< "minor_code " << static_cast<int>(event->minor_code);
return 0;
}
int XIOErrorHandlerImpl(Display *display) {
return 0;
}
} // namespace
// Entry point function for all processes. // Entry point function for all processes.
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
// Provide CEF with command-line arguments. // Provide CEF with command-line arguments.
@ -25,6 +47,11 @@ int main(int argc, char* argv[]) {
// Specify CEF global settings here. // Specify CEF global settings here.
CefSettings settings; CefSettings settings;
// Install xlib error handlers so that the application won't be terminated
// on non-fatal errors.
XSetErrorHandler(XErrorHandlerImpl);
XSetIOErrorHandler(XIOErrorHandlerImpl);
// Initialize CEF for the browser process. // Initialize CEF for the browser process.
CefInitialize(main_args, settings, app.get(), NULL); CefInitialize(main_args, settings, app.get(), NULL);

View File

@ -5,6 +5,13 @@
// Include this first to avoid type conflicts with CEF headers. // Include this first to avoid type conflicts with CEF headers.
#include "tests/unittests/chromium_includes.h" #include "tests/unittests/chromium_includes.h"
#if defined(OS_LINUX)
#include <X11/Xlib.h>
// Definitions conflict with gtest.
#undef None
#undef Bool
#endif
#include "base/threading/thread.h" #include "base/threading/thread.h"
#include "include/base/cef_bind.h" #include "include/base/cef_bind.h"
@ -56,6 +63,23 @@ void RunTests(CefTestThread* thread) {
base::Bind(&CefTestThread::RunTests, base::Unretained(thread))); base::Bind(&CefTestThread::RunTests, base::Unretained(thread)));
} }
#if defined(OS_LINUX)
int XErrorHandlerImpl(Display *display, XErrorEvent *event) {
LOG(WARNING)
<< "X error received: "
<< "type " << event->type << ", "
<< "serial " << event->serial << ", "
<< "error_code " << static_cast<int>(event->error_code) << ", "
<< "request_code " << static_cast<int>(event->request_code) << ", "
<< "minor_code " << static_cast<int>(event->minor_code);
return 0;
}
int XIOErrorHandlerImpl(Display *display) {
return 0;
}
#endif // defined(OS_LINUX)
} // namespace } // namespace
@ -102,6 +126,13 @@ int main(int argc, char* argv[]) {
PlatformInit(); PlatformInit();
#endif #endif
#if defined(OS_LINUX)
// Install xlib error handlers so that the application won't be terminated
// on non-fatal errors.
XSetErrorHandler(XErrorHandlerImpl);
XSetIOErrorHandler(XIOErrorHandlerImpl);
#endif
// Initialize CEF. // Initialize CEF.
CefInitialize(main_args, settings, app, windows_sandbox_info); CefInitialize(main_args, settings, app, windows_sandbox_info);