summaryrefslogtreecommitdiffstats
path: root/abs/core/qt/QtWebKit_Flash.patch
blob: 102f73c9d733ef83d480ddedb7e2aee15002f749 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
--- PluginPackageQt.cpp.orig	2010-06-30 21:29:47.178707288 +0000
+++ PluginPackageQt.cpp	2010-06-30 21:35:40.185441603 +0000
@@ -36,6 +36,8 @@
 
 namespace WebCore {
 
+typedef void gtkInitFunc(int *argc, char ***argv); 
+
 bool PluginPackage::fetchInfo()
 {
     if (!load())
@@ -100,7 +102,8 @@
 
     NP_InitializeFuncPtr NP_Initialize;
     NPError npErr;
-
+    gtkInitFunc* gtkInit;
+    
     NP_Initialize = (NP_InitializeFuncPtr)m_module->resolve("NP_Initialize");
     m_NPP_Shutdown = (NPP_ShutdownProcPtr)m_module->resolve("NP_Shutdown");
 
@@ -157,6 +160,26 @@
     m_browserFuncs.enumerate = _NPN_Enumerate;
     m_browserFuncs.construct = _NPN_Construct;
 
+    // WORKAROUND: Prevent gtk based plugin crashes such as BR# 40567 by
+    // explicitly forcing the initializing of Gtk, i.e. calling gtk_init,
+    // whenver the symbol is present in the plugin library loaded above.
+    // Note that this workaround is based on code from the NSPluginClass ctor
+    // in KDE's kdebase/apps/nsplugins/viewer/nsplugin.cpp file.
+    gtkInit = (gtkInitFunc*)m_module->resolve("gtk_init");
+    if (gtkInit) {
+        // Prevent gtk_init() from replacing the X error handlers, since the Gtk
+        // handlers abort when they receive an X error, thus killing the viewer.
+#ifdef Q_WS_X11
+        int (*old_error_handler)(Display*, XErrorEvent*) = XSetErrorHandler(0);
+        int (*old_io_error_handler)(Display*) = XSetIOErrorHandler(0);
+#endif
+        gtkInit(0, 0);
+#ifdef Q_WS_X11
+        XSetErrorHandler(old_error_handler);
+        XSetIOErrorHandler(old_io_error_handler);
+#endif
+}
+
 #if defined(XP_UNIX)
     npErr = NP_Initialize(&m_browserFuncs, &m_pluginFuncs);
 #else