如何在 Firefox Add-on SDK 中将构造函数从特权范围导出到较低特权范围

How to export a constructor from privileged scope to a less-privileged scope in Firefox Add-on SDK

我正在尝试编写一个 Firefox 扩展,它连接到 WebAudio 并向所有 AudioContext 添加 'master-gain'。

我试图通过覆盖 window 命名空间中的 AudioContext 构造函数来实现这一点。这样,当用户尝试访问 destination 时,我可以 return 一个 GainNode(内部连接到 destination)。这是一个 hack,但我认为它可能有用。

我目前正在努力将我的 newAudioContext 构造函数从插件脚本(特权范围)导出到页面脚本(较低特权)。

我试过了...

unsafeWindow.AudioContext = cloneInto(newAudioContext,unsafeWindow);

但我仍然在页面脚本中得到原始的 AudioContext。

我也试过了

exportFunction(newAudioContext, unsafeWindow, {defineAs: "AudioContext"});

但是将其导出为函数而不是构造函数。

我知道结构化克隆有局限性,但有没有其他方法可以覆盖 AddOn 中的 window.AudioContext?

如果您需要在非特权上下文中 运行 更复杂的代码(例如对象构造),您可以通过 mozIJSSubScriptLoader. 加载脚本后,任何需要调用特权代码的函数都可以从 chrome 端修补到其原型中。

您可以在 DOM 解析之前执行此操作 - 因此在任何内容脚本执行之前 - 通过侦听 DOMWindowCreated 事件。

您必须从 frame script 执行此操作,因为插件-sdk 的页面-mod 沙箱没有足够的权限来访问脚本加载器。

将与不安全 window 的交互保持在最低限度,即 运行ning 代码完全在具有 xrays 的特权环境中或完全在不受信任的环境中具有最少的无论如何,这两者之间的粘合方法似乎是很好的安全卫生。

当然你应该知道内容代码将能够分离和mod验证你在内容中创建的任何类。毕竟是不可信的