package com.jetbrains.lang.dart.ide.runner.server;
import com.intellij.ide.browsers.BrowserFamily;
import com.intellij.ide.browsers.BrowserLauncher;
import com.intellij.ide.browsers.WebBrowser;
import com.intellij.ide.browsers.WebBrowserManager;
import com.intellij.javascript.debugger.browserConnection.BrowserConnectionManager;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.util.Computable;
import com.jetbrains.lang.dart.DartBundle;
import icons.DartIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.io.jsonRpc.Client;
import java.util.List;
public class OpenDartObservatoryUrlAction extends DumbAwareAction {
@Nullable private String myUrl;
private final Computable<Boolean> myIsApplicable;
/**
* @param url <code>null</code> if URL is not known at the moment of the action instantiation; use {@link #setUrl(String)} afterwards
*/
public OpenDartObservatoryUrlAction(@Nullable final String url, @NotNull final Computable<Boolean> isApplicable) {
super(DartBundle.message("open.observatory.action.text"),
DartBundle.message("open.observatory.action.description"),
DartIcons.Observatory);
myUrl = url;
myIsApplicable = isApplicable;
}
public void setUrl(@NotNull final String url) {
myUrl = url;
}
@Override
public void update(@NotNull final AnActionEvent e) {
e.getPresentation().setEnabled(myUrl != null && myIsApplicable.compute());
}
@Override
public void actionPerformed(@NotNull final AnActionEvent e) {
if (myUrl != null) {
openUrlInChromeFamilyBrowser(myUrl);
}
}
/**
* Opens new tab in any already open Chrome-family browser, if none found - start any new Chrome-family browser
*/
public static void openUrlInChromeFamilyBrowser(@NotNull final String url) {
try {
final BrowserConnectionManager connectionManager = BrowserConnectionManager.getInstance();
final Client chromeClient = connectionManager.findClient(client -> {
final WebBrowser browser = connectionManager.getBrowser(client);
return browser != null && browser.getFamily() == BrowserFamily.CHROME;
});
if (chromeClient != null) {
BrowserConnectionManager.getInstance().openUrl(chromeClient, url);
}
else {
openInAnyChromeFamilyBrowser(url);
}
}
catch (Throwable t) {
// ClassNotFound in Community Edition or if JavaScriptDebug plugin disabled
openInAnyChromeFamilyBrowser(url);
}
}
private static void openInAnyChromeFamilyBrowser(@NotNull final String url) {
final List<WebBrowser> chromeBrowsers = WebBrowserManager.getInstance().getBrowsers(
browser -> browser.getFamily() == BrowserFamily.CHROME, true);
BrowserLauncher.getInstance().browse(url, chromeBrowsers.isEmpty() ? null : chromeBrowsers.get(0));
}
}