use UrlOpener if possible

This commit is contained in:
Vladimir Krivosheev
2017-05-16 14:17:34 +02:00
parent df9b821c4f
commit 1a8aaf1825
3 changed files with 37 additions and 19 deletions
@@ -31,7 +31,9 @@ abstract class BrowserLauncher {
abstract fun open(url: String)
abstract fun browse(uri: URI)
fun browse(uri: URI) = browse(uri, null)
abstract fun browse(uri: URI, project: Project?)
abstract fun browse(file: File)
@@ -39,7 +41,7 @@ abstract class BrowserLauncher {
browse(url, browser, null)
}
abstract fun browse(url: String, browser: WebBrowser?, project: Project?)
abstract fun browse(url: String, browser: WebBrowser? = null, project: Project? = null)
abstract fun browseUsingPath(url: String?,
browserPath: String? = null,
@@ -28,9 +28,11 @@ import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.SystemInfo
import com.intellij.openapi.util.text.StringUtil
import com.intellij.openapi.vfs.StandardFileSystems
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.util.ArrayUtil
import com.intellij.util.PathUtil
import com.intellij.util.io.URLUtil
import org.jetbrains.annotations.Contract
import java.awt.Desktop
import java.io.File
@@ -104,11 +106,15 @@ open class BrowserLauncherAppless : BrowserLauncher() {
override fun open(url: String) = openOrBrowse(url, false, null)
override fun browse(file: File) = browse(VfsUtil.toUri(file))
override fun browse(file: File) {
var path = file.absolutePath
if (SystemInfo.isWindows && path[0] != '/') {
path = '/' + path
}
browse("${StandardFileSystems.FILE_PROTOCOL_PREFIX}$path")
}
override fun browse(uri: URI) = browse(uri, null)
fun browse(uri: URI, project: Project?) {
override fun browse(uri: URI, project: Project?) {
LOG.debug("Launch browser: [$uri]")
val settings = generalSettings
@@ -179,11 +185,13 @@ open class BrowserLauncherAppless : BrowserLauncher() {
}
override fun browse(url: String, browser: WebBrowser?, project: Project?) {
if (browser == null) {
val effectiveBrowser = getEffectiveBrowser(browser)
// if browser is not passed, UrlOpener should be not used for non-http(s) urls
if (effectiveBrowser == null || (browser == null && !url.startsWith(URLUtil.HTTP_PROTOCOL))) {
openOrBrowse(url, true, project)
}
else {
UrlOpener.EP_NAME.extensions.any { it.openUrl(browser, url, project) }
UrlOpener.EP_NAME.extensions.any { it.openUrl(effectiveBrowser, url, project) }
}
}
@@ -250,4 +258,6 @@ open class BrowserLauncherAppless : BrowserLauncher() {
// Not started yet. Not able to show message up. (Could happen in License panel under Linux).
LOG.warn(error)
}
open protected fun getEffectiveBrowser(browser: WebBrowser?): WebBrowser? = browser
}
@@ -36,10 +36,25 @@ import java.util.concurrent.TimeUnit
class BrowserLauncherImpl : BrowserLauncherAppless() {
override fun browse(url: String, browser: WebBrowser?, project: Project?) {
super.browse(signUrl(url), browser, project)
}
override fun getEffectiveBrowser(browser: WebBrowser?): WebBrowser? {
var effectiveBrowser = browser
if (browser == null) {
// https://youtrack.jetbrains.com/issue/WEB-26547
val browserManager = WebBrowserManager.getInstance()
if (browserManager.getDefaultBrowserPolicy() == DefaultBrowserPolicy.FIRST) {
effectiveBrowser = browserManager.firstActiveBrowser
}
}
return effectiveBrowser
}
private fun signUrl(url: String): String {
@Suppress("NAME_SHADOWING")
var url = url
@Suppress("NAME_SHADOWING")
var browser = browser
val serverManager = BuiltInServerManager.getInstance()
val parsedUrl = Urls.parse(url, false)
if (parsedUrl != null && serverManager.isOnBuiltInWebServer(parsedUrl)) {
@@ -49,16 +64,7 @@ class BrowserLauncherImpl : BrowserLauncherAppless() {
url = serverManager.addAuthToken(parsedUrl).toExternalForm()
}
if (browser == null) {
// https://youtrack.jetbrains.com/issue/WEB-26547
val browserManager = WebBrowserManager.getInstance()
if (browserManager.getDefaultBrowserPolicy() == DefaultBrowserPolicy.FIRST) {
browser = browserManager.firstActiveBrowser
}
}
super.browse(url, browser, project)
return url
}
override fun browseUsingNotSystemDefaultBrowserPolicy(uri: URI, settings: GeneralSettings, project: Project?) {