Сценарий NPAPI с плагинами не работает с Firefox
Я разрабатываю расширение FF и плагин, которые работают в тандеме. Мое расширение вводит плагин 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
2 ответа
Если вы сделаете это в FireFox 4, у вас будет неплохая вероятность сбить браузер (ошибка зарегистрирована, но еще не исправлена). не рекомендуется устанавливать тип тега объекта перед его внедрением в DOM; вы получите различное поведение в каждом браузере. Подождите, пока вы не положите объект в дом, а затем введите его.
Другая возможная проблема заключается в том, что браузеру иногда требуется некоторое время после внедрения его в DOM, прежде чем плагин становится доступным, поэтому, если вы используете setTimeout, чтобы подождать полсекунды, он может начать работать в этот момент.
Я решил проблему, расширив скрипт, который вызывает 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);