diff --git a/gradle.properties b/gradle.properties index 750721f6..1460fd38 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -webviewVersion=0.2.1 +webviewVersion=0.2.2 sandboxVersion=2022.3.2 -webviewChecksum=5dc4bd0d2e2b5dd8eeadf713fc10ac2b1bac6acf11b34861b74d25c7e0800c51 +webviewChecksum=a510a0961d55227ae1c737e0233d15b8d2990f48e23271c1f2adec1c7b7fb455 currentVersion=2.3.x-SNAPSHOT diff --git a/src/main/java/com/jfrog/ide/idea/inspections/JumpToCode.java b/src/main/java/com/jfrog/ide/idea/inspections/JumpToCode.java index 084e3f4c..ea554a41 100644 --- a/src/main/java/com/jfrog/ide/idea/inspections/JumpToCode.java +++ b/src/main/java/com/jfrog/ide/idea/inspections/JumpToCode.java @@ -65,8 +65,8 @@ private void highlightCode(int startRow, int endRow, int startColumn, int endCol if (editor == null) return; Document document = getDocument(editor); if (document == null) return; - int startOffset = getOffset(document, startRow - 1, startColumn - 1); - int endOffset = getOffset(document, endRow - 1, endColumn - 1); + int startOffset = getOffset(document, startRow, startColumn); + int endOffset = getOffset(document, endRow, endColumn); highlightCode(editor, startOffset, endOffset); scrollToHighlightedCode(editor, startOffset); } diff --git a/src/main/java/com/jfrog/ide/idea/ui/JFrogLocalToolWindow.java b/src/main/java/com/jfrog/ide/idea/ui/JFrogLocalToolWindow.java index 42e08285..7b8cc00e 100644 --- a/src/main/java/com/jfrog/ide/idea/ui/JFrogLocalToolWindow.java +++ b/src/main/java/com/jfrog/ide/idea/ui/JFrogLocalToolWindow.java @@ -227,7 +227,9 @@ private void setLeftPanelContent(JComponent component) { } private JBCefBrowser initVulnerabilityInfoBrowser(@NotNull Project project) throws IOException, URISyntaxException { - webviewManager = new WebviewManager(project); + // When the webview is first opened, the issue/license message might be sent before the page is loaded, so we + // send the message again when the page is done loading. + webviewManager = new WebviewManager(project, () -> updateIssueOrLicenseInWebview(selectedIssue)); Disposer.register(this, webviewManager); return webviewManager.getBrowser(); } diff --git a/src/main/java/com/jfrog/ide/idea/ui/webview/WebviewManager.java b/src/main/java/com/jfrog/ide/idea/ui/webview/WebviewManager.java index 7f273909..9444e78b 100644 --- a/src/main/java/com/jfrog/ide/idea/ui/webview/WebviewManager.java +++ b/src/main/java/com/jfrog/ide/idea/ui/webview/WebviewManager.java @@ -1,11 +1,11 @@ package com.jfrog.ide.idea.ui.webview; import com.intellij.openapi.Disposable; -import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.ui.jcef.JBCefBrowser; import com.jfrog.ide.idea.log.Logger; +import com.jfrog.ide.idea.ui.JfrogContextMenuHandler; import com.jfrog.ide.idea.ui.webview.event.EventManager; import com.jfrog.ide.idea.ui.webview.event.model.WebviewEvent; import org.cef.CefApp; @@ -19,8 +19,9 @@ public class WebviewManager implements Disposable { private final JBCefBrowser jbCefBrowser; public EventManager eventManager; + private boolean schemeHandlerRegistered = false; - public WebviewManager(@NotNull Project project) { + public WebviewManager(@NotNull Project project, Runnable onLoadEnd) { jbCefBrowser = new JBCefBrowser(); // EventManager must be created before the webview is initialized eventManager = new EventManager(jbCefBrowser, project); @@ -28,13 +29,8 @@ public WebviewManager(@NotNull Project project) { jbCefBrowser.createImmediately(); jbCefBrowser.setOpenLinksInExternalBrowser(true); streamConsoleMessagesToLog(); - handleLoadEvent(() -> eventManager.onWebviewLoadEnd()); - DumbService.getInstance(project).smartInvokeLater(() -> { - // Register the scheme handler factory when in smart mode. - // Performing this action immediately after opening IntelliJ sometimes results in a crash, particularly in IntelliJ 2022.3. - CefApp.getInstance().registerSchemeHandlerFactory("http", "jfrog-idea-plugin", new WebviewSchemeHandlerFactory()); - jbCefBrowser.loadURL("http://jfrog-idea-plugin/index.html"); - }); + handleLoadEvent(() -> eventManager.onWebviewLoadEnd(onLoadEnd)); + jbCefBrowser.getJBCefClient().addContextMenuHandler(new JfrogContextMenuHandler(), jbCefBrowser.getCefBrowser()); } public JBCefBrowser getBrowser() { @@ -75,9 +71,20 @@ public boolean onConsoleMessage(CefBrowser browser, CefSettings.LogSeverity leve } public void sendMessage(WebviewEvent.Type type, Object data) { + loadPageIfNeeded(); eventManager.send(type, data); } + private void loadPageIfNeeded() { + if (!schemeHandlerRegistered) { + // Register the scheme handler factory right before the webview is first opened. + // Performing this action earlier sometimes results in a crash or a fatal error, particularly in IntelliJ 2022.3. + CefApp.getInstance().registerSchemeHandlerFactory("http", "jfrog-idea-plugin", new WebviewSchemeHandlerFactory()); + jbCefBrowser.loadURL("http://jfrog-idea-plugin/index.html"); + schemeHandlerRegistered = true; + } + } + @Override public void dispose() { } diff --git a/src/main/java/com/jfrog/ide/idea/ui/webview/event/EventManager.java b/src/main/java/com/jfrog/ide/idea/ui/webview/event/EventManager.java index d691f489..3aa503df 100644 --- a/src/main/java/com/jfrog/ide/idea/ui/webview/event/EventManager.java +++ b/src/main/java/com/jfrog/ide/idea/ui/webview/event/EventManager.java @@ -29,10 +29,16 @@ public EventManager(JBCefBrowser jbBrowser, @NotNull Project project) { /** * Invoked when the webview finishes loading. * Creates the IDE send function body and sends it to the webview. + * Finally, it runs onLoadEvent, if provided. + * + * @param onLoadEnd A {@link Runnable} to run when the webview finishes loading. */ - public void onWebviewLoadEnd() { + public void onWebviewLoadEnd(Runnable onLoadEnd) { String ideSendFuncBody = this.receiver.createIdeSendFuncBody(ideSendFuncName); this.sender.sendIdeSendFunc(ideSendFuncName, ideSendFuncBody); + if (onLoadEnd != null) { + onLoadEnd.run(); + } } /**