Microsoft pop-up blocker blocks Java's showDocument, restarts applets

The Microsoft pop-up blocker released with Windows XP SP2 blocks Java's showDocument method.  The applet on this page demonstrates this problem: click the button in the frame that pops up from this applet and the new browser window will not pop up if the Microsoft pop-up blocker is on.  This problem occurs for both the Microsoft and Sun Java Virtual Machines.  If you are using the Microsoft Java Virtual Machine showDocument does not fail in some situations in which the Sun JVM does fail.

The Google pop-up blocker has a similar problem, but the pop-up blockers in Netscape and Firefox for Windows and Safari for Macintosh do not block showDocument.   

A workaround is for the user to click the Information Bar to allow popups, but if this is done while the applet is running it restarts the applet (using either the Sun or Microsoft Java Virtual Machine in Internet Explorer), losing the user's work in the applet.  The need to disable a popup blocker can be detected by using JavaScript to test for popup blockers.

For signed applets or for applications a workaround is to launch a new Internet Explorer window or a new message in the default e-mail program using Runtime.exec:

This seems to work for all URLs on both Windows 98 and Windows XP without destroying the applet.

If you have any insights, workarounds or comments about this test page please contact Mickey Segal.  A listing of  many Java resources is at this link.

Source code:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;

public class pop_window2 extends Applet implements ActionListener, WindowListener {

Frame frame;
Button button;

public void init() 
{
    button = new Button("Pop up a browser window showing a Web page");
    button.addActionListener(this);
    frame = new Frame("A frame");
    frame.setLayout(new GridBagLayout());
    frame.setBounds(100, 100, 600, 300);
    frame.add(button);
    frame.validate();
    frame.show();
    frame.addWindowListener(this);
}

public void windowOpened(WindowEvent we){}

public void windowClosed(WindowEvent we){}

public void windowIconified(WindowEvent we){}

public void windowDeiconified(WindowEvent we){}

public void windowActivated(WindowEvent we){}

public void windowDeactivated(WindowEvent we){}

public void windowClosing(WindowEvent we)
{
    if (we.getSource() == frame)
    {
        frame.setVisible(false);
        frame.dispose();
    }
}

public void paint(Graphics g)
{
    g.drawString("A frame should pop up", 10 , 20);
}

public void actionPerformed(ActionEvent ae)
{
    if (ae.getSource() == button)
    {
        try
        {
            getAppletContext().showDocument(new URL("http://segal.org"), "_blank");
        }
        catch(Exception e) 
        {
            System.out.println("new URL failed");
        }
    }
}
} // END OF Class pop_window2