【问题标题】:Override web page's javascript function using firefox addon sdk使用 firefox 插件 sdk 覆盖网页的 javascript 函数
【发布时间】:2014-03-29 00:44:51
【问题描述】:

我正在尝试从我的插件内容脚本中覆盖网页中名为 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,我应该被允许覆盖,嗯?

【问题讨论】:

    标签: firefox-addon firefox-addon-sdk


    【解决方案1】:

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

    如果您无法控制该网页,则有一个 hacky 解决方法。在您的内容脚本中,您可以直接通过全局变量unsafeWindow 访问页面的窗口对象:

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

    对此有两个主要警告:

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

    【讨论】:

    • 这看起来确实像我可能需要的,但我无法完全理解他们say 将其用于我需要的用途。你介意写一个我应该如何使用它的示例(比如,比如我发布的示例)吗?
    • 嗯,这正是我要发送给您的链接和示例。基本上,您只需使用 postMessage 从页面发送消息并在内容脚本中收听它们,如下例所示:developer.mozilla.org/en-US/Add-ons/SDK/Guides/Content_Scripts/… ...将内容脚本视为从页面到主要附加代码的自定义管道。
    • 我想我明白他们的意思,但就我而言,网页不是我可以控制的。所以,对我来说没有意义的是如何向/从网页/内容脚本发送消息将有助于实现覆盖/重新定义 JS 函数的效果。我错过了什么?
    • 啊,好吧,我以为你可以控制页面。
    【解决方案2】:

    与其依赖unsafeWindow hack,不如考虑使用 DOM。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 2015-07-05
      • 2011-11-22
      • 1970-01-01
      • 2010-10-30
      相关资源
      最近更新 更多