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

#javascript #firefox #firefox-addon

#javascript #firefox #firefox-дополнение

Вопрос:

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

 top.myobj = {val : 3};
  

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

Есть идеи?

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

Ответ №1:

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

 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. Вероятно, это намного больше кода, чем необходимо. Если надстройка уже находится в области браузера, как и большинство надстроек, то для получения объекта браузера можно вызвать getBrowser(): getBrowser().addEventListener(…)

2. К сожалению, OP не предоставил подробных сведений об обстоятельствах. В этом случае я решил, что слишком много лучше, чем слишком мало.

3. Проблема в том, что кто-то, попадающий на эту страницу, может просто скопировать это «многое», ничего из этого не понимая. Поэтому, пожалуйста, не делайте этого 🙂

4. @Nikolay, ты хочешь сказать, что ответ бесполезен? Голоса против не предназначены для обеспечения соблюдения ваших личных предпочтений в отношении длины ответа. Ответ полезен или нет?

Ответ №2:

Вы должны использовать evalInSandbox для выполнения назначения в контексте window.content аналогично этому коду:

 // |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, так что все в порядке.

Комментарии:

1. Примечание: Объект Components устарел. Это скоро будет удалено.

2. Um, no. Удаление объекта Components выполняется только для содержимого. Это не влияет на код в моем ответе.

Ответ №3:

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

Комментарии:

1. Однако это не позволяет вам устанавливать свойства в окне содержимого.