Use presentable name explained

Use same logic in the built-in plugin keymap as in helpmanager

Encode URL only once

Work in progress

Make sure the keymap parameter is added for offline help app as well


(cherry picked from commit b0e605dcedea573bb46393c78cc30fa312fd1ecc)

IJ-MR-144854

GitOrigin-RevId: 2a0582a3e4d150d3bb292d1b99229931261981f2
This commit is contained in:
Egor Malyshev
2024-09-12 13:36:19 +02:00
committed by intellij-monorepo-bot
parent 507ae5bd17
commit 5700cd171d
3 changed files with 32 additions and 19 deletions

View File

@@ -52,7 +52,8 @@ public class HelpManagerImpl extends HelpManager {
activeKeymap = activeKeymap.getParent(); activeKeymap = activeKeymap.getParent();
} }
if (activeKeymap != null) { if (activeKeymap != null) {
url = url.addParameters(Map.of("keymap", activeKeymap.getName())); //We need to use the presentable name here because that's what is stored on the docs side
url = url.addParameters(Map.of("keymap", activeKeymap.getPresentableName()));
} }
return IdeUrlTrackingParametersProvider.getInstance().augmentUrl(url.toExternalForm()); return IdeUrlTrackingParametersProvider.getInstance().augmentUrl(url.toExternalForm());

View File

