Skip to content

Commit

Permalink
refactor: pre-compute virtual files outside of UI thread
Browse files Browse the repository at this point in the history
  • Loading branch information
teodora-sandu committed Jun 17, 2024
1 parent 9529c4c commit cbe9859
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.editor.colors.ColorKey
import com.intellij.openapi.editor.colors.EditorColorsManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.ui.JBColor
import com.intellij.ui.jcef.JBCefBrowserBase
import com.intellij.ui.jcef.JBCefJSQuery
Expand All @@ -15,9 +15,11 @@ import org.cef.browser.CefBrowser
import org.cef.browser.CefFrame
import org.cef.handler.CefLoadHandlerAdapter
import java.awt.Color
import java.nio.file.Paths

class OpenFileLoadHandlerGenerator(private val project: Project) {
class OpenFileLoadHandlerGenerator(
private val project: Project,
private val virtualFiles: LinkedHashMap<String, VirtualFile?>,
) {
fun openFile(value: String): JBCefJSQuery.Response {
val values = value.replace("\n", "").split(":")
val filePath = values[0]
Expand All @@ -26,9 +28,7 @@ class OpenFileLoadHandlerGenerator(private val project: Project) {
val startCharacter = values[3].toInt()
val endCharacter = values[4].toInt()

val virtualFile =
VirtualFileManager.getInstance().findFileByNioPath(Paths.get(filePath))
?: return JBCefJSQuery.Response("error")
val virtualFile = virtualFiles[filePath] ?: return JBCefJSQuery.Response("success")

ApplicationManager.getApplication().invokeLater {
val document = virtualFile.getDocument()
Expand Down
14 changes: 7 additions & 7 deletions src/main/kotlin/io/snyk/plugin/ui/jcef/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,19 @@ import com.intellij.ui.jcef.JBCefBrowserBuilder
import org.cef.handler.CefLoadHandlerAdapter
import java.awt.Component


object JCEFUtils {
fun getJBCefBrowserComponentIfSupported (html: String, loadHandlerGenerator: (jbCefBrowser: JBCefBrowser) -> CefLoadHandlerAdapter): Component? {
fun getJBCefBrowserComponentIfSupported(
html: String,
loadHandlerGenerator: (jbCefBrowser: JBCefBrowser) -> CefLoadHandlerAdapter,
): Component? {
if (!JBCefApp.isSupported()) {
return null
}
val cefClient = JBCefApp.getInstance().createClient()
cefClient.setProperty("JS_QUERY_POOL_SIZE", 1)
val jbCefBrowser = JBCefBrowserBuilder().
setClient(cefClient).
setEnableOpenDevToolsMenuItem(false).
setMouseWheelEventEnable(true).
build()
val jbCefBrowser =
JBCefBrowserBuilder().setClient(cefClient).setEnableOpenDevToolsMenuItem(true)
.setMouseWheelEventEnable(true).build()
jbCefBrowser.setOpenLinksInExternalBrowser(true)

val loadHandler = loadHandlerGenerator(jbCefBrowser)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.snyk.plugin.ui.toolwindow.panels

import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.uiDesigner.core.GridLayoutManager
import com.intellij.util.ui.JBUI
import io.snyk.plugin.SnykFile
Expand All @@ -18,6 +20,7 @@ import snyk.common.lsp.ScanIssue
import stylesheets.SnykStylesheets
import java.awt.BorderLayout
import java.awt.Font
import java.nio.file.Paths
import javax.swing.JLabel
import javax.swing.JPanel

Expand All @@ -37,7 +40,13 @@ class SuggestionDescriptionPanelFromLS(
pluginSettings().isGlobalIgnoresFeatureEnabled &&
issue.canLoadSuggestionPanelFromHTML()
) {
val openFileLoadHandlerGenerator = OpenFileLoadHandlerGenerator(snykFile.project)
val virtualFiles = LinkedHashMap<String, VirtualFile?>()
for (dataFlow in issue.additionalData.dataFlow) {
virtualFiles[dataFlow.filePath] =
VirtualFileManager.getInstance().findFileByNioPath(Paths.get(dataFlow.filePath))
}

val openFileLoadHandlerGenerator = OpenFileLoadHandlerGenerator(snykFile.project, virtualFiles)
val html = this.getStyledHTML()
val jbCefBrowserComponent =
JCEFUtils.getJBCefBrowserComponentIfSupported(html) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@ class OpenFileLoadHandlerGeneratorTest : BasePlatformTestCase() {
file = myFixture.copyFileToProject(fileName)
psiFile = WriteAction.computeAndWait<PsiFile, Throwable> { psiManager.findFile(file)!! }

generator = OpenFileLoadHandlerGenerator(psiFile.project)
val virtualFiles = LinkedHashMap<String, VirtualFile?>()
virtualFiles[fileName] = psiFile.virtualFile

generator = OpenFileLoadHandlerGenerator(psiFile.project, virtualFiles)
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@ class SuggestionDescriptionPanelFromLSOSSTest : BasePlatformTestCase() {
every { issue.additionalData.fixedIn } returns listOf("fixedIn")
every { issue.additionalData.exploit } returns "exploit"
every { issue.additionalData.description } returns "description"
every {
issue.additionalData.dataFlow
} returns emptyList()
}

@Test
Expand Down

0 comments on commit cbe9859

Please sign in to comment.