Xpoint
   [напомнить пароль]

как открывать JS popups и ссылки типа taget="_blank"

Метки: [без меток]
2008-07-01 12:01:41 [обр] KSSL[досье]

Иммется в XUL документе эелемент <browser>. В него можно загрузить страничку с помощью loadURI(). Как разрешить этой страничке открывать popup окна javascript'ом? Аналогично, как разрешить открывать новые окна для ссылок типа <a target="_blank" ...> ?

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

Используется xulrunner.

спустя 2 дня 12 часов [обр] Владимир Палант(434/4445)[досье]

Нужно, чтобы существовала установка browser.chromeURL — тогда XULRunner будет знать, какое окно открыть, чтобы можно было загрузить в него popup.

С перехватом URL сложнее, в общем случае ИМХО не реализуется. Можете назначить своему элементу <browser> обработчик события click, так это делает к примеру Prism. Но это поможет перехватить только окна, открывающиеся по щелчку пользователя. Решение для JavaScript-кода мне неизвестно.

спустя 4 дня [обр] KSSL[досье]

после долгих мучений разобрался, может кому-то пригодится:

  1. при автоматическом открытии popup windows (т.е. без участия пользователя), <browser> посылает событие DOMUpdatePageReport, которое нигде не документировано (слава Мозилле). Если поймать это событие, то свойство browser.pageReport будет являться массивом структур с информацией об открываемых popups. Каждая структура имеет вид

{
    popupWindowURI: nsIURI,
    popupWindowFeatures: string,
    popupWindowName: string,
    requestingWindow: объект window
    requestingDocument: объект document
    // ... (?) дальше не смотрел
}

Этот массив структур можно использовать для ручного открытия popups с помощью window.open(). С помощью permissionmanager'a можно также разрешить для данного URL'a все popups, тогда событие DOMUpdatePageReport приходить не будет, и popups будут сразу открываться без дополнительных уведомлений (слава Мозилле #2: разрешённые через permissionmanager всплывающие окна игнорируют popupWindowFeatures, и всегда имеют заголовок, статусбар и строку адреса).

  1. Для отслеживания открытия ссылок типа taget="_blank", нужно установить поле window.QueryInterface(Ci.nsIDOMChromeWindow).browserDOMWindow в свою структуру, в которой будут как минимум поля QueryInterface() и openURI():

window.QueryInterface(Ci.nsIDOMChromeWindow).browserDOMWindow = new myBAI();

function myBAI() {}

myBAI.prototype =
{
  QueryInterface : function(aIID)
  {
    if (aIID.equals(Ci.nsIBrowserDOMWindow) || aIID.equals(Ci.nsISupports))
      return this;

    throw Components.results.NS_NOINTERFACE;
  },

  openURI : function(aURI, aOpener, aWhere, aContext)
  {
      ...
  }
}

За дальнейшей информацией можно обратиться к файлу browser.js из состава firefox. Указанные примеры работают только в firefox (т.е. запускать приложение нужно как firefox -app ./application.ini), в xulrunner-1.9.0.0 ссылки типа taget="_blank" вообще не открываются.

спустя 7 дней [обр] Владимир Палант(434/4445)[досье]
Вообще-то, не документировано это событие не без причины — оно используется блокировщиком всплывающих окон, и для другого применения не предназначено. Насколько я помню, раньше оно и называлось иначе.
спустя 1 день 3 часа [обр] KSSL[досье]

>>Вообще-то, не документировано это событие не без причины — оно используется блокировщиком всплывающих окон, и для другого применения не предназначено.

У меня оно тоже используется блокировщиком всплывающих окон, только своим. Это нужно, т.к. если firefox выполняет чужой xul application (firefox -app application.ini), в котором есть <browser>, автоматические попапы открываться вообще не будут.

спустя 9 месяцев [обр] perloid[досье]
зачем такие извращения? я добавил в файле приложения defaults/preferences/prefs.js строку pref("browser.chromeURL", "about:blank"); как подсказали в самом начале.
Powered by POEM™ Engine Copyright © 2002-2005