From 1f71eff0dfd066196ea6b7bc17c438a459bb1da6 Mon Sep 17 00:00:00 2001 From: "Ilya.Kazakevich" Date: Wed, 20 Oct 2021 00:39:46 +0300 Subject: [PATCH] Extract code to open JCEF links in external browser. No need to copy/paste it, see `openLinksInExternalBrowser` Fix after reviews 15256 GitOrigin-RevId: 42abf64d310de2970944661c563d21e0be53c04f --- .../intellij/ui/jcef/JBCefBrowserBase.java | 29 ++++++++++++++++--- .../toolwindow/PyPackagingJcefHtmlPanel.kt | 2 +- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/jcef/JBCefBrowserBase.java b/platform/platform-api/src/com/intellij/ui/jcef/JBCefBrowserBase.java index c39287d2450d..ec016df7a789 100644 --- a/platform/platform-api/src/com/intellij/ui/jcef/JBCefBrowserBase.java +++ b/platform/platform-api/src/com/intellij/ui/jcef/JBCefBrowserBase.java @@ -87,6 +87,7 @@ public abstract class JBCefBrowserBase implements JBCefDisposable { private volatile @Nullable ErrorPage myErrorPage; protected final @NotNull PropertiesHelper myPropertiesHelper = new PropertiesHelper(); private final @NotNull AtomicBoolean myIsCreateStarted = new AtomicBoolean(false); + private @Nullable CefRequestHandler myHrefProcessingRequestHandler; private static final LazyInitializer.LazyValue<@NotNull String> ERROR_PAGE_READER = LazyInitializer.create(() -> { try { @@ -372,8 +373,18 @@ public abstract class JBCefBrowserBase implements JBCefDisposable { /** * Adds handler that opens any links clicked by user in external browser */ - public final void openLinksInExternalBrowser() { - var handler = new CefRequestHandlerAdapter() { + public void setOpenLinksInExternalBrowser(boolean openLinksInExternalBrowser) { + if (openLinksInExternalBrowser) { + enableExternalBrowserLinks(); + } + else { + disableExternalBrowserLinks(); + } + } + + private void enableExternalBrowserLinks() { + if (myHrefProcessingRequestHandler != null) return; + var hrefProcessingRequestHandler = new CefRequestHandlerAdapter() { @Override public boolean onBeforeBrowse(CefBrowser browser, CefFrame frame, @@ -387,8 +398,17 @@ public abstract class JBCefBrowserBase implements JBCefDisposable { return false; } }; - this.myCefClient.addRequestHandler(handler, myCefBrowser); - Disposer.register(this, () -> myCefClient.removeRequestHandler(handler, myCefBrowser)); + this.myCefClient.addRequestHandler(hrefProcessingRequestHandler, myCefBrowser); + myHrefProcessingRequestHandler = hrefProcessingRequestHandler; + } + + private void disableExternalBrowserLinks() { + var hrefProcessingRequestHandler = myHrefProcessingRequestHandler; + if (hrefProcessingRequestHandler != null) { + myCefClient.removeRequestHandler(hrefProcessingRequestHandler, myCefBrowser); + myHrefProcessingRequestHandler = null; + } + } /** @@ -438,6 +458,7 @@ public abstract class JBCefBrowserBase implements JBCefDisposable { if (myLifeSpanHandler != null) getJBCefClient().removeLifeSpanHandler(myLifeSpanHandler, getCefBrowser()); if (myLoadHandler != null) getJBCefClient().removeLoadHandler(myLoadHandler, getCefBrowser()); if (myRequestHandler != null) getJBCefClient().removeRequestHandler(myRequestHandler, getCefBrowser()); + if (myHrefProcessingRequestHandler != null) getJBCefClient().removeRequestHandler(myHrefProcessingRequestHandler, getCefBrowser()); if (myContextMenuHandler != null) getJBCefClient().removeContextMenuHandler(myContextMenuHandler, getCefBrowser()); myCefBrowser.stopLoad(); diff --git a/python/src/com/jetbrains/python/packaging/toolwindow/PyPackagingJcefHtmlPanel.kt b/python/src/com/jetbrains/python/packaging/toolwindow/PyPackagingJcefHtmlPanel.kt index caca583e1b98..5dd2026b47fb 100644 --- a/python/src/com/jetbrains/python/packaging/toolwindow/PyPackagingJcefHtmlPanel.kt +++ b/python/src/com/jetbrains/python/packaging/toolwindow/PyPackagingJcefHtmlPanel.kt @@ -41,7 +41,7 @@ class PyPackagingJcefHtmlPanel(project: Project) : JCEFHtmlPanel(uniqueUrl) { project.messageBus.connect(this).subscribe(LafManagerListener.TOPIC, LafManagerListener { if (myLastHtml != null) setHtml(myLastHtml!!) }) - openLinksInExternalBrowser() + setOpenLinksInExternalBrowser(true) } override fun prepareHtml(html: String): String = html.replaceFirst("", "$cssStyleCodeToInject")