我们有一个旧版Web应用程序。在Firefox上的Privilege Manager的帮助下,它在各个地方打开一个窗口,以获取所需的结果。其中一些窗口可打开Java applet或PDF文档。客户端计算机正在更新Firefox,特权管理器消失了。
最简单的方法是什么?问题是:
任何时候都只能有一个弹出窗口实例。这可以通过在window.open()
呼叫中选择适当的窗口名称来完成。
如果再次打开窗口(通过用户操作),则不应重新加载该窗口,而应集中精力将其置于前台(我已经知道可以在JavaScript上保留对该窗口的引用)
有谁知道如何做到这一点?
客户端仅是Linux上的Firefox(可在特殊的信息亭配置中使用)。
我读过某处我可以写某种扩展的地方,但是基本上我对扩展及其API一无所知。
编辑1:
(简化的)旧版代码示例。不确定是否所有权限都是必需的,仅此而已:此函数将打开一个位于父窗口上方的窗口,并防止用户与父窗口进行任何交互。
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);
现在,也许我缺少一些安全检查,如果源于同一主机的代码可以正常工作,以及如何处理对请求对话框的文档的引用,以作为对话框窗口与打开器之间的交互方式。
的权限管理器是在Firefox 12弃用,在Firefox 17除去(简要地恢复)。
您可能需要调查Window.showModalDialog()
。但是,它已过时,并且如果您使用Firefox 38的扩展服务版本(ESR),则预计在一年内或在2016年消失。在您开发扩展程序时,它可能是一个临时解决方案。
为了完成相同的任务,您将需要编写一个扩展并要求用户安装它(来自“绕过安全限制和签名代码”,这是有关Privilege Manager的旧信息):
可以使用三种不同的扩展类型中的任何一种来编写这样的扩展:
对于前两种类型,您可以使用window.open()
。该modal
选项位于“要求特权的功能”中。您可能还会想看看Window.openDialog()
。
对于附加SDK,通常应使用open()
SDK的window / utils模块中的功能。再一次,您可能需要看一下openDialog()
。
在这些模式窗口中,您似乎正在打开从Web提供的内容。您不太可能会批准将扩展程序托管在AMO上,而该扩展程序会在此类窗口中打开内容,而这些窗口未包含在附加发行版中。这并不意味着您无法开发扩展并将其安装在信息亭客户端上,而无需在AMO上进行托管。但是,今年Firefox的开发存在其他限制,这将使这变得更加困难,请参阅:“引入扩展签名:更安全的附加体验”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句