PY-13986 View -> Open In Browser unavailable for Django projects
[idea/community.git] / xml / impl / src / com / intellij / ide / browsers / impl / WebBrowserServiceImpl.java
1 /*
2  * Copyright 2000-2013 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.ide.browsers.impl;
17
18 import com.intellij.ide.browsers.OpenInBrowserRequest;
19 import com.intellij.ide.browsers.WebBrowserService;
20 import com.intellij.ide.browsers.WebBrowserUrlProvider;
21 import com.intellij.lang.Language;
22 import com.intellij.lang.html.HTMLLanguage;
23 import com.intellij.lang.html.HtmlCompatibleLanguage;
24 import com.intellij.lang.xhtml.XHTMLLanguage;
25 import com.intellij.lang.xml.XMLLanguage;
26 import com.intellij.openapi.project.DumbService;
27 import com.intellij.openapi.vfs.VirtualFile;
28 import com.intellij.openapi.vfs.impl.http.HttpVirtualFile;
29 import com.intellij.psi.PsiElement;
30 import com.intellij.testFramework.LightVirtualFile;
31 import com.intellij.util.Url;
32 import com.intellij.util.Urls;
33 import com.intellij.util.containers.ContainerUtil;
34 import com.intellij.xml.util.HtmlUtil;
35 import org.jetbrains.annotations.NotNull;
36 import org.jetbrains.annotations.Nullable;
37
38 import java.util.Collection;
39 import java.util.Collections;
40
41 public class WebBrowserServiceImpl extends WebBrowserService {
42   public static boolean isHtmlOrXmlFile(@NotNull PsiElement element) {
43     Language language = element.getLanguage();
44     if (language instanceof HtmlCompatibleLanguage) {
45       return true;
46     }
47     return language == HTMLLanguage.INSTANCE || language == XHTMLLanguage.INSTANCE || language == XMLLanguage.INSTANCE;
48   }
49
50   @NotNull
51   @Override
52   public Collection<Url> getUrlsToOpen(@NotNull OpenInBrowserRequest request, boolean preferLocalUrl) throws WebBrowserUrlProvider.BrowserException {
53     VirtualFile virtualFile = request.getVirtualFile();
54     if (virtualFile instanceof HttpVirtualFile) {
55       return Collections.singleton(Urls.newFromVirtualFile(virtualFile));
56     }
57
58     if (!preferLocalUrl || !isHtmlOrXmlFile(request.getFile())) {
59       WebBrowserUrlProvider provider = getProvider(request);
60       if (provider != null) {
61         if (request.getResult() != null) {
62           return request.getResult();
63         }
64
65         try {
66           Collection<Url> urls = provider.getUrls(request);
67           if (!urls.isEmpty()) {
68             return urls;
69           }
70         }
71         catch (WebBrowserUrlProvider.BrowserException e) {
72           if (!HtmlUtil.isHtmlFile(request.getFile())) {
73             throw e;
74           }
75         }
76       }
77     }
78     return virtualFile instanceof LightVirtualFile || !request.getFile().getViewProvider().isPhysical() ? Collections.<Url>emptySet() : Collections.singleton(Urls.newFromVirtualFile(virtualFile));
79   }
80
81   @Nullable
82   public static WebBrowserUrlProvider getProvider(@NotNull OpenInBrowserRequest request) {
83     DumbService dumbService = DumbService.getInstance(request.getProject());
84     for (WebBrowserUrlProvider urlProvider : WebBrowserUrlProvider.EP_NAME.getExtensions()) {
85       if ((!dumbService.isDumb() || DumbService.isDumbAware(urlProvider)) && urlProvider.canHandleElement(request)) {
86         return urlProvider;
87       }
88     }
89     return null;
90   }
91
92   @Nullable
93   public static Url getUrlForContext(@NotNull PsiElement sourceElement) {
94     Url url;
95     try {
96       Collection<Url> urls = WebBrowserService.getInstance().getUrlsToOpen(sourceElement, false);
97       url = ContainerUtil.getFirstItem(urls);
98       if (url == null) {
99         return null;
100       }
101     }
102     catch (WebBrowserUrlProvider.BrowserException ignored) {
103       return null;
104     }
105
106     VirtualFile virtualFile = sourceElement.getContainingFile().getVirtualFile();
107     if (virtualFile == null) {
108       return null;
109     }
110
111     return !url.isInLocalFileSystem() || HtmlUtil.isHtmlFile(virtualFile) ? url : null;
112   }
113 }