HTML瞬态模态窗口

时间:2015-03-13 16:53:04

标签: javascript firefox modal-dialog firefox-addon privileges

我们有一个遗留的Web应用程序。在各个地方,它在Firefox上的Privilege Manager的帮助下打开一个窗口,以获得所需的结果。 其中一些窗口打开Java小程序或PDF文档。 客户端计算机正在更新Firefox,并且Privilege Manager已消失。

最简单的方法是什么? 问题是:

  1. 任何时候都必须只有一个弹出窗口的实例。这可以通过在window.open()电话上选择适当的窗口名称来完成。

  2. 如果窗口再次打开(通过用户操作),它不应该重新加载,而只是将焦点放到前台(我已经看到我可以在JavaScript上保留对窗口的引用来执行该操作)

  3. 它基本上必须是瞬态/模态,以便客户端不能离开当前页面或重新加载或与父窗口的任何其他类型的交互(除了打开/重新聚焦子窗口),而不首先关闭子窗口。我不知道该怎么做。
  4. 有人知道该怎么做吗?

    客户端只是Linux上的Firefox(它在特殊的kiosk配置中工作)。

    我读到某个地方,我可以以某种方式编写扩展,但我基本上对扩展及其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 个答案:

答案 0 :(得分:2)

您应该能够获得类似的window.open行为,包括支持sdk的window/utils模块中的modal选项。

您必须使用content script安装onclick侦听器,通过其端口向addon-main发送消息,然后从插件主打开该窗口。

答案 1 :(得分:2)

Privilege Managerdeprecated in Firefox 12 and removed in Firefox 17briefly restored)。

您可能需要查看Window.showModalDialog()。但是,它已被弃用,并且预计会在一年内消失,或者如果您使用Firefox 38的扩展服务版本(ESR),它将在2016年消失。在您开发扩展时,它可能是一个临时解决方案。

为了完成相同的任务,您需要编写一个扩展并要求用户安装它(来自Bypassing Security Restrictions and Signing Code,有关权限管理器的旧信息):

  

需要其他权限的网站现在应该要求Firefox用户安装extension,如果需要,可以interact with non-privileged pages

可以使用三种不同的扩展类型中的任何一种来编写这样的扩展名:

  1. XUL overlay
  2. Restartless/Bootstrap
  3. Add-on SDK
  4. 对于前两种类型,您将使用window.open()modal选项位于"Features requiring privileges"。您可能还想查看Window.openDialog()

    对于附加组件SDK,您通常会使用SDK的open()模块中的window/utils功能。在这里,您可能还想查看openDialog()

    您可能正在打开这些模式窗口中从Web提供的内容。您不太可能获得批准在[{3}}上托管的扩展程序,该扩展程序会在此类窗口中打开未包含在附加发行版中的内容。这并不意味着您无法开发扩展程序并将其安装在自助服务终端客户端上而无需在AMO上托管它。但是,今年Firefox的开发还有其他限制,这将使这一点变得更加困难,请参阅:AMO