package org.jetbrains.builtInWebServer; import com.intellij.ide.browsers.OpenInBrowserRequest; import com.intellij.ide.browsers.WebBrowserUrlProvider; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.testFramework.LightVirtualFile; import com.intellij.util.Url; import com.intellij.util.Urls; import com.intellij.util.containers.ContainerUtil; import com.intellij.xml.util.HtmlUtil; import org.jetbrains.ide.BuiltInServerManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.Collections; import java.util.List; public class BuiltInWebBrowserUrlProvider extends WebBrowserUrlProvider implements DumbAware { @NotNull public static List getUrls(@NotNull VirtualFile file, @NotNull Project project, @Nullable String currentAuthority) { if (currentAuthority != null && !compareAuthority(currentAuthority)) { return Collections.emptyList(); } String path = WebServerPathToFileManager.getInstance(project).getPath(file); if (path == null) { return Collections.emptyList(); } int effectiveBuiltInServerPort = BuiltInServerOptions.getInstance().getEffectiveBuiltInServerPort(); Url url = Urls.newHttpUrl(currentAuthority == null ? "localhost:" + effectiveBuiltInServerPort : currentAuthority, '/' + project.getName() + '/' + path); int defaultPort = BuiltInServerManager.getInstance().getPort(); if (currentAuthority != null || defaultPort == effectiveBuiltInServerPort) { return Collections.singletonList(url); } return Arrays.asList(url, Urls.newHttpUrl("localhost:" + defaultPort, '/' + project.getName() + '/' + path)); } public static boolean compareAuthority(@Nullable String currentAuthority) { if (currentAuthority == null) { return false; } int portIndex = currentAuthority.indexOf(':'); if (portIndex < 0) { return false; } String host = currentAuthority.substring(0, portIndex); if (!BuiltInWebServer.isOwnHostName(host)) { return false; } int port = StringUtil.parseInt(currentAuthority.substring(portIndex + 1), -1); return port == BuiltInServerOptions.getInstance().getEffectiveBuiltInServerPort() || port == BuiltInServerManager.getInstance().getPort(); } @Override public boolean canHandleElement(@NotNull OpenInBrowserRequest request) { return request.getFile().getViewProvider().isPhysical() && !(request.getVirtualFile() instanceof LightVirtualFile) && isMyLanguage(request.getFile()); } protected boolean isMyLanguage(PsiFile psiFile) { return HtmlUtil.isHtmlFile(psiFile); } @Nullable @Override protected Url getUrl(@NotNull OpenInBrowserRequest request, @NotNull VirtualFile virtualFile) throws BrowserException { return ContainerUtil.getFirstItem(getUrls(virtualFile, request.getProject(), null)); } }