HTML瞬态模式窗口(HTML transient modal window)

2019-10-22 06:35发布

我们有一个传统的Web应用程序。 在不同的地方它会打开权限管理员对Firefox浏览器的帮助,以获得所需结果的窗口。 有些窗户打开,Java applet或PDF文档。 客户机正在更新Firefox和权限管理员走了。

什么是它周围的最简单的方法? 这些问题是:

  1. 必须有只有一个人时弹出的实例。 这可以通过选择合适的窗口名行window.open()调用。

  2. 如果再次打开窗口(由用户操作的手段),它不应该重新加载,但只关注将其带到前台(我已经看到了,我可以继续对JavaScript的窗口的引用来做到这一点)

  3. 它基本上真的必须是瞬时/模式,使客户端不能离开当前页面或重装或任何其他形式的互动与父窗口(除开/重新聚焦子窗口)不首先关闭子窗口。 我不知道该怎么做。

不要任何人有一个想法如何做到这一点?

客户端只有火狐(它工作在一个特殊的亭配置)在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);

现在,也许我错过了一些安全检查,以让代码工作,如果它在同一台主机发起,以及如何处理该请求的对话框,对话框窗口之间的交互方式的文档的引用,它的揭幕战。

Answer 1:

的权限管理器是在Firefox 12弃用,在Firefox 17除去 ( 简要地恢复 )。

你可能想看看Window.showModalDialog() 然而,它已被弃用,并有望在年内消失,还是在2016年,如果你有一个扩展服务版本(ESR)的Firefox 38,而你开发一个扩展它可能是一个临时的解决方案去。

为了完成同样的任务,你需要编写一个扩展,并要求用户安装它(从绕过安全限制和代码签名 ,有关权限管理员旧的信息):

需要额外权限的网站现在应该让Firefox用户安装的扩展 ,它可以与非特权页面交互如果需要的话。

所以能够写出这样使用任何三种不同扩展类型的扩展:

  1. XUL覆盖
  2. 无需重启/引导
  3. 附加SDK

对于前两种类型,你可以使用window.open()modal选项是“功能要求的权限” 。 你可能也想看看Window.openDialog()

对于附加的SDK,您通常使用open()的SDK在功能窗口/ utils的模块。 在这里,同样,你可能会想看看openDialog()

看来你可能会打开是从这些模态窗口的网页提供的内容。 这是不可能的,你会得到批准上托管的扩展AMO这这不包括在附加发布这样的窗口中打开的内容。 这并不意味着你不能开发扩展,让它在你的亭客户端上安装不收留了它的AMO。 不过,也有今年这将使该显著更加困难,看到发展的其他限制为Firefox: “引进推广签名:更安全的附加体验” 。



Answer 2:

你应该能够得到similiar window.open行为,包括为支持modal从SDK的选项窗口/ utils的模块。

你将不得不使用安装的onclick监听内容脚本 ,通过其端口发送一个消息给插件,主要然后从插件主打开该窗口。



文章来源: HTML transient modal window