我正在尝试移植一个从Firefox到IE的扩展。这个扩展的所有代码都是用JS编写的(没有C++组件),所以我想我应该重用这些代码,只为mozilla的特定部分而烦恼(这无疑也是一种折磨,但我认为这比从头开始重写它要痛苦得多)。
FF扩展封装在一个JS对象中,该对象在"load“事件期间被初始化。然后在"DOMContentLoaded“事件上触发扩展的”业务“代码。
我最初的计划是创建一个WSC (窗口脚本组件),并在那里侦听onLoad事件,基本上做与原始代码相同的事情。但是,我发现我JavaScript脚本组件中没有隐式的全局窗口对象,
我的B计划是在我的C++ BHO代码中侦听"onBeforeNavigate2“事件,并调用JS代码来处理那里的扩展对象初始化。因此,我决定将浏览器窗口对象作为" window“参数传递给onBeforeNavigate JS函数,并重写原始扩展代码以使用显式的"window”变量,而不是依赖隐式的全局对象。
但是,当我处理"OnDocumentComplete“事件(再次在BHO中侦听它,并将浏览器窗口对象作为参数传递给WSC中的JS函数)时,我收到一个"Can't execute code from a freed script”错误。
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脚本组件
发布于 2011-02-16 03:51:03
听起来,当JS最终执行时,您对窗口对象的引用不再有效- What causes the error "Can't execute code from a freed script"
有几件事你可以尝试一下:
只需使用win.document.parentWindow而不是win.document.parentWindow.top,它应该指向有效的窗口引用。因为"top“可以指向父框架或窗口,而您最终会在所提供的链接中找到原因之一。
检查以确保对myNS.extObject的引用没有在bho中被销毁。您可能应该尝试在OnDocumentComplete中捕获每个语句,因为这两个语句中的任何一个都可能给出您看到的错误,并且两者都有不同的分辨率。
最后,如果可以,使用IE - http://msdn.microsoft.com/en-us/library/bb735853(v=vs.85).aspx中的上下文菜单执行扩展
然后,您就可以通过javascript中的external.menuArguments对象访问window对象。
https://stackoverflow.com/questions/4978670
复制相似问题