从firefox扩展访问文档的javascript变量

时间:2010-01-20 17:34:05

标签: javascript firefox-addon

Firefox扩展(工具栏)是否可以访问文档的变量?详细解释如下..

加载文件:

<script type="text/javascript">
var variableForExtension = 'something';
</script>

延伸:

var win = window.top.getBrowser().selectedBrowser.contentWindow;
alert(win.variableForExtension); // undefined

这是第一件尝试,由于安全机制( XPCNativeWrapper ),这种方式无法访问。我读过关于通过 wrappedJSObject 访问它并使用事件(将侦听器添加到文档并从扩展中调度事件),但没有运气。但是并没有太努力。所以,在我深入挖掘之前('事件方法'听起来像是一种方式),我想知道这是否可能?

感谢

3 个答案:

答案 0 :(得分:15)

是的,访问内容中的JS变量始终是可行的。在较旧的Firefox版本中,这种天真的方式并不安全(在某种意义上,恶意网页可以获得Chrome权限)。

1)如果您控制网页并希望将信息传递给扩展程序,那么您确实应该使用events technique。这在所有Firefox版本中都很有效。

2)如果你想从内容文档中读取一个值,你可以绕过XPCNativeWrapper:

var win = window.top.getBrowser().selectedBrowser.contentWindow;
// By the way, this could just be
//   var win = content;
// or 
//   var win = gBrowser.contentWindow;
alert(win.variableForExtension); // undefined
win.wrappedJSObject.variableForExtension // voila!

在Firefox 3之前这是不安全的。在Firefox 3及更高版本中可以使用,你会得到另一种包装器(XPCSafeJSObjectWrapper),它看起来与从内容页面到你的代码的对象相同,但确保内容页面无法做任何恶意的事情。

3)如果你需要在内容网页中调用一个函数或在页面的上下文中运行你自己的代码,那就更复杂了。有人在其他地方多次询问和回答,但遗憾的是从未完全记录过。由于这与您的问题无关,因此我不会详细介绍。

答案 1 :(得分:4)

不那么难:)

在扩展名中:

var jso=window.content.document.defaultView.wrappedJSObject;

现在您可以从扩展程序访问网页中的任何功能或全局变量:

alert(jso.pagevar);

jso.pagefunction("hey");

答案 2 :(得分:0)

如果您正在使用新的高级SDK,那么accessing the variable via content scripts会有所不同。您无法直接从添加代码访问JavaScript对象,但您可以通过 unsafeWindow 对象从已附加到打开页面的内容脚本中访问它们。例如:

require("sdk/tabs").open({
  url: 'http://www.example.com/some/page/',
  onOpen: function(tab) {
    var worker = tab.attach({
      contentScript: 'unsafeWindow.variableForExtension = 1000;'
    });
  }
});

要阅读变量,您需要使用 worker 变量中的端口方法,如Mozilla's content script article.

中所述

请注意,在处理对象和函数时存在一些安全限制。有关详细信息,请参阅文章。