blob: 8eb89a11ba214b96241415573980b4b844410bb5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2016 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Initial API and implementation
* Martin Oberhuber (Wind River) - [292882] Default Browser on Solaris
* Tomasz Zarna (Tasktop Technologies) - [429546] External Browser with parameters
*******************************************************************************/
package org.eclipse.ui.internal.browser;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.util.Util;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
/**
* Utility class for the Web browser tools.
*/
public class WebBrowserUtil {
private static final String BROWSER_PACKAGE_NAME = "org.eclipse.swt.browser.Browser"; //$NON-NLS-1$
public static Boolean isInternalBrowserOperational;
private static final char STYLE_SEP = '-';
private static final int DEFAULT_STYLE = BrowserViewer.BUTTON_BAR
| BrowserViewer.LOCATION_BAR;
/**
* WebBrowserUtil constructor comment.
*/
public WebBrowserUtil() {
super();
}
/**
* Returns true if we're running on Windows.
*
* @return boolean
*/
public static boolean isWindows() {
String os = System.getProperty("os.name"); //$NON-NLS-1$
if (os != null && os.toLowerCase().indexOf("win") >= 0) //$NON-NLS-1$
return true;
return false;
}
/**
* Returns true if we're running on linux.
*
* @return boolean
*/
public static boolean isLinux() {
String os = System.getProperty("os.name"); //$NON-NLS-1$
if (os != null && os.toLowerCase().indexOf("lin") >= 0) //$NON-NLS-1$
return true;
return false;
}
/**
* Open a dialog window.
*
* @param message
* java.lang.String
*/
public static void openError(final String message) {
Display d = Display.getCurrent();
if (d == null)
d = Display.getDefault();
d.asyncExec(() -> MessageDialog.openError(null, Messages.errorDialogTitle, message));
}
/**
* Open a dialog window.
*
* @param message
* java.lang.String
*/
public static void openMessage(final String message) {
Display d = Display.getCurrent();
if (d == null)
d = Display.getDefault();
d.asyncExec(() -> MessageDialog.openInformation(null, Messages.searchingTaskName, message));
}
/**
* Returns whether it should be possible to use the internal browser or not,
* based on whether or not the org.eclipse.swt.Browser class can be
* found/loaded. If it can it means is is supported on the platform in which
* this plugin is running. If not, disable the ability to use the internal
* browser. This method checks to see if it can new up a new
* ExternalBrowserInstance. If the SWT widget can not be bound to the
* particular operating system it throws an SWTException. We catch that and
* set a boolean flag which represents whether or not we were successfully
* able to create a ExternalBrowserInstance instance or not. If not, don't
* bother adding the Internal Web ExternalBrowserInstance that uses this
* widget. Designed to be attemped only once and the flag set used
* throughout.
*
* @return boolean
*/
public static boolean canUseInternalWebBrowser() {
// if we have already figured this out, don't do it again.
if (isInternalBrowserOperational != null)
return isInternalBrowserOperational.booleanValue();
// check for the class
try {
Class.forName(BROWSER_PACKAGE_NAME);
} catch (ClassNotFoundException e) {
isInternalBrowserOperational = Boolean.FALSE;
return false;
}
// try loading it
Shell shell = null;
try {
shell = new Shell(PlatformUI.getWorkbench().getDisplay());
new Browser(shell, SWT.NONE);
isInternalBrowserOperational = Boolean.TRUE;
return true;
} catch (Throwable t) {
StringBuffer message = new StringBuffer("Internal browser is not available"); //$NON-NLS-1$
message.append(t.getMessage() == null?".":": " + t.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
WebBrowserUIPlugin.getInstance().getLog().log(
new Status(IStatus.WARNING, WebBrowserUIPlugin.PLUGIN_ID,
0, message.toString() , null));
isInternalBrowserOperational = Boolean.FALSE;
return false;
} finally {
if (shell != null)
shell.dispose();
}
}
public static boolean canUseSystemBrowser() {
return Program.findProgram("html") != null; //$NON-NLS-1$
}
public static List<String> getExternalBrowserPaths() {
List<String> paths = new ArrayList<>();
Iterator<IBrowserDescriptor> iterator = BrowserManager.getInstance()
.getWebBrowsers().iterator();
while (iterator.hasNext()) {
IBrowserDescriptor wb = iterator.next();
if (wb != null && wb.getLocation() != null)
paths.add(wb.getLocation().toLowerCase());
}
return paths;
}
/**
* Add any supported EXTERNAL web browsers found after an arbitrary check in
* specific paths
*/
public static void addFoundBrowsers(List<IBrowserDescriptor> browsers2) {
List<String> paths = getExternalBrowserPaths();
String os = Platform.getOS();
File[] roots = getUsableDrives(File.listRoots());
IBrowserExt[] browsers = WebBrowserUIPlugin.getBrowsers();
int size = browsers.length;
for (int i = 0; i < size; i++) {
IBrowserExt browserExt = browsers[i];
String[] locations = browserExt.getDefaultLocations();
if (locations != null
&& browserExt.getOS().toLowerCase().indexOf(os) >= 0) {
int size2 = locations.length;
for (int j = 0; j < size2; j++) {
String location = locations[j];
String foundBrowserPath = locateBrowser(paths, location, roots);
if (foundBrowserPath != null) {
BrowserDescriptor descriptor = new BrowserDescriptor();
descriptor.name = browserExt.getName();
descriptor.location = foundBrowserPath;
descriptor.parameters = browserExt
.getParameters();
browsers2.add(descriptor);
j += size2;
}
}
}
}
}
/*
* Look for the file on each of the search roots.
* If the location starts with a Windows environment variable, expand it.
*/
private static String locateBrowser(List<String> alreadyFoundPaths,
String location, File[] searchRoots) {
int rootSize = searchRoots.length;
if (Util.isWindows() && location.startsWith("%")) { //$NON-NLS-1$
int envVarEnd = location.indexOf('%', 1);
if (envVarEnd != -1) {
try {
String expanded = System.getenv(location.substring(1, envVarEnd));
if (expanded != null) {
File f = new File(expanded + location.substring(envVarEnd + 1));
String absolutePath = f.getAbsolutePath();
if (!alreadyFoundPaths.contains(absolutePath.toLowerCase())) {
if (f.exists()) {
return absolutePath;
}
}
return null;
}
} catch (Exception e) {
// ignore
}
}
}
for (int k = 0; k < rootSize; k++) {
try {
File f = new File(searchRoots[k], location);
String absolutePath = f.getAbsolutePath();
if (!alreadyFoundPaths.contains(absolutePath
.toLowerCase())) {
if (f.exists()) {
return absolutePath;
}
}
} catch (Exception e) {
// ignore
}
}
return null;
}
private static File[] getUsableDrives(File[] roots) {
if (!Platform.getOS().equals(Platform.OS_WIN32))
return roots;
ArrayList<File> list = new ArrayList<>();
for (File root : roots) {
String path = root.getAbsolutePath();
if (path != null
&& (path.toLowerCase().startsWith("a:") || path.toLowerCase().startsWith("b:"))) //$NON-NLS-1$ //$NON-NLS-2$
continue;
list.add(root);
}
return list.toArray(new File[list.size()]);
}
/**
* Create an external Web browser if the file matches the default (known)
* browsers.
*
* @param file
* @return an external browser working copy
*/
public static IBrowserDescriptorWorkingCopy createExternalBrowser(File file) {
if (file == null || !file.isFile())
return null;
String executable = file.getName();
IBrowserExt[] browsers = WebBrowserUIPlugin.getBrowsers();
int size = browsers.length;
for (int i = 0; i < size; i++) {
if (executable.equals(browsers[i].getExecutable())) {
IBrowserDescriptorWorkingCopy browser = BrowserManager
.getInstance().createExternalWebBrowser();
browser.setName(browsers[i].getName());
browser.setLocation(file.getAbsolutePath());
browser.setParameters(browsers[i].getParameters());
return browser;
}
}
return null;
}
/**
* Encodes browser style in the secondary id as id-style
*
* @param browserId
* @param style
* @return secondaryId
*/
public static String encodeStyle(String browserId, int style) {
return browserId + STYLE_SEP + style;
}
/**
* Decodes secondary id into a browser style.
*
* @param secondaryId
* @return style
*/
public static int decodeStyle(String secondaryId) {
if (secondaryId != null) {
int sep = secondaryId.lastIndexOf(STYLE_SEP);
if (sep != -1) {
String stoken = secondaryId.substring(sep + 1);
try {
return Integer.parseInt(stoken);
} catch (NumberFormatException e) {
// ignore
}
}
}
return DEFAULT_STYLE;
}
public static String decodeId(String encodedId) {
int sep = encodedId.lastIndexOf(STYLE_SEP);
if (sep != -1) {
return encodedId.substring(0, sep);
}
return encodedId;
}
/**
* @deprecated Please use {@link #createParameterArray(String, String)}
* instead.
*/
@Deprecated
public static String createParameterString(String parameters, String urlText) {
String params = parameters;
String url = urlText;
if (url == null) {
url = ""; //$NON-NLS-1$
}
if (params == null)
params = ""; //$NON-NLS-1$
int urlIndex = params.indexOf(IBrowserDescriptor.URL_PARAMETER);
if (urlIndex >= 0) {
params = params.substring(0, urlIndex) + url
+ params.substring(urlIndex + IBrowserDescriptor.URL_PARAMETER.length());
} else {
if (params.length() != 0 && !params.endsWith(" ")) //$NON-NLS-1$
params += " "; //$NON-NLS-1$
params += url;
}
return params;
}
public static String[] createParameterArray(String parameters, String urlText) {
return tokenize(createParameterString(parameters, urlText));
}
private static String[] tokenize(String string) {
StringTokenizer tokenizer = new StringTokenizer(string);
String[] tokens = new String[tokenizer.countTokens()];
for (int i = 0; tokenizer.hasMoreTokens(); i++)
tokens[i] = tokenizer.nextToken();
return tokens;
}
}