Портирование расширения FF на IE: нет объекта глобального окна в JS WSC - PullRequest
1 голос
/ 12 февраля 2011

Я пытаюсь перенести расширение с Firefox на IE.Весь код расширения написан на JS (без компонентов C ++), поэтому я решил, что буду использовать этот код повторно и только буду беспокоиться о специфических частях Mozilla (что, без сомнения, тоже пытка, но я думаю, что это менее болезненно, чем переписывать его).с нуля).

Расширение FF обернуто в объект JS, который инициализируется во время события load.Затем «бизнес» код расширения запускается по событию «DOMContentLoaded».

Мой первоначальный план состоял в том, чтобы создать WSC (Window Scripting Component) и прослушивать там событие onLoad и в основном делать то же самое, чтооригинальный код делает.Однако я обнаружил, что в моем компоненте сценариев JavaScript нет неявного объекта глобального окна,

Мой план B заключался в том, чтобы прослушать событие "onBeforeNavigate2" в моем коде BHO C ++ и вызвать код JS WSC, который обрабатывает расширениеинициализация объекта там.Поэтому я решил передать объект окна браузера в качестве параметра «окна» JS-функции onBeforeNavigate и переписать исходный код расширения для использования явной переменной «окна» вместо того, чтобы полагаться на неявный глобальный объект.

Однако, когда я обрабатываю событие «OnDocumentComplete» (еще раз прослушивая его в BHO и передавая объект окна браузера в качестве аргумента функции JS в WSC), я получаю «Не могу«Выполнить код из освобожденного сценария» ошибка.

Код WSC выглядит следующим образом:

<?xml version="1.0"?>
<component>
<registration
   ...
>
</registration>
<public>
 <method name="OnBeforeNavigate">
   <parameter name="win" />
 </method>
 <method name="OnDocumentComplete">
   <parameter name="win" />
 </method>
</public>
<script src="sharedjs/foo.js" />
<script language="JScript">
<![CDATA[

var window;

function OnBeforeNavigate(win)
{
   window = win.document.parentWindow.top;
   window.myNS.extObject = initExtensionObject(...);
}
function OnDocumentComplete(win)
{
   window = win.document.parentWindow.top;
   var obj = window.myNS.extObject;
   obj.doTheBusinessStuff();
}
]]>
</script>
</component>

Я предполагаю, что это потому, что WSC выгружается после возврата из функции обработчика.Однако в объекте окна браузера есть ссылка на объект расширения JS, поэтому я ожидаю, что браузер сохранит код.

Итак, в чем здесь моя ошибка, пожалуйста?

Приветствия, Том

PS: WSC означает Windows Scripting Component

1 Ответ

2 голосов
/ 15 февраля 2011

Похоже, что ваша ссылка на объект окна больше не действительна, когда JS наконец выполняет - Что вызывает ошибку «Не удается выполнить код из освобожденного сценария»

Несколько вещей, которые вы можете попробовать:

вместо win.document.parentWindow.top, просто используйте win.document.parentWindow, который должен указывать на действительную ссылку на окно. Например, «top» может указывать на родительский фрейм или окно, и в результате вы получите одну из причин в указанной ссылке.

Убедитесь, что ссылка на myNS.extObject не уничтожена в bho. Вам, вероятно, следует попытаться перехватить каждое утверждение в OnDocumentComplete, потому что любое из них может выдавать ошибку, которую вы видите, и оба имеют разные разрешения.

Наконец, если вы можете, выполните расширение, используя контекстное меню в IE - http://msdn.microsoft.com/en-us/library/bb735853(v=vs.85).aspx

Тогда у вас будет доступ к объекту окна через объект external.menuArguments в javascript land.

...