当我将其他插件嵌入其中时,QtBrowserPlugin崩溃:我的修复是否正确?

时间:2010-10-08 12:37:14

标签: qt qwebview browser-plugin

有QtBrowserPlugin,其中包含加载包含其他插件的页面的QWebView。

(opera 
    (some_page 
        (my_qtbrowser_plugin 
            (QWebView 
                (some_other_page 
                    (some_other_plugin))))))

为什么在加载加载或尝试加载其他插件的页面后,它会停止将事件调度到QtBrowserPlugin(从外部的任何JS调用崩溃:http://sprunge.us/HeZA

在堆栈跟踪中,我看到:

#3  <signal handler called>
#4  0xb63ae1f2 in WebCore::IdentifierRep::string() const () from /usr/local/Trolltech/Qt-4.7.0/lib/libQtWebKit.so.4
#5  0xb63b339c in _NPN_UTF8FromIdentifier () from /usr/local/Trolltech/Qt-4.7.0/lib/libQtWebKit.so.4
#6  0xb76e3d51 in NPN_UTF8FromIdentifier (identifier=0x7ffffffe) at .../src/qtbrowserplugin.cpp:200
#7  0xb76e4aaf in NPClass_HasMethod (npobj=0x80e5c80, name=0x7ffffffe) at .../src/qtbrowserplugin.cpp:364

为什么qtbrowserplugin中的代码会调用QtWebKit中的内容?有没有其他想法如何调试/修复它?

更新我刚刚发现它调用了qtbrowserplugin.cpp:NP_Initialize两次(http://sprunge.us/BdfQ):

*** GDB BACKTRACE ***
#2  0xb78ad817 in NP_Initialize (nFuncs=0x807599c, pFuncs=0x8074740) at /mnt/sda8/src/p/qtbrowserplugin-2.4_1-opensource/src/qtbrowserplugin.cpp:1273
#3  0x080556ea in Handle::Open(char const*, _NPNetscapeFuncs*) ()
#4  0x08056692 in pluginController::open(char const*) ()
#5  0x08055ca8 in main ()
*** END OF BACKTRACE ***
** (operapluginwrapper:1281): DEBUG: NP_Initialize
** (operapluginwrapper:1281): DEBUG: NP_Initialize succeeded

*** GDB BACKTRACE ***
#2  0xb78ad817 in NP_Initialize (nFuncs=0xb4357094, pFuncs=0xb4357058) at /mnt/sda8/src/p/qtbrowserplugin-2.4_1-opensource/src/qtbrowserplugin.cpp:
#3  0xb6af7dae in WebCore::PluginPackage::load() () from /usr/local/Trolltech/Qt-4.7.0/lib/libQtWebKit.so.4
#4  0xb6af774d in WebCore::PluginPackage::fetchInfo() () from /usr/local/Trolltech/Qt-4.7.0/lib/libQtWebKit.so.4
#5  0xb69578ae in WebCore::PluginPackage::createPackage(WebCore::String const&, long const&) () from /usr/local/Trolltech/Qt-4.7.0/lib/libQtWebKit.so.4
...

更新2 我的修正是否正确? http://vi-server.org/vi/bin/qtbrowserplugin-2.4_1-opensource-netsing-fix.patch

diff --git a/qtbrowserplugin-2.4_1-opensource.orig/src/qtbrowserplugin.cpp b/qtbrowserplugin-2.4_1-opensource/src/qtbrowserplugin.cpp
index e7c6f31..632d546 100644
--- a/qtbrowserplugin-2.4_1-opensource.orig/src/qtbrowserplugin.cpp
+++ b/qtbrowserplugin-2.4_1-opensource/src/qtbrowserplugin.cpp
@@ -1271,6 +1271,10 @@ extern "C" NPError WINAPI NP_Initialize(NPNetscapeFuncs* nFuncs, NPPluginFuncs*
 {
     if(!nFuncs)
         return NPERR_INVALID_FUNCTABLE_ERROR;
+    
+    if(qNetscapeFuncs) {
+        return NPERR_INVALID_PLUGIN_ERROR;
+    }

     qNetscapeFuncs = nFuncs;
     int navMajorVers = qNetscapeFuncs->version >> 8;

1 个答案:

答案 0 :(得分:0)

对于全屏要求,在没有更多细节的情况下提出合理的解决方案有点棘手。但是,对于分层插件,您应该查看windowless plugins(我不知道QtBrowserPlugin是否支持它们,FireBreath应该在下一个版本中支持它们。

我认为您无法解决问题 - 两个浏览器引擎都会将您的插件作为共享库加载,并且由于处于相同的进程而获得相同的实例。现在他们都想调用NP_Initialize()来交换函数指针,这使你无法与两个浏览器交谈:
您可以存储单独的NPNetspaceFuncs,但您不能(没有主要黑客)检测哪个浏览器实际调用NPP_New()等,因此无法确定应从哪个插件回调哪个浏览器。

一个hacky解决方法可能是实际使用两个不同的插件,每个插件用于一个浏览器引擎。但请记住,如果在两者中使用它们,也可以破坏其他插件 全屏问题的另一种替代方法可能是调用单独的进程,这使您可以完全控制GUI元素。