From 5700cd171d7a73a4e73276c8878897cbec78c097 Mon Sep 17 00:00:00 2001 From: Egor Malyshev Date: Thu, 12 Sep 2024 13:36:19 +0200 Subject: [PATCH] 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 --- .../intellij/help/impl/HelpManagerImpl.java | 3 ++- .../builtInHelp/BuiltInHelpManager.kt | 26 +++++++++++-------- .../builtInHelp/HelpContentRequestHandler.kt | 22 +++++++++++----- 3 files changed, 32 insertions(+), 19 deletions(-) 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 }