Index: toolsrc/org/mozilla/javascript/tools/debugger/SwingGui.java =================================================================== --- toolsrc/org/mozilla/javascript/tools/debugger/SwingGui.java.orig 2009-11-16 15:55:49.986561156 +0100 +++ toolsrc/org/mozilla/javascript/tools/debugger/SwingGui.java 2009-11-16 15:56:51.102061154 +0100 @@ -42,6 +42,7 @@ package org.mozilla.javascript.tools.debugger; import javax.swing.*; +import javax.swing.filechooser.*; import javax.swing.text.*; import javax.swing.event.*; import javax.swing.table.*; @@ -333,7 +334,14 @@ statusBar = new JLabel(); statusBar.setText("Thread: "); contentPane.add(statusBar, BorderLayout.SOUTH); - dlg = new JFileChooser(); + try { + dlg = new JFileChooser(); + } catch (SecurityException e) { + // Work around bug in JFileChooser when security is enforced. + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4802383 + dlg = new JFileChooser(new FileWrapper("."), + new FileSystemViewWrapper()); + } javax.swing.filechooser.FileFilter filter = new javax.swing.filechooser.FileFilter() { @@ -3592,7 +3600,130 @@ default: throw new IllegalArgumentException(String.valueOf(type)); + } + } +} + +/** + * A FileSystemView that ensures File objects + * returned from methods are instances of FileWrapper. + * This class is used to work around bugs in {@link JFileChooser}. + */ +class FileSystemViewWrapper extends FileSystemView { + private FileSystemView v = FileSystemView.getFileSystemView(); + + public File createFileObject(File dir, String filename) { + return new FileWrapper(v.createFileObject(dir, filename)); + } + + public File createFileObject(String path) { + return new FileWrapper(v.createFileObject(path)); + } + + public File createNewFolder(File containingDir) throws IOException { + return new FileWrapper(v.createNewFolder(containingDir)); + } + + public File getChild(File parent, String fileName) { + return new FileWrapper(v.getChild(parent, fileName)); + } + + public File getDefaultDirectory() { + return new FileWrapper(v.getDefaultDirectory()); + } + + public File[] getFiles(File dir, boolean useFileHiding) { + File[] fs = v.getFiles(dir, useFileHiding); + File[] ret = new File[fs.length]; + for (int i = 0; i < fs.length; i++) { + ret[i] = new FileWrapper(fs[i]); } + return ret; + } + + public File getHomeDirectory() { + return new FileWrapper(v.getHomeDirectory()); + } + + public File getParentDirectory(File dir) { + return new FileWrapper(v.getParentDirectory(dir)); + } + + public File[] getRoots() { + File[] fs = v.getRoots(); + File[] ret = new File[fs.length]; + for (int i = 0; i < fs.length; i++) { + ret[i] = new FileWrapper(fs[i]); + } + return ret; + } + + public String getSystemDisplayName(File f) { + return v.getSystemDisplayName(f); + } + + public Icon getSystemIcon(File f) { + return getSystemIcon(f); + } + + public String getSystemTypeDescription(File f) { + return v.getSystemTypeDescription(f); + } + + public boolean isComputerNode(File dir) { + return v.isComputerNode(dir); + } + + public boolean isDrive(File dir) { + return v.isDrive(dir); + } + + public boolean isFileSystem(File f) { + return v.isFileSystem(f); + } + + public boolean isFileSystemRoot(File dir) { + return v.isFileSystemRoot(dir); + } + + public boolean isFloppyDrive(File dir) { + return v.isFloppyDrive(dir); + } + + public boolean isHiddenFile(File f) { + return v.isHiddenFile(f); + } + + public boolean isParent(File folder, File file) { + return v.isParent(folder, file); + } + + public boolean isRoot(File f) { + return v.isRoot(f); + } + + public Boolean isTraversable(File f) { + return v.isTraversable(f); + } +} + +/** + * A File that always returns false from + * {@link #canWrite()}. This class is used to work around bugs in + * {@link JFileChooser}. + */ +class FileWrapper extends File { + + public FileWrapper(File f) { + this(f.toString()); + } + + public FileWrapper(String pathname) { + super(pathname); + } + + public boolean canWrite() { + return false; } }