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

View File

@@ -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)

View File

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