Index: content/utility/utility_main.cc |
diff --git a/content/utility/utility_main.cc b/content/utility/utility_main.cc |
index c93c1eca5366ae0c3c53f75af3de4a88593262fc..29fd01b2938c8670f721f01e6899963f25a3dcd5 100644 |
--- a/content/utility/utility_main.cc |
+++ b/content/utility/utility_main.cc |
@@ -17,6 +17,12 @@ |
#include "sandbox/win/src/sandbox.h" |
#endif |
+#if defined(TOOLKIT_GTK) |
+#include <gtk/gtk.h> |
+ |
+#include "ui/gfx/gtk_util.h" |
+#endif |
+ |
namespace content { |
// Mainline routine for running as the utility process. |
@@ -26,10 +32,40 @@ int UtilityMain(const MainFunctionParams& parameters) { |
base::PlatformThread::SetName("CrUtilityMain"); |
#if defined(OS_LINUX) |
- // Initialize the sandbox before any thread is created. |
+ // Initializes the sandbox before any threads are created. |
+ // TODO(jorgelo): move this after GTK initialization when we enable a strict |
+ // Seccomp-BPF policy. |
LinuxSandbox::InitializeSandbox(); |
#endif |
+#if defined(OS_POSIX) |
+ // The utility process is used to load plugins (see OnLoadPlugins() in |
+ // utility_thread_impl.cc). Some plugins expect the browser to have loaded |
+ // GLib/GTK. |
+ // Due to bugs in GLib we need to initialize GLib/GTK before we start threads, |
+ // see crbug.com/309093. |
+ |
+#if defined(TOOLKIT_GTK) |
+ bool is_sandboxed = false; |
+ |
+#if defined(OS_LINUX) |
+ // On Linux, we only initialize GLib/GTK if we're not sandboxed. |
+ is_sandboxed = !parameters.command_line.HasSwitch(switches::kNoSandbox); |
+#endif |
+ |
+ if (!is_sandboxed) { |
+ // g_thread_init() is deprecated since glib 2.31.0, please see release note: |
+ // http://mail.gnome.org/archives/gnome-announce-list/2011-October/msg00041.html |
+#if !(GLIB_CHECK_VERSION(2, 31, 0)) |
+ if (!g_thread_get_initialized()) { |
+ g_thread_init(NULL); |
+ } |
+#endif |
+ gfx::GtkInitFromCommandLine(*CommandLine::ForCurrentProcess()); |
+ } |
+#endif |
+#endif |
+ |
ChildProcess utility_process; |
utility_process.set_main_thread(new UtilityThreadImpl()); |