Не могу получить окно DOM используя npapi

Я сделал простой плагин 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, который является последней версией.

Любая помощь будет оценена.

1 ответ

Решение

Таким образом, похоже, что ваш реальный вопрос о том, как вызвать материал javascript из другого потока, поскольку вы не можете выполнять вызовы NPN_ из других потоков. Короткий ответ: вы не можете; Чем длиннее, тем сложнее ответ, что это боль, но это можно сделать.

У NPAPI есть функция NPN_PluginThreadAsyncCall. Он принимает два параметра; первый - это указатель на функцию, который возвращает void и принимает void*, а второй - это void*, который будет передан этой функции. Вы можете вызывать эту функцию из любого потока, и это приведет к тому, что ваш обратный вызов будет вызван в главном потоке "когда-нибудь скоро".

Хитрость заключается в том, чтобы убедиться, что ваш void * дает вам все данные, необходимые для возврата к тому, что вам нужно для доступа во время этого вызова. Большая хитрость - сделать так, чтобы это казалось синхронным, если это то, что вам нужно. Первое можно сделать с помощью указателей и убедитесь, что вы убираете за собой; второе можно сделать с мьютексом и сигналом, если вы умны.

Это сложно и сложно понять правильно. Если это вариант, вы можете рассмотреть возможность использования FireBreath, потому что он делает все это за вас. В частности, поскольку FireBreath имеет обходные пути для различных случайных браузеров, которые не поддерживают NPN_PluginThreadAsyncCall (как некоторые версии Opera и Safari 5.1 и более поздние версии).

Другие вопросы по тегам