@@ -8,6 +8,8 @@ import com.intellij.openapi.application.ApplicationInfo
import com.intellij.openapi.application.ApplicationNamesInfo import com.intellij.openapi.application.ApplicationNamesInfo
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.help.HelpManager import com.intellij.openapi.help.HelpManager
import com.intellij.openapi.keymap.Keymap
import com.intellij.openapi.keymap.ex.KeymapManagerEx
import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.util.text.StringUtil
import com.intellij.util.PlatformUtils import com.intellij.util.PlatformUtils
import com.jetbrains.builtInHelp.settings.SettingsPage import com.jetbrains.builtInHelp.settings.SettingsPage
@@ -26,14 +28,20 @@ class BuiltInHelpManager : HelpManager() {
override fun invokeHelp(helpId: String?) { override fun invokeHelp(helpId: String?) {
val helpIdToUse = helpId ?: "top" val helpIdToUse = URLEncoder.encode(helpId, StandardCharsets.UTF_8) ?: "top"
logWillOpenHelpId(helpIdToUse) logWillOpenHelpId(helpIdToUse)
try { try {
var activeKeymap: Keymap? = KeymapManagerEx.getInstanceEx().getActiveKeymap()
if (true == activeKeymap?.canModify())
activeKeymap = activeKeymap.parent
val activeKeymapParam = if (activeKeymap == null) "" else "&keymap=${URLEncoder.encode(activeKeymap.presentableName, StandardCharsets.UTF_8)}"
var url = "http://127.0.0.1:${BuiltInServerOptions.getInstance().effectiveBuiltInServerPort}/help/?${ var url = "http://127.0.0.1:${BuiltInServerOptions.getInstance().effectiveBuiltInServerPort}/help/?${
URLEncoder.encode( helpIdToUse
helpIdToUse, StandardCharsets.UTF_8) }$activeKeymapParam"
}"
val tryOpenWebSite = java.lang.Boolean.valueOf(Utils.getStoredValue( val tryOpenWebSite = java.lang.Boolean.valueOf(Utils.getStoredValue(
SettingsPage.OPEN_HELP_FROM_WEB, "true")) SettingsPage.OPEN_HELP_FROM_WEB, "true"))
@@ -62,22 +70,19 @@ class BuiltInHelpManager : HelpManager() {
} }
val info = ApplicationInfo.getInstance() val info = ApplicationInfo.getInstance()
val productVersion = info.majorVersion + "." + info.minorVersion.substringBefore(".") val productVersion = info.shortVersion
var baseUrl = Utils.getStoredValue(SettingsPage.OPEN_HELP_BASE_URL, var baseUrl = Utils.getStoredValue(SettingsPage.OPEN_HELP_BASE_URL,
Utils.BASE_HELP_URL) Utils.BASE_HELP_URL)
if (!baseUrl.endsWith("/")) baseUrl += "/" if (!baseUrl.endsWith("/")) baseUrl += "/"
url = "${baseUrl}help/$productWebPath/$productVersion/?${ url = "${baseUrl}help/$productWebPath/$productVersion/?${helpIdToUse}"
URLEncoder.encode(
helpIdToUse, StandardCharsets.UTF_8)
}"
if (PlatformUtils.isJetBrainsProduct() && baseUrl == Utils.BASE_HELP_URL) { if (PlatformUtils.isJetBrainsProduct() && baseUrl == Utils.BASE_HELP_URL) {
val productCode = info.build.productCode val productCode = info.build.productCode
if (!StringUtil.isEmpty(productCode)) { if (!StringUtil.isEmpty(productCode)) {
url += "&utm_source=from_product&utm_medium=help_link&utm_campaign=$productCode&utm_content=$productVersion" url += "&utm_source=from_product&utm_medium=help_link&utm_campaign=$productCode&utm_content=$productVersion$activeKeymapParam"
} }
} }
} }
@@ -93,7 +98,6 @@ class BuiltInHelpManager : HelpManager() {
else { else {
BrowserLauncher.instance.browse(url, browser) BrowserLauncher.instance.browse(url, browser)
} }
} }
catch (e: URISyntaxException) { catch (e: URISyntaxException) {
LOG.error("Help id '$helpIdToUse' produced an invalid URL.", e) LOG.error("Help id '$helpIdToUse' produced an invalid URL.", e)

View File

@@ -11,6 +11,8 @@ import io.netty.channel.ChannelHandlerContext
import io.netty.handler.codec.http.* import io.netty.handler.codec.http.*
import org.jetbrains.builtInWebServer.BuiltInServerOptions import org.jetbrains.builtInWebServer.BuiltInServerOptions
import org.jetbrains.io.send import org.jetbrains.io.send
import java.net.URLEncoder
import java.nio.charset.StandardCharsets
import javax.xml.bind.JAXBContext import javax.xml.bind.JAXBContext
@Suppress("unused") @Suppress("unused")
@@ -24,7 +26,7 @@ class HelpContentRequestHandler : HelpRequestHandlerBase() {
override fun process( override fun process(
urlDecoder: QueryStringDecoder, urlDecoder: QueryStringDecoder,
request: FullHttpRequest, request: FullHttpRequest,
context: ChannelHandlerContext context: ChannelHandlerContext,
): Boolean { ): Boolean {
for (name: String in urlDecoder.parameters().keys) { for (name: String in urlDecoder.parameters().keys) {
val param = urlDecoder.parameters()[name] val param = urlDecoder.parameters()[name]
@@ -39,15 +41,21 @@ class HelpContentRequestHandler : HelpRequestHandlerBase() {
mapStream mapStream
) as HelpMap ) as HelpMap
val response = DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.TEMPORARY_REDIRECT) val response = DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.PERMANENT_REDIRECT)
var location = "http://127.0.0.1:${BuiltInServerOptions.getInstance().effectiveBuiltInServerPort}/help/${
map.getUrlForId(
name
)
}"
if (urlDecoder.parameters().containsKey("keymap")) location += "?keymap=${URLEncoder.encode(urlDecoder.parameters()["keymap"]!![0], StandardCharsets.UTF_8)}"
response.headers().add( response.headers().add(
"Location", "Location",
"http://127.0.0.1:${BuiltInServerOptions.getInstance().effectiveBuiltInServerPort}/help/${ location
map.getUrlForId(
name
)
}"
) )
context.channel().writeAndFlush(response).addListener(ChannelFutureListener.CLOSE) context.channel().writeAndFlush(response).addListener(ChannelFutureListener.CLOSE)
return true return true
} }