Applet弹出窗口在对话框外获得一个悬停警告图标

时间:2013-01-22 22:43:48

标签: java firefox applet

我们正在使用部署在自助服务终端类型环境中的Firefox 18.0.1来运行已签名的小程序。 JDK和JRE都是JavaSE 7u11。签名的jar允许我们完成沙盒applet通常无法为其用户做的所有事情(漫游本地磁盘,与打印机交谈,窃取所有pr0n等)。

applet和加载它的页面共同生成一些HTML和JavaScript;然后,JavaScript和applet以大多数无缝的方式来回交谈。有时applet会创建弹出对话框;这些是由用户点击Java组件触发的,或者是由用户点击某个带有" onclick"告诉applet进行对话的脚本。

在上周,我发现了一些applet的弹出对话框。他们在对话框中悬挂 的小警告图标:

tiny little bang

如果用户移动图标,则图标会粘贴到对话框中。将鼠标悬停在图标上会弹出一点“Java Applet Window"工具提示,这是特别有趣的,因为并非所有的对话框都与它一起出现。

该快照中显示的窗口是使用此测试代码创建的。 (是的,有更短的方法可以使用JOptionPane,但它不会复制我们的实际代码。有些对话框比其他对话框更加个性化。)

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.
    }
}

我花了大约一个小时与谷歌抱抱,希望它可能会向我揭示一些东西,但我无法在那里找到任何提及。这是Firefox的东西还是JRE的东西?或者,更好的问题:是什么导致警告图标出现在某些对话框而不是其他对话框上?

1 个答案:

答案 0 :(得分:1)

嗯,现在我觉得很傻。我一直在玩这个几个小时,无处可去,在这里发布问题,去拿我的第14杯咖啡,然后在奶油搅拌的同时回答我。这是区别:

直接从用户点击已签名的applet小部件触发的弹出窗口是“正常的”。

用户点击HTML / JavaScript对象触发的弹出窗口,以及调用签名Java函数的“onclick”脚本会被标记为警告。

只要javascript函数调用签名的applet,applet就会被视为无符号的调用长度。这可能是类似的预防措施生效,但我实际上并没有证实这一点。在这两种情况下,解决方案都是相同的:找到最小代码段,需要“没有真正安全,我的意思是”状态,并在其周围包裹PrivilegedExceptionAction。或者至少,这是其他javascript-to-signed-applet调用的正确解决方案,所以我在这里尝试了它并且它有效。 : - )

在我们的实际代码中,显示对话框的部分(从createDialog开始)是在它自己的函数中。用AccessController.doPrivileged()替换对该函数的调用以及对该函数的包装调用可以处理所有事情。没有警告图标!