Bug 561974 - BrowserViewer delegate to URISchemeProcessor

Change-Id: If99d9e162535c34c8c20e0c689ce4676f8e8cf56
Signed-off-by: Mickael Istria <mistria@redhat.com>
diff --git a/bundles/org.eclipse.ui.browser/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.browser/META-INF/MANIFEST.MF
index b44ece3..fbddd02 100644
--- a/bundles/org.eclipse.ui.browser/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.ui.browser/META-INF/MANIFEST.MF
@@ -11,7 +11,8 @@
  org.eclipse.ui.internal.browser.browsers;x-internal:=true,
  org.eclipse.ui.internal.browser.macosx;x-internal:=true
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.11.0,4.0.0)",
- org.eclipse.ui;bundle-version="[3.6.0,4.0.0)"
+ org.eclipse.ui;bundle-version="[3.6.0,4.0.0)",
+ org.eclipse.urischeme;bundle-version="1.1.0"
 Eclipse-LazyStart: true
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserViewer.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserViewer.java
index d68a550..a4e88d7 100644
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserViewer.java
+++ b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserViewer.java
@@ -19,6 +19,7 @@
 import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.io.IOException;
+import java.net.URI;
 import java.nio.file.ClosedWatchServiceException;
 import java.nio.file.FileSystems;
 import java.nio.file.Path;
@@ -29,6 +30,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.action.IStatusLineManager;
 import org.eclipse.jface.resource.ImageDescriptor;
@@ -60,6 +62,7 @@
 import org.eclipse.swt.widgets.ToolBar;
 import org.eclipse.swt.widgets.ToolItem;
 import org.eclipse.ui.PlatformUI;
+import org.eclipse.urischeme.IUriSchemeProcessor;
 
 /**
  * A Web browser widget. It extends the Eclipse SWT Browser widget by adding an
@@ -233,6 +236,20 @@
 		//if (WebBrowserUtil.canUseInternalWebBrowser())
 		try {
 			this.browser = new Browser(this, SWT.NONE);
+			this.browser.addLocationListener(LocationListener.changingAdapter(event -> {
+					URI uri = URI.create(event.location);
+					if (!(uri.getScheme().equals("http") || uri.getScheme().equals("https") //$NON-NLS-1$ //$NON-NLS-2$
+							|| uri.getScheme().equals("file"))) //$NON-NLS-1$
+						try {
+							if (IUriSchemeProcessor.INSTANCE.canHandle(uri)) {
+								IUriSchemeProcessor.INSTANCE.handleUri(uri);
+								event.doit = false;
+							}
+						} catch (CoreException e) {
+							WebBrowserUIPlugin.logError(e.getMessage(), e);
+						}
+
+				}));
 		}
 		catch (SWTError e) {
 			if (e.code!=SWT.ERROR_NO_HANDLES) {
@@ -688,8 +705,9 @@
 		else if ("wtp".equalsIgnoreCase(url)) //$NON-NLS-1$
 			url = "http://www.eclipse.org/webtools/"; //$NON-NLS-1$
 
-		if (browse)
+		if (browse) {
 			navigate(url);
+		}
 
 		addToHistory(url);
 		updateHistory();
diff --git a/bundles/org.eclipse.urischeme/META-INF/MANIFEST.MF b/bundles/org.eclipse.urischeme/META-INF/MANIFEST.MF
index 4a94927..0e5f119 100644
--- a/bundles/org.eclipse.urischeme/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.urischeme/META-INF/MANIFEST.MF
@@ -2,12 +2,12 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Plugin.name
 Bundle-SymbolicName: org.eclipse.urischeme;singleton:=true
-Bundle-Version: 1.0.800.qualifier
+Bundle-Version: 1.1.0.qualifier
 Automatic-Module-Name: org.eclipse.urischeme
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.8.0,4.0.0)",
  org.eclipse.equinox.registry;bundle-version="[3.8.0,4.0.0)",
  org.eclipse.core.runtime;bundle-version="[3.14.0,4.0.0)"
-Export-Package: org.eclipse.urischeme;x-friends:="org.eclipse.ui.ide.application,org.eclipse.ui.examples.uriSchemeHandler"
+Export-Package: org.eclipse.urischeme;x-friends:="org.eclipse.ui.ide.application,org.eclipse.ui.examples.uriSchemeHandler,org.eclipse.ui.browser"
 Bundle-Vendor: %Plugin.Providername
 Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.urischeme/src/org/eclipse/urischeme/IUriSchemeProcessor.java b/bundles/org.eclipse.urischeme/src/org/eclipse/urischeme/IUriSchemeProcessor.java
index 707cbe0..7d8e6e2 100644
--- a/bundles/org.eclipse.urischeme/src/org/eclipse/urischeme/IUriSchemeProcessor.java
+++ b/bundles/org.eclipse.urischeme/src/org/eclipse/urischeme/IUriSchemeProcessor.java
@@ -13,6 +13,8 @@
  *******************************************************************************/
 package org.eclipse.urischeme;
 
+import java.net.URI;
+
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.urischeme.internal.UriSchemeProcessor;
 
@@ -35,4 +37,24 @@
 	 * @throws CoreException if URI handling failed; implementation dependent
 	 */
 	void handleUri(String uriScheme, String uri) throws CoreException;
+
+	/**
+	 * Handle an URI with the given uriScheme
+	 *
+	 * @param uri the complete URI
+	 * @throws CoreException if URI handling failed; implementation dependent
+	 * @since 1.1
+	 */
+	default void handleUri(URI uri) throws CoreException {
+		handleUri(uri.getScheme(), uri.toString());
+	}
+
+	/**
+	 * Return whether a handler can process the given URI, according to its scheme.
+	 *
+	 * @param uri
+	 * @return whether a handler can process the given URI, according to its scheme.
+	 * @since 1.1
+	 */
+	boolean canHandle(URI uri);
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.urischeme/src/org/eclipse/urischeme/internal/UriSchemeProcessor.java b/bundles/org.eclipse.urischeme/src/org/eclipse/urischeme/internal/UriSchemeProcessor.java
index 639e72e..77fe0b8 100644
--- a/bundles/org.eclipse.urischeme/src/org/eclipse/urischeme/internal/UriSchemeProcessor.java
+++ b/bundles/org.eclipse.urischeme/src/org/eclipse/urischeme/internal/UriSchemeProcessor.java
@@ -13,6 +13,7 @@
  *******************************************************************************/
 package org.eclipse.urischeme.internal;
 
+import java.net.URI;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -44,14 +45,29 @@
 	public void handleUri(String uriScheme, String uri) throws CoreException {
 		IUriSchemeHandler handler = null;
 
+		handler = getHandler(uriScheme);
+		if (handler != null) {
+			handler.handle(uri);
+		}
+	}
+
+	private IUriSchemeHandler getHandler(String uriScheme) throws CoreException {
+		IUriSchemeHandler handler;
 		if (createdHandlers.containsKey(uriScheme)) {
 			handler = createdHandlers.get(uriScheme);
 		} else {
 			handler = reader.getHandlerFromExtensionPoint(uriScheme);
 			createdHandlers.put(uriScheme, handler);
 		}
-		if (handler != null) {
-			handler.handle(uri);
+		return handler;
+	}
+
+	@Override
+	public boolean canHandle(URI uri) {
+		try {
+			return getHandler(uri.getScheme()) != null;
+		} catch (CoreException e) {
+			return false;
 		}
 	}