在较新版本的Firefox中,是否仍然可以覆盖网页的JS功能?

时间:2015-12-31 01:37:50

标签: javascript firefox firefox-addon firefox-addon-sdk

我正在编写一个扩展来覆盖网页的JS功能,并从this question开始,但答案似乎不适用于Linux上的Firefox 42。

接下来,我尝试使用documentation中描述的exportFunction,但也默默地失败了。

package.json内,我添加了以下内容。

  "permissions": {
      "unsafe-content-script": true
  }

这是我的index.js文件。

var self = require('sdk/self');
require("sdk/tabs").on("ready", fixGoogle);

function fixGoogle(tab) {
    if (tab.url.indexOf("google.com") > -1) {
        tab.attach({
            contentScriptFile: self.data.url("google-script.js")
        });
    } 
}

这是我当前的data/google-script.js

unsafeWindow.rwt=function(){};

请注意,在浏览器控制台中手动输入rwt=function(){};可以达到预期的效果,就像使用书签(需要点击)一样,但我每次使用Google时都会自动编写插件。

是否可以使用Firefox扩展覆盖rwt页面功能?如果是这样,使用的API是什么?

3 个答案:

答案 0 :(得分:1)

阅读您链接到的文档,特别是标题为Expose functions to page scripts的章节 - 链接到exportFunction

function blah() {}

exportFunction(blah, unsafeWindow, {defineAs: 'rwt'});

答案 1 :(得分:1)

事实证明,问题是重新定义函数rwt正在与原始定义竞争并获胜。原始版本在我定义的函数之后运行并覆盖它,从而使我的重新定义看起来像是默默无效。

一旦我意识到这就是问题,最简单的方法是在data/google-script.js内为重新定义添加超时。

setTimeout(function() {
    unsafeWindow.rwt=function(){};
}, 1000);

因此,orignal answer仍然是正确的,但根本无法解决竞争条件。

答案 2 :(得分:0)

即使内容脚本共享DOM,它们也会与页面脚本隔离。正如您所推测的那样,可以在Firefox中使用unsafeWindow来绕过此隔离。

就我个人而言,由于某种原因,我不喜欢unsafeWindow的名字;)

因此我建议采用另一种方法:利用这些范围之间共享的东西,即:即DOM。

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

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

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