2015-03-13 84 views
1

我们有一个遗留的Web应用程序。在不同的地方,它会在Firefox上的Privilege Manager的帮助下打开一个窗口,以获得所需的结果。 其中一些窗口打开Java小程序或PDF文档。 客户端计算机正在更新Firefox,并且特权管理器不见了。HTML瞬态模态窗口

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

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

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

  3. 它基本上必须是临时的/模态的,这样客户端才能在不关闭子窗口的情况下不离开当前页面或重新加载或与父窗口进行任何其他类型的交互(除了打开/重新对焦子窗口)。我不知道该怎么做。

有没有人有一个想法如何做到这一点?

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

我读了一些地方,我可以以某种方式写一个扩展名,但我基本上无法知道扩展和它的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); 

现在,也许我错过了一些安全检查,以便代码在源自同一主机的情况下可以正常工作,以及如何处理对话框窗口与对话窗口之间的交互方式以请求对话框的文档的引用。

+0

你能发表一个旧代码在做什么的例子吗?并且会在模态对话框可以接受的情况下自动关闭失焦? – the8472 2015-03-13 17:33:59

+0

我已经添加了一个简化的遗留代码示例。不知道失去焦点时自动关闭。我想如果他在孩子窗口上做了一些工作,这可能会成为用户的一个谜,但对我来说这似乎是一个可行的妥协。一个实际的瞬态/模式窗口将是更可取的,但如果我知道如何使用扩展完成它以及如何在html文档/ javascript和扩展之间进行交互。 – dabicho 2015-03-13 18:23:39

+0

您是否真的需要**新窗口来模拟Firefox *的全部内容,或者只是您所在的页面/您控制的页面?如果您只能为您所在的页面或您控制的网页使用模式,则不需要提升特权。如果它只是您控制的页面的模式,那么可以使用普通的非特权JavaScript来完成。 – Makyen 2015-03-13 20:36:26

回答

2

Privilege Managerdeprecated in Firefox 12 and removed in Firefox 17briefly restored)。您可能需要查看Window.showModalDialog()。但是,它已被淘汰,预计将在一年内消失,或者在2016年使用Firefox 38的扩展服务版本(ESR)。在开发扩展时,这可能是一个临时解决方案。

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

场所应现在要求Firefox用户安装一个extension,如果需要的话,它可以是interact with non-privileged pages

它可以写出这样使用任何三种不同扩展类型的扩展:

  1. XUL overlay
  2. Restartless/Bootstrap
  3. Add-on SDK

对于前两种类型,你会使用window.open()modal选项在"Features requiring privileges"。你可能也想看看Window.openDialog()

对于附加SDK,您通常会在SDK的window/utils模块中使用open()函数。在这里,再一次,你可能会想看看openDialog()

看来您可能会打开这些模式窗口中从网络提供的内容。您不太可能会获得批准在AMO上托管的扩展程序,该扩展程序会在未包含在附加发行版中的此类窗口中打开内容。这并不意味着您无法开发扩展并将其安装在自助终端客户端上,而无需将其托管在AMO上。但是,今年Firefox的开发还存在其他限制,这会使得这个问题变得更加困难,请参阅:"Introducing Extension Signing: A Safer Add-on Experience"

+0

谢谢。没有担心在什么地方托管扩展。它不会通过互联网使用,而只能在私人网络中使用。这些quioscs随浏览器配置而来。但很高兴知道。谢谢你们的签名。我们用java处理类似的情况。我希望它不会太麻烦。 – dabicho 2015-03-13 22:35:02

+0

非常感谢。中途在那里。我仍然需要将“打开”对话框的窗口中的引用传递给子窗口。 – dabicho 2015-03-18 00:07:45

1

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

您将不得不安装onclick监听器并使用content script,通过其端口向addon-main发送消息,然后从addon main打开该窗口。

+0

谢谢。我正在阅读。 – dabicho 2015-03-13 20:16:48