在Firefox扩展中设置页面窗口对象中的对象?

时间:2009-09-17 13:20:41

标签: javascript firefox firefox-addon

我希望我的Firefox扩展程序将对象添加到浏览页面的内容窗口中。我希望它与运行具有相同的效果:

top.myobj = {val : 3};

页面中的脚本元素。

有什么想法吗?

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

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)

您应该使用evalInSandboxwindow.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作为主要内容窗口。