使用firefox addon sdk覆盖网页的javascript函数

时间:2014-03-29 00:44:51

标签: firefox-addon firefox-addon-sdk

我试图从我的附加组件内容脚本覆盖网页中名为replaceMe的JS函数,但我发现原始函数实现总是被执行。

原始HTML包含以下函数定义:

function replaceMe()
{
  alert('original');
}

我试图覆盖我的加载项,如(main.js):

tabs.activeTab.attach({
  contentScriptFile: self.data.url("replacerContent.js")
});

这是replacerContent.js的样子:

this.replaceMe = function()
{
  alert('overridden');
}

然而,当我运行我的插件时,我总是看到文本original被警告,这意味着replacerContent.js中的重新定义从未生效。你能让我知道为什么吗? replaceMe不是privileged method,我应该被允许覆盖,是吗?

2 个答案:

答案 0 :(得分:1)

这是因为Web内容和内容脚本之间存在有意的安全性。如果您想在Web内容之间进行通信,并且您也可以控制网页,则应使用postMessage。

如果您无法控制网页,则会有一个黑客的解决方法。在内容脚本中,您可以通过全局变量unsafeWindow

直接访问页面的窗口对象
var aliased = unsafeWindow.somefunction;

unsafeWindow.somefunction = function(args) {
    // do stuff
    aliased(args);
}

这有两个主要的注意事项:

  1. 这是不安全的,因此您永远不应该信任来自该页面的数据。
  2. 我们从未考虑过unsafeWindow hack,并计划将其删除并将其替换为更安全的api。

答案 1 :(得分:0)

不要依赖unsafeWindow黑客,而应考虑使用DOM。

您可以从内容脚本创建页面脚本:

var script = 'rwt=function()();';
document.addEventListener('DOMContentLoaded', function() {
    var scriptEl = document.createElement('script');
    scriptEl.textContent = script;
    document.head.appendChild(scriptEl);
});

这种方法的好处是你可以在没有unsafeWindow的环境中使用它。 G。镀铬扩展。

然后,您可以使用postMessage或DOM事件在页面脚本和内容脚本之间进行通信。