Сбой QtBrowserPlugin, когда я вкладываю в него другой плагин: правильно ли мое исправление? - PullRequest
0 голосов
/ 08 октября 2010

Существует 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 голосов
/ 23 октября 2010

Для полноэкранного режима несколько сложно предложить разумные решения без каких-либо подробностей. Однако, для наложения плагинов вы должны посмотреть на плагины без окон (я не знаю, поддерживает ли их QtBrowserPlugin, FireBreath должен поддерживать их в следующем выпуске).

Я не думаю, что вы на самом деле можете решить проблему - оба движка браузера загружают ваш плагин как разделяемую библиотеку и получают один и тот же экземпляр из-за того, что находятся в одном и том же процессе. Теперь они оба хотят вызвать NP_Initialize() для обмена указателями функций, что делает невозможным общение с обоими браузерами:
Вы можете хранить отдельные NPNetspaceFuncs, но вы не можете (без серьезных хаков) определить, какой браузер на самом деле вызывает NPP_New() и т. Д., И, таким образом, не определить, какой браузер вам следует перезвонить с какого плагина.

Хакерский обходной путь может заключаться в использовании двух разных плагинов, по одному для каждого механизма браузера. Имейте в виду, однако, что вы можете сломать и другие плагины, если используете их в обоих.
Другой альтернативой для вашей полноэкранной проблемы может быть запуск отдельного процесса, который дает вам полный контроль над элементами GUI.

...