Как создать скрытый iframe/браузер из компонента JavaScript XPCOM?

Мне нужен один скрытый iframe для всех открытых окон Firefox.

Сейчас я создаю iframe внутри оверлея XUL, поэтому он создается для каждого окна браузера.

Я думаю, что мне следует использовать компонент XPCOM, чтобы иметь один экземпляр iframe для всех окон браузера, но я не могу найти способ, как создавать из него элементы XUL.

Является ли это возможным?


person KAdot    schedule 28.06.2012    source источник


Ответы (1)


Вы можете создать фрейм внутри скрытого окна:

var hiddenWindow = Components.classes["@mozilla.org/appshell/appShellService;1"]
                             .getService(Components.interfaces.nsIAppShellService)
                             .hiddenDOMWindow;
var frame = hiddenWindow.document.getElementById("myExtensionFrame");
if (!frame)
{
  var XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  frame = hiddenWindow.document.createElementNS(XUL_NS, "iframe");
  frame.setAttribute("id", "myExtensionFrame");
  frame.setAttribute("src", "...");
  hiddenWindow.document.documentElement.appendChild(frame);
}

Однако, если все, что вам нужно, — это место для запуска вашего глобального кода, то есть способы получше, например код JavaScript. модули.

person Wladimir Palant    schedule 28.06.2012
comment
Хорошее решение, спасибо, но кажется, что любой (из других расширений) может изменить location.href скрытого окна, и мой код будет прерван. - person KAdot; 28.06.2012
comment
@KAdot: Теоретически - да. Практически - это было бы довольно разрушительно, ни одно расширение не делает этого. - person Wladimir Palant; 28.06.2012
comment
Каждое дополнение Firefox имеет гораздо больший контроль, чем требуется, например, оно может изменять основные функции браузера, а также нарушать работу других (конкурентов?) дополнений... Но то, что это возможно, не означает, что люди делают такие странные вещи. ... Так что можете смело считать, что ни один аддон не изменяет href скрытых окон... - person Sai Prasad; 30.06.2012
comment
Я пытаюсь использовать hiddenDOMWindow из загрузочного расширения. Если я пытаюсь получить доступ к hiddenDOMWindow в функции запуска, это вызывает ошибку. Компонент вернул код ошибки: 0x80004005 (NS_ERROR_FAILURE) [nsIApShellService.hiddenDOMWindow], но после некоторой задержки он работает нормально. Как я могу убедиться, что hiddenDOMWindow готов и я могу его использовать? - person KAdot; 08.11.2012
comment
Если nsIAppShellService.hiddenDOMWindow завершится сбоем, то одним из запасных вариантов будет зарегистрировать listener, чтобы получать уведомления при создании окна. Скрытое окно всегда открывается первым. Вам все равно придется добавить прослушиватель событий в это окно, чтобы дождаться его загрузки. - person Wladimir Palant; 09.11.2012