#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. Однако это не позволяет вам устанавливать свойства в окне содержимого.