Плагин NPAPI со сценариями не работает с Firefox

Я разрабатываю расширение FF и плагин, которые работают в тандеме. My Extension вставляет плагин npapi в html и вызывает некоторый метод плагина после того, как происходит событие.

Вот код, который я использую для инъекции:

if (window.content.document.getElementById("rondyoHookMessageElement") == null) {
            var element = window.content.document.createElement("object");
            element.type = "application/x-hook-msg";
            element.id = "rondyoHookMessageElement";
            element.width = 0;
            element.height = 0;
            window.content.document.body.appendChild(element);
}

И когда мне нужно использовать метод плагина, я делаю следующее:

var element = window.content.document.getElementById("rondyoHookMessageElement");
element.SomeFunc();

Я подтверждаю, что элемент найден, но регистрация element.SomeFunc возвращает undefined.

Если я ввожу плагин npapi вручную:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
</head>
<body>
<object id="plugin" type="application/plugin-mime" width=200 height=200 border=5></object>
<script type="text/javascript">
    var plugin = document.getElementById("plugin");
    dump(plugin.SomeFunc + "\n");
</script>
</body>
</html>

Возвращает function SomeFunc() { [native code] }

ОС: Mac OS X 10.6.7

FF: 3.6.13


person Kentzo    schedule 16.04.2011    source источник


Ответы (2)


Если вы сделаете это в FireFox 4, у вас есть приличный шанс вывести браузер из строя (ошибка была зарегистрирована, но еще не исправлена). не рекомендуется устанавливать тип тега объекта перед его внедрением в DOM; вы будете вести себя по-разному в каждом браузере. Подождите, пока вы поместите объект в дом, а затем введите его.

Другая возможная проблема заключается в том, что иногда браузеру требуется некоторое время после его внедрения в DOM, прежде чем плагин станет доступным, поэтому, если вы используете setTimeout для ожидания полсекунды или около того, он может начать работать в этот момент.

person taxilian    schedule 16.04.2011
comment
Таймаут уже есть. Я думаю, это проблема безопасности: код JS расширения не может использовать плагин NPAPI, введенный в html страницы. Но я не уверен и еще не тестировал. - person Kentzo; 17.04.2011

Я решил проблему, расширив скрипт, который вызывает SomeFunc:

if (window.content.document.getElementById("rondyoHookMessageElement") == null) {
            var element = window.content.document.createElement("object");
            element.type = "application/x-hook-msg";
            element.id = "rondyoHookMessageElement";
            element.width = 0;
            element.height = 0;
            window.content.document.body.appendChild(element);

            var script = doc.createElement("script");
            script.type = "text/javascript";
            script.innerHTML = 'function f(doc, messageId, data) { document.getElementById("rondyoHookMessageElement").SomeFunc(doc, messageId, data); };';
            doc.body.appendChild(script);
}

Когда мне нужно вызвать эту функцию из расширения, я делаю:

window.content.document.defaultView.wrappedJSObject.f(null, mes, false);
person Kentzo    schedule 17.04.2011