我希望我的Firefox扩展程序将对象添加到浏览页面的内容窗口中。我希望它与运行具有相同的效果:
top.myobj = {val : 3};
页面中的脚本元素。
有什么想法吗?
我不认为这里存在安全风险,因为我只添加一个具有单个整数属性的对象。有没有一种简单的方法可以从扩展代码中获取内容窗口对象?
答案 0 :(得分:2)
使用
var mainWindow = window
.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebNavigation)
.QueryInterface(Components.interfaces.nsIDocShellTreeItem).rootTreeItem
.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindow);
mainWindow.getBrowser().addEventListener("DOMContentLoaded",
youreventhandler, true);
function youreventhandler(event) {
if (event.originalTarget instanceof HTMLDocument) {
var doc = event.originalTarget;
//doc = the document in the just loaded window
var win = doc.defaultView;
// if it's just a frame element, then return and wait for the
// main event to fire.
if (win.frameElement)
return;
else {
win.myobj = { val: 3};
//your other code here
}
}
}
答案 1 :(得分:1)
您应该使用evalInSandbox在window.content
的上下文中执行分配,类似于this code:
// |content| refers to the current tab's |window| object
var s = new Components.utils.Sandbox(content);
s.window = content;
Components.utils.evalInSandbox(
"window.wrappedJSObject.test = function() { } ", s)
顺便说一下,“我不认为这里存在安全风险” - 向对象添加属性可能会导致执行代码(因为JS有setter),因此触摸内容总是很危险。上面的示例只触及没有chrome权限的沙箱中的不安全对象(content.wrappedJSObject
),所以没关系。
答案 2 :(得分:-1)
它是否需要成为窗口,还是文档本身?您始终可以使用content.document引用页面本身。或者window.content作为主要内容窗口。