Я сделал простой плагин NPRuntime, вызывающий функцию Javascript при загрузке.
Пример основан на seamonkey, и он отлично работает в Google Chrome, но не работает в FireFox.
Я проследил код, чтобы найти, что не так, и нашел эту строку.
NPObject* window;
NPError err = NPN_GetValue(pNPP, NPNVWindowNPObject, &window);
if (!window)
_log("Can not get DOM window %d", err);
ошибка возвращает NPERR_INVALID_PARAM.
Этот простой пример может хорошо работать на старой версии Firefox, я думаю … 12.0? 13,0? (Я не уверен) Теперь я использую FireFox 15.0, который является последней версией.
Любая помощь будет оценена.
Таким образом, похоже, что ваш реальный вопрос о том, как вызвать материал javascript из другого потока, поскольку вы не можете выполнять вызовы NPN_ из других потоков. Короткий ответ: вы не можете; Чем длиннее, тем сложнее ответ, что это боль, но это можно сделать.
NPAPI имеет функцию под названием NPN_PluginThreadAsyncCall. Он принимает два параметра; первый — это указатель на функцию, который возвращает void и принимает void *, а второй — это void *, который будет передан этой функции. Вы можете вызывать эту функцию из любого потока, и это приведет к тому, что ваш обратный вызов будет вызван в главном потоке «когда-нибудь скоро».
Хитрость заключается в том, чтобы убедиться, что ваш void * дает вам все данные, которые вам нужны, чтобы вернуться к тому, что вам нужно для доступа во время этого вызова. Большая хитрость — сделать так, чтобы это казалось синхронным, если это то, что вам нужно. Первое можно сделать с помощью указателей и убедитесь, что вы убираете за собой; второе можно сделать с мьютексом и сигналом, если вы умны.
Это сложно и сложно понять правильно. Если это вариант, вы можете рассмотреть возможность использования FireBreath потому что он делает все это для вас. В частности, поскольку FireBreath имеет обходные пути для различных случайных браузеров, которые не поддерживают NPN_PluginThreadAsyncCall (как некоторые версии Opera и Safari 5.1 и более поздние версии).
Других решений пока нет …