Java 小程序弹出窗口在对话框外获得一个悬停警告图标
我们正在使用部署在kiosk类型环境中的Firefox 18.0.1来运行签名小程序。JDK和JRE都是JavaSE7U11。签名jar允许我们做沙盒小程序通常不能为其用户做的所有事情(漫游本地磁盘、与打印机交谈、窃取其所有pr0n等) applet和加载它的页面共同生成一些HTML和JavaScript;JavaScript和applet然后以一种几乎无缝的方式来回对话。有时小程序会创建弹出对话框;它们要么由用户单击Java组件触发,要么由用户单击带有“onclick”脚本的HTML小部件触发,该脚本告诉小程序创建一个对话框 上周,我注意到小程序的一些弹出对话框有些不稳定。对话框外部悬挂着一个小小的警告图标: 如果用户移动该图标,该图标将粘在对话框上。将鼠标悬停在图标上会弹出一个小的“JavaApplet窗口”工具提示,这非常有趣,因为并不是所有对话框都与它一起出现 该快照中显示的窗口是使用此测试代码创建的。(是的,使用JOptionPane的方法较短,但它不会复制我们的实际代码。有些对话框比其他对话框更为定制。)Java 小程序弹出窗口在对话框外获得一个悬停警告图标,java,firefox,applet,Java,Firefox,Applet,我们正在使用部署在kiosk类型环境中的Firefox 18.0.1来运行签名小程序。JDK和JRE都是JavaSE7U11。签名jar允许我们做沙盒小程序通常不能为其用户做的所有事情(漫游本地磁盘、与打印机交谈、窃取其所有pr0n等) applet和加载它的页面共同生成一些HTML和JavaScript;JavaScript和applet然后以一种几乎无缝的方式来回对话。有时小程序会创建弹出对话框;它们要么由用户单击Java组件触发,要么由用户单击带有“onclick”脚本的HTML小部件触发
我花了大约一个小时与谷歌拥抱,希望它能向我透露一些东西,但我在那里找不到任何关于这一点的提及。这是Firefox还是JRE?或者,更好的问题是:是什么导致警告图标出现在某些对话框上而不是其他对话框上?嗯,现在我觉得自己很傻。我已经玩了好几个小时了,什么都没得到,把问题贴在这里,去喝我的第14杯咖啡,然后在搅拌奶油的时候,我得到了答案。区别在于: 用户单击已签名的小程序小部件直接触发的弹出窗口是“正常”的 用户单击HTML/JavaScript对象触发的弹出窗口,以及调用签名Java函数的“onclick”脚本,都会标记为警告 每当javascript函数调用带签名的小程序时,该小程序在调用长度上被视为未签名。这可能是一个类似的预防措施,但我还没有证实这一点。在这两种情况下,解决方案是相同的:找到需要“不,这真的是安全的,我是认真的”状态的最小的代码段,并在其周围包装一个
privilegedeceptionAction
。或者至少,这是将其他javascript转换为带签名的小程序调用的正确解决方案,所以我在这里尝试了它,它成功了。:-)
在我们的实际代码中,显示对话框的部分(从
createDialog
开始)具有自己的功能。将对该函数的调用替换为AccessController.doPrivileged()
,对该函数的包装调用会处理所有问题。没有更多的警告图标 这是一个firefox的东西。@fmodos如果你能提供更多的信息(并且让你的答案更长;),我建议你回答这个问题。。。我的错误是,我在这篇文章中做了一个非常快速的阅读,错过了他说它只发生在HTML事件中的部分,无论如何,我只是做了一个快速的研究,下面的链接似乎有一个解决这个问题的方法@fmodos好链接,谢谢!他们似乎采取了“轮询式”方法,即不安全线程为安全线程设置要测试和响应的标志。这是使用privilegedeceptionAction
的常见替代方法,但我不知道为什么使用priv'd action一开始并不能像对我一样解决问题。问得好。经过仔细研究的答案。很高兴你把它整理好了。:)
import java.awt.BorderLayout;
import javax.swing.JApplet;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class WhereTheHellDoesTheIconComeFrom
{
private JPanel topPanel;
public WhereTheHellDoesTheIconComeFrom (JApplet applet) {
// Multiple panels with a text blob in each
JLabel exampleText = new JLabel ("some text here", JLabel.CENTER);
topPanel = new JPanel (new BorderLayout(5,0));
topPanel.add (exampleText, BorderLayout.CENTER);
// Create the options pane.
Object allpanels[] = new Object[] {
topPanel,
};
Object buttons[] = { "B1", "B2" };
JOptionPane optionPane = new JOptionPane (allpanels,
JOptionPane.PLAIN_MESSAGE,
JOptionPane.OK_CANCEL_OPTION,
null, // no icon built in
buttons,
buttons[0]); // select this button by default
// Ask it for the visible popup.
JDialog dialog = optionPane.createDialog(
SwingUtilities.getWindowAncestor(applet),
"This is the title text");
dialog.setResizable(false);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
// Modal dialog blocks on the previous line; at this point I can
// examine getValue() and make decisions, etc, etc.
}
}