diff --git a/platform/platform-impl/src/com/intellij/help/impl/HelpManagerImpl.java b/platform/platform-impl/src/com/intellij/help/impl/HelpManagerImpl.java index 1471d1727798..cf2f2253b26a 100644 --- a/platform/platform-impl/src/com/intellij/help/impl/HelpManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/help/impl/HelpManagerImpl.java @@ -52,7 +52,8 @@ public class HelpManagerImpl extends HelpManager { activeKeymap = activeKeymap.getParent(); } 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()); diff --git a/plugins/built-in-help/src/com/jetbrains/builtInHelp/BuiltInHelpManager.kt b/plugins/built-in-help/src/com/jetbrains/builtInHelp/BuiltInHelpManager.kt index 0b34d4277126..c6b0a94e7ad3 100644 --- a/plugins/built-in-help/src/com/jetbrains/builtInHelp/BuiltInHelpManager.kt +++ b/plugins/built-in-help/src/com/jetbrains/builtInHelp/BuiltInHelpManager.kt @@ -8,6 +8,8 @@ import com.intellij.openapi.application.ApplicationInfo import com.intellij.openapi.application.ApplicationNamesInfo import com.intellij.openapi.diagnostic.Logger 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.util.PlatformUtils import com.jetbrains.builtInHelp.settings.SettingsPage @@ -26,14 +28,20 @@ class BuiltInHelpManager : HelpManager() { override fun invokeHelp(helpId: String?) { - val helpIdToUse = helpId ?: "top" + val helpIdToUse = URLEncoder.encode(helpId, StandardCharsets.UTF_8) ?: "top" logWillOpenHelpId(helpIdToUse) 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/?${ - URLEncoder.encode( - helpIdToUse, StandardCharsets.UTF_8) - }" + helpIdToUse + }$activeKeymapParam" + val tryOpenWebSite = java.lang.Boolean.valueOf(Utils.getStoredValue( SettingsPage.OPEN_HELP_FROM_WEB, "true")) @@ -62,22 +70,19 @@ class BuiltInHelpManager : HelpManager() { } val info = ApplicationInfo.getInstance() - val productVersion = info.majorVersion + "." + info.minorVersion.substringBefore(".") + val productVersion = info.shortVersion var baseUrl = Utils.getStoredValue(SettingsPage.OPEN_HELP_BASE_URL, Utils.BASE_HELP_URL) if (!baseUrl.endsWith("/")) baseUrl += "/" - url = "${baseUrl}help/$productWebPath/$productVersion/?${ - URLEncoder.encode( - helpIdToUse, StandardCharsets.UTF_8) - }" + url = "${baseUrl}help/$productWebPath/$productVersion/?${helpIdToUse}" if (PlatformUtils.isJetBrainsProduct() && baseUrl == Utils.BASE_HELP_URL) { val productCode = info.build.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 { BrowserLauncher.instance.browse(url, browser) } - } catch (e: URISyntaxException) { LOG.error("Help id '$helpIdToUse' produced an invalid URL.", e) diff --git a/plugins/built-in-help/src/com/jetbrains/builtInHelp/HelpContentRequestHandler.kt b/plugins/built-in-help/src/com/jetbrains/builtInHelp/HelpContentRequestHandler.kt index b759a61cbf7a..f5fd103defcd 100644 --- a/plugins/built-in-help/src/com/jetbrains/builtInHelp/HelpContentRequestHandler.kt +++ b/plugins/built-in-help/src/com/jetbrains/builtInHelp/HelpContentRequestHandler.kt @@ -11,6 +11,8 @@ import io.netty.channel.ChannelHandlerContext import io.netty.handler.codec.http.* import org.jetbrains.builtInWebServer.BuiltInServerOptions import org.jetbrains.io.send +import java.net.URLEncoder +import java.nio.charset.StandardCharsets import javax.xml.bind.JAXBContext @Suppress("unused") @@ -24,7 +26,7 @@ class HelpContentRequestHandler : HelpRequestHandlerBase() { override fun process( urlDecoder: QueryStringDecoder, request: FullHttpRequest, - context: ChannelHandlerContext + context: ChannelHandlerContext, ): Boolean { for (name: String in urlDecoder.parameters().keys) { val param = urlDecoder.parameters()[name] @@ -39,15 +41,21 @@ class HelpContentRequestHandler : HelpRequestHandlerBase() { mapStream ) 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( "Location", - "http://127.0.0.1:${BuiltInServerOptions.getInstance().effectiveBuiltInServerPort}/help/${ - map.getUrlForId( - name - ) - }" + location ) + context.channel().writeAndFlush(response).addListener(ChannelFutureListener.CLOSE) return true }