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

In newer versions of Firefox, is it still possible to override a web page's JS function?

我正在编写一个扩展来覆盖网页的 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 用法是什么?

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

的章节
function blah() {}

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

事实证明,问题是函数 rwt 的重新定义正在与原始定义赛跑并获胜。原始版本在我定义的函数之后运行并覆盖了我定义的函数,因此看起来我的重新定义已经悄无声息地失败了。

一旦我意识到这是问题所在,最简单的破解方法就是在 data/google-script.js.

中的重新定义中添加超时
setTimeout(function() {
    unsafeWindow.rwt=function(){};
}, 1000);

因此,orignal answer 仍然是正确的,只是未能解决竞争条件。

尽管内容脚本共享 DOM,但它们在其他方面与页面脚本是隔离的。正如您正确推测的那样,可以在 Firefox 中使用 unsafeWindow 来绕过这种隔离。

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

因此我提出了另一种方法来做到这一点:利用这些范围之间共享的东西,我。 e. DOM。

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

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

这种方法的好处是您可以在没有 unsafeWindow 的环境中使用它,例如。 G。 chrome 个扩展名。