📄 browser.java
字号:
|| c == '.' || c == ':' || c == '&' || c == '@' || c == '/' || c == '?'
|| c == '%' || c =='+' || c == '=' || c == '#' || c == '-' || c == '\\'){
//characters that are necessary for URLs and should be safe
//to pass to exec. Exec uses a default string tokenizer with
//the default arguments (whitespace) to separate command line
//arguments, so there should be no problem with anything bu
//whitespace.
sb.append(c);
} else {
c = (char)(c & 0xFF); // get the lowest 8 bits (URLEncoding)
if (c < 0x10){
sb.append("%0" + Integer.toHexString(c));
} else {
sb.append("%" + Integer.toHexString(c));
}
}
}
String[] messageArray = new String[1];
messageArray[0] = sb.toString();
String command = null;
boolean found = false;
// try each of the exec commands until something works
try {
for (int i=0; i<exec.length && !found; i++){
try {
// stick the url into the command
command = MessageFormat.format(exec[i], (Object[])messageArray);
// parse the command line.
Vector argsVector = new Vector();
BrowserCommandLexer lex = new BrowserCommandLexer(new StringReader(command));
String t;
while ((t = lex.getNextToken()) != null) {
argsVector.add(t);
}
String[] args = new String[argsVector.size()];
args = (String[])argsVector.toArray(args);
// the windows url protocol handler doesn't work well with file URLs.
// Correct those problems here before continuing
// Java File.toURL() gives only one / following file: bu
// we need two.
// If there are escaped characters in the url, we will have
// to create an Internet shortcut and open that, as the command
// line version of the rundll doesn't like them.
boolean useShortCut = false;
if (args[0].equals("rundll32") && args[1].equals("url.dll,FileProtocolHandler")){
if (args[2].startsWith("file:/")){
if (args[2].charAt(6) != '/'){
args[2] = "file://" + args[2].substring(6);
}
if (args[2].charAt(7) != '/'){
args[2] = "file:///" + args[2].substring(7);
}
useShortCut = true;
} else if (args[2].toLowerCase().endsWith("html") || args[2].toLowerCase().endsWith("htm")){
useShortCut = true;
}
}
if (useShortCut){
File shortcut = File.createTempFile("OpenInBrowser", ".url");
shortcut = shortcut.getCanonicalFile();
shortcut.deleteOnExit();
PrintWriter out = new PrintWriter(new FileWriter(shortcut));
out.println("[InternetShortcut]");
out.println("URL=" + args[2]);
out.close();
args[2] = shortcut.getCanonicalPath();
}
// start the browser
Process p = Runtime.getRuntime().exec(args);
// give the browser a bit of time to fail.
// I have found that sometimes sleep doesn't work
// the first time, so do it twice. My tests
// seem to show that 1000 milliseconds is enough
// time for the browsers I'm using.
for (int j=0; j<2; j++){
try{
Thread.currentThread().sleep(1000);
} catch (InterruptedException inte){
}
}
if (p.exitValue() == 0){
// this is a weird case. The browser exited after
// a couple seconds saying that it successfully
// displayed the url. Either the browser is lying
// or the user closed it *really* quickly. Oh well.
found = true;
}
} catch (IOException x){
// the command was not a valid command.
System.err.println(labels.getString("warning") + " " + x.getMessage());
}
}
if (!found){
// we never found a command that didn't terminate with an error.
throw new IOException(labels.getString("failed"));
}
} catch (IllegalThreadStateException e){
// the browser is still running. This is a good sign.
// lets just say that it is displaying the url right now!
}
}
}
/**
* Display the URLs, each in their own window, in the system browser.
*
* Browser.init() should be called before calling this function or
* Browser.exec should be set explicitly.
*
* If more than one URL is given an HTML page containing JavaScript will
* be written to the local drive, that page will be opened, and it will
* open the rest of the URLs.
*
* @param urls the list of urls to display
* @throws IOException if the url is not valid or the browser fails to star
*
* @since ostermillerutils 1.00.00
*/
public static void displayURLs(String[] urls) throws IOException {
if (urls == null || urls.length == 0){
return;
}
if (urls.length == 1){
displayURL(urls[0]);
return;
}
File shortcut = File.createTempFile("DisplayURLs", ".html");
shortcut = shortcut.getCanonicalFile();
shortcut.deleteOnExit();
PrintWriter out = new PrintWriter(new FileWriter(shortcut));
out.println("<html>");
out.println("<head>");
out.println("<title>" + labels.getString("html.openurls") + "</title>");
out.println("<script language=\"javascript\" type=\"text/javascript\">");
out.println("function displayURLs(){");
for (int i=1; i<urls.length; i++){
out.println("window.open(\"" + urls[i] + "\", \"_blank\", \"toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes\");");
}
out.println("location.href=\"" + urls[0] + "\";");
out.println("}");
out.println("</script>");
out.println("</head>");
out.println("<body onload=\"javascript:displayURLs()\">");
out.println("<noscript>");
for (int i=0; i<urls.length; i++){
out.println("<a target=\"_blank\" href=\"" + urls[i] + "\">" + urls[i] + "</a><br>");
}
out.println("</noscript>");
out.println("</body>");
out.println("</html>");
out.close();
displayURL(shortcut.toURL().toString());
}
/**
* Display the URL in a new window.
*
* Uses javascript to check history.length to determine if the browser opened a
* new window already. If it did, the url is shown in that window, if not, it is
* shown in new window.
*
* Some browsers do not allow the length of history to be viewed by a web page. In that
* case, the url will be displayed in the current window.
*
* Browser.init() should be called before calling this function or
* Browser.exec should be set explicitly.
*
* @param url the url to display in a new window.
* @throws IOException if the url is not valid or the browser fails to star
*
* @since ostermillerutils 1.00.00
*/
public static void displayURLinNew(String url) throws IOException {
displayURLsinNew (new String[] {url});
}
/**
* Display the URLs, each in their own window, in the system browser and the first in
* the named window.
*
* The first URL will only be opened in the named window if the browser did no
* open it in a new window to begin with.
*
* Browser.init() should be called before calling this function or
* Browser.exec should be set explicitly.
*
* An html page containing javascript will
* be written to the local drive, that page will be opened, and it will
* open all the urls.
*
* @param urls the list of urls to display
* @throws IOException if the url is not valid or the browser fails to star
*
* @since ostermillerutils 1.00.00
*/
public static void displayURLsinNew(String[] urls) throws IOException {
if (urls == null || urls.length == 0){
return;
}
File shortcut = File.createTempFile("DisplayURLs", ".html");
shortcut.deleteOnExit();
shortcut = shortcut.getCanonicalFile();
PrintWriter out = new PrintWriter(new FileWriter(shortcut));
out.println("<html>");
out.println("<head>");
out.println("<title>" + labels.getString("html.openurls") + "</title>");
out.println("<script language=\"javascript\" type=\"text/javascript\">");
out.println("function displayURLs(){");
out.println("var hlength = 0;");
out.println("try {");
out.println("hlength = history.length;");
out.println("} catch (e) {}");
out.println("if (hlength>0) {");
out.println("window.open(\"" + urls[0] + "\", \"_blank\", \"toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes\");");
out.println("}");
for (int i=1; i<urls.length; i++){
out.println("window.open(\"" + urls[i] + "\", \"_blank\", \"toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes\");");
}
out.println("if (hlength==0) {");
out.println("location.href=\"" + urls[0] + "\";");
out.println("} else {");
out.println("history.back()");
out.println("}");
out.println("}");
out.println("</script>");
out.println("</head>");
out.println("<body onload=\"javascript:displayURLs()\">");
out.println("<noscript>");
for (int i=0; i<urls.length; i++){
out.println("<a target=\"_blank\" href=\"" + urls[i] + "\">" + urls[i] + "</a><br>");
}
out.println("</noscript>");
out.println("</body>");
out.println("</html>");
out.close();
displayURL(shortcut.toURL().toString());
}
/**
* Display the URL in the named window.
*
* If the browser opens a new window by default, this will likely cause a duplicate window
* to be opened.
*
* Browser.init() should be called before calling this function or
* Browser.exec should be set explicitly.
*
* @param url the url to display
* @param namedWindow the name of the desired window.
* @throws IOException if the url is not valid or the browser fails to star
*
* @since ostermillerutils 1.00.00
*/
public static void displayURL(String url, String namedWindow) throws IOException {
displayURLs (new String[] {url}, new String[] {namedWindow});
}
/**
* Display the URLs in the named windows.
*
* If the browser opens a new window by default, this will likely cause a duplicate window
* to be opened. This method relies on the browser to support javascript.
*
* Browser.init() should be called before calling this function or
* Browser.exec should be set explicitly.
*
* Extra names for windows will be ignored, and if there are too few names, the remaining
* windows will be named "_blank".
*
* @param urls the list of urls to display
* @param namedWindows the list of names for the windows.
* @throws IOException if the url is not valid or the browser fails to star
*
* @since ostermillerutils 1.00.00
*/
public static void displayURLs(String[] urls, String[] namedWindows) throws IOException {
if (urls == null || urls.length == 0){
return;
}
File shortcut = File.createTempFile("DisplayURLs", ".html");
shortcut.deleteOnExit();
shortcut = shortcut.getCanonicalFile();
PrintWriter out = new PrintWriter(new FileWriter(shortcut));
out.println("<html>");
out.println("<head>");
out.println("<title>" + labels.getString("html.openurls") + "</title>");
out.println("<base target=\"" + ((namedWindows==null||namedWindows.length==0||namedWindows[0]==null)?"_blank":namedWindows[0]) + "\">");
out.println("<script language=\"javascript\" type=\"text/javascript\">");
for (int i=1; i<urls.length; i++){
out.println("window.open(\"" + urls[i] + "\", \"" + ((namedWindows==null||namedWindows.length<=i||namedWindows[i]==null)?"_blank":namedWindows[i]) + "\", \"toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes\");");
}
out.println("location.href=\"" + urls[0] + "\";");
out.println("</script>");
out.println("</head>");
out.println("<body onload=\"javascript:displayURLs()\">");
out.println("<noscript>");
for (int i=0; i<urls.length; i++){
out.println("<a target=\"" + ((namedWindows==null||namedWindows.length==0||namedWindows[0]==null)?"_blank":namedWindows[0]) + "\" href=\"" + urls[i] + "\">" + urls[i] + "</a><br>");
}
out.println("</noscript>");
out.println("</body>");
out.println("</html>");
out.close();
displayURL(shortcut.toURL().toString());
}
/**
* Display the URLs the first in the given named window.
*
* If the browser opens a new window by default, this will likely cause a duplicate window
* to be opened. This method relies on the browser to support javascript.
*
* Browser.init() should be called before calling this function or
* Browser.exec should be set explicitly.
*
* @param urls the list of urls to display
* @param namedWindow the name of the first window to use.
* @throws IOException if the url is not valid or the browser fails to star
*
* @since ostermillerutils 1.00.00
*/
public static void displayURLs(String[] urls, String namedWindow) throws IOException {
displayURLs(urls, new String[] {namedWindow});
}
/**
* Open the url(s) specified on the command line in your browser.
*
* @param args Command line arguments (URLs)
*/
public static void main(String[] args){
try {
Browser.init();
if (Browser.dialogConfiguration(null)){
if (args.length == 0){
Browser.displayURLs(new String[]{
"http://www.google.com/",
"http://dmoz.org/",
"http://ostermiller.org",
}, "fun");
} else if (args.length == 1){
Browser.displayURL(args[0], "fun");
} else {
Browser.displayURLs(args, "fun");
}
}
try {
Thread.sleep(10000);
} catch (InterruptedException x){
}
} catch (IOException e){
System.err.println(e.getMessage());
}
System.exit(0);
}
/**
* Show a dialog that allows the user to configure the
* command lines used for starting a browser on their system.
*
* @param owner The frame that owns the dialog.
*
* @since ostermillerutils 1.00.00
*/
public static boolean dialogConfiguration(Frame owner){
dialogConfiguration(owner, null);
return Browser.dialog.changed();
}
/**
* Show a dialog that allows the user to configure the
* command lines used for starting a browser on their system.
* String used in the dialog are taken from the given
* properties. This dialog can be customized or displayed in
* multiple languages.
* <P>
* Properties that are used:
* com.Ostermiller.util.BrowserDialog.title<br>
* com.Ostermiller.util.BrowserDialog.description<br>
* com.Ostermiller.util.BrowserDialog.label<br>
* com.Ostermiller.util.BrowserDialog.defaults<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -