Разработка плагина Firefox [npapi] - Firefox зависает при вызове метода - PullRequest
3 голосов
/ 16 сентября 2009

Я пытаюсь научиться писать плагин для Firefox. Я скачал пример npruntime из Mozilla, скомпилировал его и запустил. Получение свойств из плагина работало хорошо, но когда я пытался вызов метода, Firefox завис. Я подумал, что с примером что-то не так, поэтому я написал свой собственный базовый плагин для сценариев, который имеет одно свойство и один метод, который возвращает строку. Свойство работало хорошо, но при вызове метода Firefox снова зависал.

Я что-то упустил? Я попытался отладить плагин, и все кажется нормально. Все правильно Вызываемые функции и значение возвращаются правильно. Если я пытаюсь остановить процесс, пока Firefox зависает, я останавливаюсь на Windows DLL, а не в своем коде и не в коде Firefox.

Если кто-нибудь может указать мне правильное направление ...

Спасибо.

Ответы [ 2 ]

6 голосов
/ 27 октября 2009

Я надеюсь, что вы решили это. Если это не так, я только что обнаружил, что пример (я полагаю, это был проклятый «образец npruntime») был ошибочным.

При возврате строки в примере использовалась функция strdup для выделения строки, переданной методом NP_something. Факт заключается в том, что NPAPI заботится о выделенной строке с этого момента и, когда пытается уничтожить ее, не может, поскольку strdup использует malloc, а не NPN_MemAlloc.

Решение НИКОГДА не использовать malloc или новое для объектов, которые мы передаем в функции NPAPI. В примере npruntime ошибка в строке 452:

STRINGZ_TO_NPVARIANT(strdup("foo return val"), *result);

и строка 466:

STRINGZ_TO_NPVARIANT(strdup("default method return val"), *result);

Я исправил это с помощью этого кода:

char* src = "foo return val";
char* out = (char *)NPN_MemAlloc(strlen(src) + 1);
strcpy(out, src);
STRINGZ_TO_NPVARIANT(out, *result);

и это сработало. Но можно подумать, что такой недостаток в образце должен быть исправлен сопровождающими Mozilla SDK.

0 голосов
/ 17 июня 2013

Я разработал npruntime для каждого браузера. Это работало хорошо во всех браузерах, но Firefox зависал только в Windows 7.

Я решил проблему, изменив конфигурацию firefox "dom.ipc.plugins.enabled" на false. Я не знаю, сработает ли это, но стоит попробовать.

...