Javascript 在页面中设置对象';来自Firefox扩展的Windows对象?

Javascript 在页面中设置对象';来自Firefox扩展的Windows对象?,javascript,firefox,firefox-addon,Javascript,Firefox,Firefox Addon,我希望我的Firefox扩展向浏览页面的内容窗口添加一个对象。我希望它具有与跑步相同的效果: top.myobj = {val : 3}; 在页面中的脚本元素中 有什么想法吗 我认为这里不存在安全风险,因为我只添加了一个具有单个整数属性的对象。有没有一种简单的方法可以从扩展代码中获取内容窗口对象?它需要是窗口还是文档本身?您可以始终使用content.document引用页面本身。或用于主内容窗口。使用 var mainWindow = window .QueryInterface(C

我希望我的Firefox扩展向浏览页面的内容窗口添加一个对象。我希望它具有与跑步相同的效果:

top.myobj = {val : 3};
在页面中的脚本元素中

有什么想法吗


我认为这里不存在安全风险,因为我只添加了一个具有单个整数属性的对象。有没有一种简单的方法可以从扩展代码中获取内容窗口对象?

它需要是窗口还是文档本身?您可以始终使用content.document引用页面本身。或用于主内容窗口。

使用

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
        }
    }
}
您应该使用在
窗口的上下文中执行分配。内容类似于:


顺便说一句,“我不认为这里有安全风险”-向对象添加属性可能会导致执行代码(因为JS有setter),因此触摸内容总是很危险的。上面的例子只涉及沙箱中不安全的对象(
content.wrappedJSObject
),没有chrome权限,所以这没关系。

这可能比需要的代码多得多。如果像大多数加载项一样,加载项已经在浏览器范围内,那么可以调用getBrowser()来获取浏览器对象:getBrowser()。addEventListener(…)不幸的是,OP没有提供有关情况的详细信息。在这种情况下,我认为太多总比太少好。问题是,登录此页面的人可能只是复制了这些“多”,而不理解其中的任何内容。所以请不要这样做:)@Nikolay,你是说答案没有用吗?否决票并不是为了强制执行你个人对答案长度的偏好。答案是否有用?但这不允许您在内容窗口中设置属性。注意:Components对象已弃用。它将很快被删除。嗯,不。组件对象删除只是内容。它不会影响我答案中的代码。
// |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)