Установить объект в объект окна страницы из расширения Firefox?

Я хочу, чтобы мое расширение Firefox добавляло объект в окно содержимого просматриваемой страницы. Я хочу, чтобы это имело тот же эффект, что и запуск:

top.myobj = {val : 3};

внутри элемента скрипта на странице.

Любые идеи?

Я не думаю, что здесь есть риск для безопасности, поскольку я добавляю объект только с одним целочисленным свойством. Есть ли простой способ получить объект окна содержимого из кода расширения?


person Yaniv    schedule 17.09.2009    source источник


Ответы (3)


использовать

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
        }
    }
}
person Jonathan Fingland    schedule 17.09.2009
comment
Вероятно, это больше кода, чем нужно. Если надстройка уже находится в области браузера, как и большинство надстроек, то можно вызвать getBrowser() для получения объекта браузера: getBrowser().addEventListener(...) - person sdwilsh; 17.09.2009
comment
К сожалению, ОП не предоставил подробностей об обстоятельствах. В данном случае я решил, что лучше слишком много, чем слишком мало. - person Jonathan Fingland; 17.09.2009
comment
Проблема в том, что кто-то, попавший на эту страницу, может просто скопировать так много, ничего не понимая. Так что, пожалуйста, не делайте этого :) - person Nickolay; 12.10.2009
comment
@ Николай, ты говоришь, что ответ бесполезен? Голоса против не предназначены для того, чтобы навязывать ваши личные предпочтения длины ответа. Полезен ответ или нет? - person Jonathan Fingland; 12.10.2009

Вы должны использовать evalInSandbox для выполнения назначения в контексте window.content аналогично < href="http://groups.google.com/group/mozilla.dev.extensions/msg/3ba40f23b0bf2253" rel="nofollow noreferrer">этот код:

// |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 есть сеттеры), поэтому прикосновение к содержимому всегда опасно. Приведенный выше пример касается только небезопасного объекта (content.wrappedJSObject) в песочнице без разрешений Chrome, так что все в порядке.

person Nickolay    schedule 12.10.2009
comment
Примечание. Объект «Компоненты» устарел. Вскоре он будет удален. - person Lucky; 07.03.2013
comment
Эм, нет. Удаление объекта «Компоненты» касается только содержимого. Это не влияет на код в моем ответе. - person Nickolay; 08.03.2013

Должно ли это быть окно или может быть сам документ? Вы всегда можете использовать content.document для ссылки на саму страницу. Или window.content для основного окна содержимого.

person Chris Doggett    schedule 17.09.2009
comment
Однако это не позволяет вам устанавливать свойства в окне содержимого. - person Nickolay; 12.10.2009