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

当我将其他插件嵌入其中时,QtBrowserPlugin崩溃:我的修复是否正确?,qt,qwebview,browser-plugin,Qt,Qwebview,Browser Plugin,有一个包含QWebView的QtBrowserPlugin,它加载一个包含其他插件的页面 (opera (some_page (my_qtbrowser_plugin (QWebView (some_other_page (some_other_plugin)))))) 为什么在加载一个加载或试图加载其他插件的页面后,它会停止向QtBrowserPlugin发送事件

有一个包含QWebView的QtBrowserPlugin,它加载一个包含其他插件的页面

(opera 
    (some_page 
        (my_qtbrowser_plugin 
            (QWebView 
                (some_other_page 
                    (some_other_plugin))))))
为什么在加载一个加载或试图加载其他插件的页面后,它会停止向QtBrowserPlugin发送事件(来自外部的任何JS调用都会崩溃:)

在stacktrace中,我看到:

#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
更新2我的修复是否正确


对于全屏要求,在没有更多细节的情况下建议合理的解决方案有点棘手。但是,对于分层插件,您应该进行研究(我不知道
QtBrowserPlugin
是否支持它们,应该在下一版本中支持它们)

我不认为你真的可以解决这个问题——两个浏览器引擎都将你的插件作为一个共享库加载,并且由于处于相同的过程中而获得相同的实例。现在他们都想调用
NP\u Initialize()
来交换函数指针,这使得您无法同时与这两种浏览器对话:
您可以单独存储
NPNetspaceFuncs
,但您无法(没有重大的黑客攻击)检测哪个浏览器实际调用
NPP_New()
等,因此无法确定应该从哪个插件调用哪个浏览器

黑客的解决方法可能是实际使用两个不同的插件,每个浏览器引擎使用一个插件。但是请记住,如果同时使用其他插件,也可以破坏它们。

另一种解决全屏问题的方法可能是调用一个单独的进程,它可以让您完全控制GUI元素。

/*请求新标签:qtbrowserplugin*/Phew,为什么您的插件中需要一个新的webkit?:)@Georg Fritzsche,主要是对1。能够使其全屏显示,2。将web内容放在视频窗口上方。在qt windowful插件中,我可以创建一个新窗口并将控件从插件区域移动到该窗口或从该窗口移动控件。新窗口可能会工作(取决于平台,例如,强烈建议在Mac OS X上),但通过插件移动网站中的元素(我认为您想做的事情)只有在插件没有窗口的情况下才有效。无论如何,如前所述:如果您设置为打开包含不同浏览器引擎和相同NPAPI插件的新窗口,则应打开另一个进程。
*** 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
...
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;