Extract code to open JCEF links in external browser.

No need to copy/paste it, see `openLinksInExternalBrowser`

 Fix after reviews 15256

GitOrigin-RevId: 42abf64d310de2970944661c563d21e0be53c04f
This commit is contained in:
Ilya.Kazakevich
2021-10-20 17:26:42 +00:00
committed by intellij-monorepo-bot
parent c3de2ffe73
commit 1f71eff0df
2 changed files with 26 additions and 5 deletions
@@ -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();
@@ -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("<head>", "<head>$cssStyleCodeToInject")