HTML переходное модальное окно

У нас есть устаревшее веб-приложение. В разных местах открывается окно с помощью Privilege Manager в Firefox, чтобы получить нужный результат. Некоторые из этих окон открывают апплет Java или документ PDF. Клиентские машины обновляют Firefox, и Privilege Manager пропал.

Какой самый простой способ обойти это? Проблемы:

  1. В любое время должен быть только один экземпляр всплывающего окна. Это можно сделать, выбрав соответствующее имя окна на window.open() вызов.

  2. Если окно открывается снова (посредством действий пользователя), оно не должно перезагружаться, а просто фокусироваться, чтобы вывести его на передний план (я видел, что для этого я могу сохранить ссылку на окно в JavaScript)

  3. По сути, он действительно должен быть временным / модальным, чтобы клиент не мог покинуть текущую страницу или перезагрузить его, или любой другой вид взаимодействия с родительским окном (кроме открытия / перефокусировки дочернего окна) без предварительного закрытия дочернего окна. Я понятия не имею, как это сделать.

У кого-нибудь есть идеи как это сделать?

Клиент - только Firefox (он работает в специальной конфигурации киоска) в Linux.

Я где-то читал, что могу как-то написать расширение, но я в основном не разбираюсь в расширениях и их API.

Edit1:

Пример (упрощенного) устаревшего кода. Не совсем уверен, что все разрешения были необходимы, но это так: эта функция открывает окно, которое остается над родительским окном и предотвращает любое взаимодействие пользователя с родительским окном.

function fWindowOpen(url, name) {
    netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
    netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");
    netscape.security.PrivilegeManager
            .enablePrivilege("CapabilityPreferencesAccess");
    netscape.security.PrivilegeManager
            .enablePrivilege("UniversalPreferencesWrite");
    netscape.security.PrivilegeManager
            .enablePrivilege("UniversalPreferencesRead");
    netscape.security.PrivilegeManager.enablePrivilege("UniversalFileRead");
    netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
    window.open(
        url,
        name,
        "screenX=70,dependent=yes,menubar=0,toolbar=0,width=900,height=700,modal=1,dialog=1"
        );
}

function fnCapture(){
    fWindowOpen("/path/to/document_or_japplet/page","_blank");                      
}

HTML:

<button value="Capture" property="btnCapture" onclick="javascript:fnCapture();"/>

Edit2: решение

На типичном расширении в коде xul определите этот код JavaScript:

var dialogExt = {
 listener: function(evt) {
  // Do work with parameters read through evt.target.getAttribute("attribute_name")
  window.openDialog(evt.target.getAttribute("url"), evt.target.getAttribute("name"), evt.target.getAttribute("features"));
 }
}
// from examples
document.addEventListener("dialogExtEvent", function(e){ dialogExt.listener(e); }, false, true);

Затем на веб-странице:

var element = document.createElement("dialogExtElement");
element.setAttribute("url", url);
element.setAttribute("name", name);
element.setAttribute("features", features);
document.documentElement.appendChild(element);
var evt = document.createEvent("Events");
evt.initEvent("dialogExtEvent", true, false);
element.dispatchEvent(evt);

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

2 ответа

Решение

Диспетчер привилегий устарел в Firefox 12 и удален в Firefox 17 ( ненадолго восстановлен).

Вы можете посмотреть в Window.showModalDialog(), Однако он устарел и, как ожидается, исчезнет в течение года или в 2016 году, если вы перейдете с расширенным сервисным выпуском (ESR) Firefox 38. Это может быть временным решением при разработке расширения.

Чтобы выполнить те же задачи, вам нужно написать расширение и попросить пользователя установить его (из Обход ограничений безопасности и кода подписи, старая информация о Privilege Manager):

Сайты, которые требуют дополнительных разрешений, теперь должны попросить пользователей Firefox установить расширение, которое может взаимодействовать с непривилегированными страницами, если это необходимо.

Можно написать такое расширение, используя любой из трех различных типов расширений:

  1. XUL оверлей
  2. Restartless/Bootstrap
  3. SDK дополнения

Для первых двух типов вы бы использовали window.open(), modal опция находится в разделе "Функции, требующие привилегий". Вы, вероятно, также хотите посмотреть на Window.openDialog(),

Для надстройки SDK вы обычно используете open() Функция в модуле окна / утилиты SDK. Здесь, опять же, вы, вероятно, захотите посмотреть на openDialog(),

Похоже, вы открываете контент, который предоставляется из Интернета в этих модальных окнах. Маловероятно, что вы получите одобренное расширение для размещения в AMO, которое открывает контент в таких окнах, которые не включены в выпуск дополнения. Это не означает, что вы не можете разработать расширение и установить его на своих клиентах киоска, не размещая его на AMO. Однако в этом году для Firefox существуют дополнительные ограничения в разработке, что значительно усложнит задачу, см. "Введение подписи расширений: более безопасный опыт надстройки".

Вы должны быть в состоянии получить подобное window.open поведение, включая поддержку modal опция из модуля окна / утилиты SDK.

Вам нужно будет установить прослушиватель onclick с помощью скрипта контента, отправить сообщение на addon-main через его порт, а затем открыть это окно с addon main.

Другие вопросы по тегам