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;
}
}