2013-01-22 28 views
2

我們使用部署在Kiosk類型環境中的Firefox 18.0.1運行簽名的小程序。 JDK和JRE都是JavaSE 7u11。簽名的jar讓我們可以執行所有沙盒applet通常無法爲其用戶執行的操作(漫遊本地磁盤,與打印機通信,竊取所有pr0n等)。Applet彈出窗口在對話框外部懸停警告圖標

該小程序和加載它的頁面共同創建一些HTML和JavaScript; JavaScript和applet會以幾乎無縫的方式來回傳遞。有時小程序會創建彈出式對話框;這些是由用戶點擊一個Java組件觸發的,或者是由用戶通過點擊一個「onclick」腳本點擊某個HTML小部件觸發的,該腳本告訴小程序進行對話。

在上個星期,我注意到一些applet的彈出對話框模糊不清。他們有一個小小的警告圖標掛對話框:

tiny little bang

圖標粘在對話框如果用戶移動它。將鼠標懸停在圖標上方會彈出一個「Java Applet窗口」工具提示,這非常有趣,因爲並不是所有的對話框都與它一起出現。

該快照中顯示的窗口是使用此測試代碼創建的。 (是的,有使用的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的事情?或者,更好的問題:是什麼導致警告圖標出現在某些對話框中,而不是其他問題?

+2

這是一個Firefox的東西。 – fmodos

+0

@fmodos如果你能提供額外的信息(並且讓你的答案更長,我建議你做出答案)) – MadProgrammer

+0

opss ...我的錯誤是,我在這篇文章中做了一個非常快速的閱讀,並且錯過了它只是從HTML事件發生的部分,無論如何,我只是做了一個快速的研究,下面的鏈接似乎解決了這個問題。 http://www.coderanch.com/t/416408/Applets/java/Java-Applet-Window-warning-shows – fmodos

回答

1

好吧,現在我覺得很傻。我一直在玩這個遊戲幾個小​​時,沒有任何地方,在這裏發佈了這個問題,去拿我的第14杯咖啡,然後在奶油攪拌下找到了答案。以下是區別:

直接從用戶點擊已簽名的小程序小部件觸發的彈出窗口是「正常的」。

由用戶點擊HTML/JavaScript對象觸發的彈出窗口以及調用已簽名的Java函數的'onclick'腳本會被標記爲警告。

無論何時,一個javascript函數調用一個已簽名的applet,該applet將被視爲未調用長度的調用。這可能是一個類似的預防措施生效,但我沒有實際驗證。兩種情況下的解決方案都是相同的:找到最小的一段代碼,它需要「沒有真正的安全,我的意思是」狀態,並在其周圍包裝PrivilegedExceptionAction。或者至少,這是其他javascript-into-signed-applet調用的正確解決方案,所以我在這裏嘗試了它,並且它工作正常。 :-)

在我們的實際代碼中,顯示對話框的部分(從createDialog開始)在它自己的函數中。用AccessController.doPrivileged()代替對該函數的調用,並且對該函數進行封裝調用將處理所有內容。沒有更多的警告圖標!

+0

好問題。精心研究的答案。很高興你把事情解決了。 :) –