HTML переходное модальное окно
У нас есть устаревшее веб-приложение. В разных местах открывается окно с помощью Privilege Manager в Firefox, чтобы получить нужный результат. Некоторые из этих окон открывают апплет Java или документ PDF. Клиентские машины обновляют Firefox, и Privilege Manager пропал.
Какой самый простой способ обойти это? Проблемы:
В любое время должен быть только один экземпляр всплывающего окна. Это можно сделать, выбрав соответствующее имя окна на
window.open()
вызов.Если окно открывается снова (посредством действий пользователя), оно не должно перезагружаться, а просто фокусироваться, чтобы вывести его на передний план (я видел, что для этого я могу сохранить ссылку на окно в JavaScript)
- По сути, он действительно должен быть временным / модальным, чтобы клиент не мог покинуть текущую страницу или перезагрузить его, или любой другой вид взаимодействия с родительским окном (кроме открытия / перефокусировки дочернего окна) без предварительного закрытия дочернего окна. Я понятия не имею, как это сделать.
У кого-нибудь есть идеи как это сделать?
Клиент - только 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 установить расширение, которое может взаимодействовать с непривилегированными страницами, если это необходимо.
Можно написать такое расширение, используя любой из трех различных типов расширений:
Для первых двух типов вы бы использовали window.open()
, modal
опция находится в разделе "Функции, требующие привилегий". Вы, вероятно, также хотите посмотреть на Window.openDialog()
,
Для надстройки SDK вы обычно используете open()
Функция в модуле окна / утилиты SDK. Здесь, опять же, вы, вероятно, захотите посмотреть на openDialog()
,
Похоже, вы открываете контент, который предоставляется из Интернета в этих модальных окнах. Маловероятно, что вы получите одобренное расширение для размещения в AMO, которое открывает контент в таких окнах, которые не включены в выпуск дополнения. Это не означает, что вы не можете разработать расширение и установить его на своих клиентах киоска, не размещая его на AMO. Однако в этом году для Firefox существуют дополнительные ограничения в разработке, что значительно усложнит задачу, см. "Введение подписи расширений: более безопасный опыт надстройки".
Вы должны быть в состоянии получить подобное window.open
поведение, включая поддержку modal
опция из модуля окна / утилиты SDK.
Вам нужно будет установить прослушиватель onclick с помощью скрипта контента, отправить сообщение на addon-main через его порт, а затем открыть это окно с addon main.