将FF扩展移植到IE:JS WSC中没有全局窗口对象

时间:2011-02-12 14:49:27

标签: javascript windows internet-explorer bho

我正在尝试将扩展程序从Firefox移植到IE。所有扩展的代码都在JS(没有C ++组件)中,所以我想我会重用代码并且只会麻烦自己使用它的mozilla特定部分(这无疑也是一种折磨,但我认为它比重写它更痛苦)从头开始)。

FF扩展包装在一个JS对象中,该对象在“load”事件期间被初始化。然后,在“DOMContentLoaded”事件上触发扩展的“业务”代码。

我最初的计划是创建一个WSC(Window Scripting Component)并在那里监听onLoad事件,并且基本上做与原始代码相同的事情。但是,我发现我的JavaScript脚本组件中没有隐式的全局窗口对象,

我的计划B是在我的C ++ BHO代码中监听“onBeforeNavigate2”事件,并调用处理扩展对象初始化的JS WSC代码。所以我决定将浏览器窗口对象作为“窗口”参数传递给onBeforeNavigate JS函数,并重写原始扩展代码以使用显式“窗口”变量,而不是依赖于隐式全局对象。

然而,当我处理“OnDocumentComplete”事件(再次在BHO中侦听它并将浏览器窗口对象作为参数传递给WSC中的JS函数)时,我得到一个“无法执行代码一个释放的脚本“错误。

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 个答案:

答案 0 :(得分:2)

听起来,当JS最终执行时,您对窗口对象的引用不再有效 - What causes the error "Can't execute code from a freed script"

你可以尝试一些事情:

而不是win.document.parentWindow.top,只需使用应指向有效窗口引用的win.document.parentWindow。因为“top”可以指向父框架或窗口,并且您最终得到了提供的链接中的一个原因。

检查以确保在bho中没有销毁对myNS.extObject的引用。您应该尝试捕获OnDocumentComplete中的每个语句,因为它们可能会给您看到的错误,并且两者都有不同的分辨率。

最后,如果可以,请使用IE中的上下文菜单执行扩展 - http://msdn.microsoft.com/en-us/library/bb735853(v=vs.85).aspx

然后你可以通过javascript land中的external.menuArguments对象访问window对象。