package com.intellij.javascript.debugger.impl; import com.intellij.lang.javascript.JavaScriptSupportLoader; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.xdebugger.XSourcePosition; import java.net.URI; import java.net.URISyntaxException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.mozilla.interfaces.jsdIScript; public class ScriptUtil { @NonNls private static final String FILE_SCHEME = "file"; @NonNls private static final String HTTP_SCHEME = "http"; @Nullable public static String getFileUrl(@NotNull jsdIScript script) { return fixFileUrl(script.getFileName()); } @Nullable public static String fixFileUrl(String fileUrl) { try { URI uri = new URI(fileUrl); String scheme = uri.getScheme(); if (FILE_SCHEME.equals(scheme)) { String path = FileUtil.toSystemIndependentName(uri.getPath()); if ((SystemInfo.isWindows) && (path.startsWith("/"))) path = path.substring(1); return VirtualFileManager.constructUrl(FILE_SCHEME, path); } if (HTTP_SCHEME.equals(scheme)) return fileUrl; return null; } catch (URISyntaxException e) { // ignore } return null; } public static boolean isPositionInside(@NotNull XSourcePosition position, @NotNull jsdIScript script, DebuggableFileFinder finder) { String fileUrl = getFileUrl(script); if (fileUrl == null) return false; if (!(position.getFile().equals(finder.findFile(fileUrl)))) { return false; } int line = position.getLine(); long firstLine = script.getBaseLineNumber() - 1L; return ((firstLine <= line) && (line < firstLine + script.getLineExtent())); } @NonNls public static String getScriptDebugDescription(@Nullable jsdIScript script) { if (script == null) return "null"; long from = script.getBaseLineNumber() - 1L; long to = from + script.getLineExtent() - 1L; return script.getFileName() + "(" + from + "-" + to + "), tag=" + script.getTag() + ((script.getIsValid()) ? "" : ", invalid"); } @Nullable public static VirtualFile findContaingingFile(@Nullable jsdIScript script, DebuggableFileFinder finder) { if (script == null) { return null; } String fileUrl = getFileUrl(script); if (fileUrl == null) { return null; } return finder.findFile(fileUrl); } public static boolean isHtmlOrJavaScript(@NotNull VirtualFile file) { FileType type = file.getFileType(); return type == StdFileTypes.HTML || type == StdFileTypes.XHTML || type == JavaScriptSupportLoader.JAVASCRIPT; // && !"as".equals(file.getExtension()); } }