Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

V0.4.4

  • Loading branch information...
commit d195c735e3d8d24270fec360462fc75bef34f207 1 parent aeb5fe2
@rbackhouse rbackhouse authored
Showing with 131 additions and 15 deletions.
  1. BIN  org.dojotoolkit.compressor.shrinksafe/org/dojotoolkit/compressor/shrinksafe/ShrinksafeJSCompressor.class
  2. +1 −1  org.dojotoolkit.compressor/META-INF/MANIFEST.MF
  3. BIN  org.dojotoolkit.compressor/org/dojotoolkit/compressor/JSCompressorContentFilter.class
  4. BIN  org.dojotoolkit.compressor/org/dojotoolkit/compressor/JSCompressorFactoryImpl.class
  5. +5 −1 org.dojotoolkit.compressor/src/org/dojotoolkit/compressor/JSCompressorContentFilter.java
  6. BIN  org.dojotoolkit.json/org/dojotoolkit/json/JSONParser.class
  7. BIN  org.dojotoolkit.json/org/dojotoolkit/json/JSONSerializer.class
  8. BIN  org.dojotoolkit.json/org/dojotoolkit/json/internal/Token.class
  9. BIN  org.dojotoolkit.json/org/dojotoolkit/json/internal/Tokenizer.class
  10. +1 −1  org.dojotoolkit.optimizer.amd.rhinoast/META-INF/MANIFEST.MF
  11. BIN  org.dojotoolkit.optimizer.amd.rhinoast/org/dojotoolkit/optimizer/amd/rhinoast/AMDJSOptimizer$AstVisitor.class
  12. BIN  org.dojotoolkit.optimizer.amd.rhinoast/org/dojotoolkit/optimizer/amd/rhinoast/AMDJSOptimizer$Module.class
  13. BIN  org.dojotoolkit.optimizer.amd.rhinoast/org/dojotoolkit/optimizer/amd/rhinoast/AMDJSOptimizer.class
  14. +31 −7 org.dojotoolkit.optimizer.amd.rhinoast/src/org/dojotoolkit/optimizer/amd/rhinoast/AMDJSOptimizer.java
  15. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/AMDJSHandler.class
  16. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/CountWriter.class
  17. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/HTMLParser$HTMLWriter.class
  18. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/HTMLParser.class
  19. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/JSFilter$RequestWrapper.class
  20. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/JSFilter.class
  21. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/JSHandler$OptimizerRunnable.class
  22. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/JSHandler.class
  23. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/JSServlet.class
  24. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/JSURLGenerator.class
  25. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/MultiContextResourceLoader.class
  26. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/RhinoASTScriptAnalyzer.class
  27. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/RhinoScriptAnalyzer.class
  28. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/ServletResourceLoader.class
  29. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/SyncLoaderJSHandler.class
  30. BIN  ....servlet/org/dojotoolkit/optimizer/servlet/osgi/ZazlServicesTracker$JSCompressorFactoryServiceTracker.class
  31. BIN  ...r.servlet/org/dojotoolkit/optimizer/servlet/osgi/ZazlServicesTracker$JSOptimizerFactoryServiceTracker.class
  32. BIN  ...otoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/osgi/ZazlServicesTracker$ResourceServlet.class
  33. BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/osgi/ZazlServicesTracker.class
  34. +18 −4 org.dojotoolkit.optimizer.servlet/src/org/dojotoolkit/optimizer/servlet/AMDJSHandler.java
  35. +43 −0 org.dojotoolkit.optimizer.servlet/src/org/dojotoolkit/optimizer/servlet/CountWriter.java
  36. +32 −1 org.dojotoolkit.optimizer.servlet/src/org/dojotoolkit/optimizer/servlet/JSHandler.java
  37. BIN  org.dojotoolkit.optimizer/org/dojotoolkit/optimizer/CachingJSOptimizer.class
  38. BIN  org.dojotoolkit.optimizer/org/dojotoolkit/optimizer/ChecksumCreator.class
  39. BIN  org.dojotoolkit.optimizer/org/dojotoolkit/optimizer/JSAnalysisDataImpl.class
  40. BIN  org.dojotoolkit.optimizer/org/dojotoolkit/optimizer/JSOptimizerFactoryImpl.class
  41. BIN  org.dojotoolkit.optimizer/org/dojotoolkit/optimizer/Util.class
  42. BIN  org.dojotoolkit.server.util/org/dojotoolkit/server/util/osgi/DojoServicesInitializer.class
  43. BIN  org.dojotoolkit.server.util/org/dojotoolkit/server/util/osgi/OSGiResourceLoader.class
  44. BIN  org.dojotoolkit.server.util/org/dojotoolkit/server/util/resource/CachingResourceLoader.class
  45. BIN  org.dojotoolkit.server.util/org/dojotoolkit/server/util/rhino/RhinoClassLoader.class
  46. BIN  org.dojotoolkit.server.util/org/dojotoolkit/server/util/rhino/RhinoJSMethods.class
View
BIN  org.dojotoolkit.compressor.shrinksafe/org/dojotoolkit/compressor/shrinksafe/ShrinksafeJSCompressor.class
Binary file not shown
View
2  org.dojotoolkit.compressor/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Compressor
Bundle-SymbolicName: org.dojotoolkit.compressor
-Bundle-Version: 0.3.8
+Bundle-Version: 0.4.4
Import-Package: org.dojotoolkit.server.util.resource,
org.osgi.framework;version="1.3.0"
Bundle-RequiredExecutionEnvironment: J2SE-1.5
View
BIN  org.dojotoolkit.compressor/org/dojotoolkit/compressor/JSCompressorContentFilter.class
Binary file not shown
View
BIN  org.dojotoolkit.compressor/org/dojotoolkit/compressor/JSCompressorFactoryImpl.class
Binary file not shown
View
6 org.dojotoolkit.compressor/src/org/dojotoolkit/compressor/JSCompressorContentFilter.java
@@ -31,7 +31,11 @@ public JSCompressorContentFilter(JSCompressorFactory jsCompressorFactory, Resour
}
}
}
-
+
+ public JSCompressor getJSCompressor() {
+ return jsCompressor;
+ }
+
protected String _runFilter(String content, String path) {
if (doCompress(path)) {
try {
View
BIN  org.dojotoolkit.json/org/dojotoolkit/json/JSONParser.class
Binary file not shown
View
BIN  org.dojotoolkit.json/org/dojotoolkit/json/JSONSerializer.class
Binary file not shown
View
BIN  org.dojotoolkit.json/org/dojotoolkit/json/internal/Token.class
Binary file not shown
View
BIN  org.dojotoolkit.json/org/dojotoolkit/json/internal/Tokenizer.class
Binary file not shown
View
2  org.dojotoolkit.optimizer.amd.rhinoast/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Rhinoast
Bundle-SymbolicName: org.dojotoolkit.optimizer.amd.rhinoast
-Bundle-Version: 0.4.3
+Bundle-Version: 0.4.4
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Require-Bundle: org.dojotoolkit.optimizer
Import-Package: org.dojotoolkit.json,
View
BIN  ...ojotoolkit.optimizer.amd.rhinoast/org/dojotoolkit/optimizer/amd/rhinoast/AMDJSOptimizer$AstVisitor.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.amd.rhinoast/org/dojotoolkit/optimizer/amd/rhinoast/AMDJSOptimizer$Module.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.amd.rhinoast/org/dojotoolkit/optimizer/amd/rhinoast/AMDJSOptimizer.class
Binary file not shown
View
38 org.dojotoolkit.optimizer.amd.rhinoast/src/org/dojotoolkit/optimizer/amd/rhinoast/AMDJSOptimizer.java
@@ -37,9 +37,11 @@
import org.mozilla.javascript.ast.ArrayLiteral;
import org.mozilla.javascript.ast.AstNode;
import org.mozilla.javascript.ast.AstRoot;
+import org.mozilla.javascript.ast.ConditionalExpression;
import org.mozilla.javascript.ast.FunctionCall;
import org.mozilla.javascript.ast.Name;
import org.mozilla.javascript.ast.NodeVisitor;
+import org.mozilla.javascript.ast.ParenthesizedExpression;
import org.mozilla.javascript.ast.StringLiteral;
public class AMDJSOptimizer extends CachingJSOptimizer {
@@ -463,15 +465,12 @@ public boolean visit(AstNode astNode) {
if (astNode instanceof FunctionCall) {
FunctionCall functionCall = (FunctionCall)astNode;
AstNode target = functionCall.getTarget();
- String callName = "";
- if (target instanceof Name) {
- callName = ((Name)target).getIdentifier();
- }
+ String callName = getCallName(target);
if (callName.equals("define") || callName.equals("require")) {
List<AstNode> args = functionCall.getArguments();
if (callName.equals("define") && args.get(0) instanceof StringLiteral == false) {
Map<String, Object> missingName = new HashMap<String, Object>();
- missingName.put("nameIndex", new Long(functionCall.getAbsolutePosition()+callName.length()+1));
+ missingName.put("nameIndex", new Long(functionCall.getAbsolutePosition()+functionCall.getLp()+1));
missingName.put("uri", url);
missingName.put("id", this.moduleId);
missingNamesList.add(missingName);
@@ -575,6 +574,27 @@ public boolean visit(AstNode astNode) {
return true;
}
+ private String getCallName(AstNode target) {
+ String callName = "";
+ if (target instanceof Name) {
+ callName = ((Name)target).getIdentifier();
+ } else if (target instanceof ParenthesizedExpression) {
+ ParenthesizedExpression parenthesizedExpression = (ParenthesizedExpression)target;
+ AstNode expression = parenthesizedExpression.getExpression();
+ if (expression instanceof ConditionalExpression) {
+ ConditionalExpression conditionalExpression = (ConditionalExpression)expression;
+ AstNode trueExpression = conditionalExpression.getTrueExpression();
+ AstNode falseExpression = conditionalExpression.getFalseExpression();
+ if (trueExpression instanceof Name) {
+ callName = ((Name)trueExpression).getIdentifier();
+ } else if (falseExpression instanceof Name) {
+ callName = ((Name)falseExpression).getIdentifier();
+ }
+ }
+ }
+ return callName;
+ }
+
private Map<String, String> processPluginRef(String pluginName, String pluginValue) {
Map<String, String> pluginRef = new HashMap<String, String>();
pluginRef.put("name", pluginValue);
@@ -587,8 +607,12 @@ public boolean visit(AstNode astNode) {
Map<String, Object> plugin = (Map<String, Object>)plugins.get(pluginName);
String proxy = (String)plugin.get("proxy");
- normalizedName = expand(pluginValue, pathStack, config);
- moduleUrl = idToUrl(normalizedName, config);
+ if (pluginValue.length() > 0) {
+ normalizedName = expand(pluginValue, pathStack, config);
+ moduleUrl = idToUrl(normalizedName, config);
+ } else {
+ moduleUrl = normalizedName = pluginValue;
+ }
Map<String, Object> proxyReturn = callProxy(proxy, pluginName, pluginValue, normalizedName, moduleUrl);
if (proxyReturn.get("normalizedName") != null) {
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/AMDJSHandler.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/CountWriter.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/HTMLParser$HTMLWriter.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/HTMLParser.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/JSFilter$RequestWrapper.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/JSFilter.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/JSHandler$OptimizerRunnable.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/JSHandler.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/JSServlet.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/JSURLGenerator.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/MultiContextResourceLoader.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/RhinoASTScriptAnalyzer.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/RhinoScriptAnalyzer.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/ServletResourceLoader.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/SyncLoaderJSHandler.class
Binary file not shown
View
BIN  ...rvlet/org/dojotoolkit/optimizer/servlet/osgi/ZazlServicesTracker$JSCompressorFactoryServiceTracker.class
Binary file not shown
View
BIN  ...ervlet/org/dojotoolkit/optimizer/servlet/osgi/ZazlServicesTracker$JSOptimizerFactoryServiceTracker.class
Binary file not shown
View
BIN  ...olkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/osgi/ZazlServicesTracker$ResourceServlet.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer.servlet/org/dojotoolkit/optimizer/servlet/osgi/ZazlServicesTracker.class
Binary file not shown
View
22 org.dojotoolkit.optimizer.servlet/src/org/dojotoolkit/optimizer/servlet/AMDJSHandler.java
@@ -8,6 +8,7 @@
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
@@ -28,13 +29,15 @@ public AMDJSHandler(String configFileName) {
}
@SuppressWarnings("unchecked")
- protected void customHandle(HttpServletRequest request, Writer writer, JSAnalysisData analysisData, JSAnalysisData[] excludes) throws ServletException, IOException {
- if (analysisData != null) {
+ protected void customHandle(HttpServletRequest request, Writer handlerWriter, JSAnalysisData analysisData, JSAnalysisData[] excludes) throws ServletException, IOException {
+ if (analysisData != null) {
+ CountWriter writer = new CountWriter(handlerWriter);
writer.write("zazl.addAnalysisKey('"+analysisData.getKey()+"');\n");
String suffixCode = (String)config.get("suffixCode");
if (suffixCode != null) {
writer.write(suffixCode);
}
+ writer.write("if (typeof dojoConfig === 'undefined') { dojoConfig = {};}\ndojoConfig.locale = '"+request.getLocale().toString().toLowerCase().replace('_', '-')+"';\n");
String[] dependencies = analysisData.getDependencies();
Map<String, List<Map<String, String>>> pluginRefs = analysisData.getPluginRefs();
List<Localization> localizations = new ArrayList<Localization>();
@@ -81,6 +84,7 @@ protected void customHandle(HttpServletRequest request, Writer writer, JSAnalysi
if (localizations.size() > 0) {
Util.writeAMDLocalizations(resourceLoader, writer, localizations, request.getLocale());
}
+ Map<String, Integer> offsetMap = new HashMap<String, Integer>();
for (String dependency : dependencies) {
String path = Util.normalizePath(dependency);
String content = resourceLoader.readResource(path);
@@ -94,10 +98,20 @@ protected void customHandle(HttpServletRequest request, Writer writer, JSAnalysi
modifiedSrc.append(content.substring(missingNameIndex));
content = modifiedSrc.toString();
}
-
- writer.write(compressorContentFilter.filter(content,path));
+ content = compressorContentFilter.filter(content,path);
+ int offset = writer.getLineCount();
+ offsetMap.put(path, new Integer(offset));
+ writer.write(content);
+ writer.write("\n");
}
}
+ if (compressorContentFilter.getJSCompressor() != null) {
+ try {
+ compressorContentFilter.getJSCompressor().getSourceMap("");
+ writer.write("//@ sourceMappingURL=_javascript?sourcemap="+analysisData.getKey()+".map\n");
+ sourceMapOffsets.put(analysisData.getKey(), offsetMap);
+ } catch (UnsupportedOperationException e) {}
+ }
}
}
View
43 org.dojotoolkit.optimizer.servlet/src/org/dojotoolkit/optimizer/servlet/CountWriter.java
@@ -0,0 +1,43 @@
+/*
+ Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
+ Available via Academic Free License >= 2.1 OR the modified BSD license.
+ see: http://dojotoolkit.org/license for details
+*/
+package org.dojotoolkit.optimizer.servlet;
+
+import java.io.IOException;
+import java.io.Writer;
+
+public class CountWriter extends Writer {
+ private Writer w = null;
+ private int lineCount = 0;
+
+ public CountWriter(Writer w) {
+ this.w = w;
+ }
+
+ public void close() throws IOException {
+ w.close();
+ }
+
+ public void flush() throws IOException {
+ w.flush();
+ }
+
+ public void write(char[] cbuf, int off, int len) throws IOException {
+ for (int i = off; i < len; i++) {
+ write(cbuf[i]);
+ }
+ }
+
+ public int getLineCount() {
+ return lineCount;
+ }
+
+ public void write(int c) throws IOException {
+ w.write(c);
+ if (c == '\n') {
+ lineCount++;
+ }
+ }
+}
View
33 org.dojotoolkit.optimizer.servlet/src/org/dojotoolkit/optimizer/servlet/JSHandler.java
@@ -18,6 +18,8 @@
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
@@ -36,6 +38,7 @@
import org.dojotoolkit.optimizer.JSAnalysisData;
import org.dojotoolkit.optimizer.JSOptimizer;
import org.dojotoolkit.optimizer.JSOptimizerFactory;
+import org.dojotoolkit.optimizer.Util;
import org.dojotoolkit.server.util.resource.ResourceLoader;
import org.dojotoolkit.server.util.rhino.RhinoClassLoader;
@@ -52,6 +55,7 @@
protected String[] bootstrapModules = null;
protected String[] debugBootstrapModules = null;
protected JSCompressorContentFilter compressorContentFilter = null;
+ protected Map<String, Map<String, Integer>> sourceMapOffsets = null;
public JSHandler(String configFileName) {
try {
@@ -89,9 +93,13 @@ public void initialize(ResourceLoader resourceLoader,
}
}
compressorContentFilter = new JSCompressorContentFilter(jsCompressorFactory, resourceLoader);
+ sourceMapOffsets = Collections.synchronizedMap(new HashMap<String, Map<String, Integer>>());
}
public boolean handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ if (request.getParameter("sourcemap") != null) {
+ return handleSourceMapRequest(request, response);
+ }
String[] modules = null;
String modulesParam = request.getParameter("modules");
String key = request.getParameter("key");
@@ -188,10 +196,33 @@ public boolean handle(HttpServletRequest request, HttpServletResponse response)
}
return true;
}
-
+
public JSOptimizer getJSOptimizer() {
return jsOptimizer;
}
+
+ protected boolean handleSourceMapRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ String sourcemapKey = request.getParameter("sourcemap");
+ sourcemapKey = sourcemapKey.substring(0, sourcemapKey.indexOf(".map"));
+ JSAnalysisData analysisData = jsOptimizer.getAnalysisData(sourcemapKey);
+ Map<String, Integer> sourceMapOffset = sourceMapOffsets.get(sourcemapKey);
+ StringBuffer sb = new StringBuffer();
+ sb.append("{\"version\": 3, \"file\": \""+sourcemapKey+".js\", \"sections\": [");
+ String[] dependencies = analysisData.getDependencies();
+ for (String dependency : dependencies) {
+ String path = Util.normalizePath(dependency);
+ Integer offset = sourceMapOffset.get(path);
+ String sourcemap = compressorContentFilter.getJSCompressor().getSourceMap(path+".map");
+ sb.append("{\"offset\": {\"line\": "+offset+", \"column\": 0}, \"map\": ");
+ sb.append(sourcemap);
+ sb.append("},");
+ }
+ sb.deleteCharAt(sb.length()-1);
+ sb.append("]}");
+ response.getWriter().write(sb.toString());
+ return true;
+
+ }
protected abstract void customHandle(HttpServletRequest request, Writer writer, JSAnalysisData analysisData, JSAnalysisData[] exclude) throws ServletException, IOException;
View
BIN  org.dojotoolkit.optimizer/org/dojotoolkit/optimizer/CachingJSOptimizer.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer/org/dojotoolkit/optimizer/ChecksumCreator.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer/org/dojotoolkit/optimizer/JSAnalysisDataImpl.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer/org/dojotoolkit/optimizer/JSOptimizerFactoryImpl.class
Binary file not shown
View
BIN  org.dojotoolkit.optimizer/org/dojotoolkit/optimizer/Util.class
Binary file not shown
View
BIN  org.dojotoolkit.server.util/org/dojotoolkit/server/util/osgi/DojoServicesInitializer.class
Binary file not shown
View
BIN  org.dojotoolkit.server.util/org/dojotoolkit/server/util/osgi/OSGiResourceLoader.class
Binary file not shown
View
BIN  org.dojotoolkit.server.util/org/dojotoolkit/server/util/resource/CachingResourceLoader.class
Binary file not shown
View
BIN  org.dojotoolkit.server.util/org/dojotoolkit/server/util/rhino/RhinoClassLoader.class
Binary file not shown
View
BIN  org.dojotoolkit.server.util/org/dojotoolkit/server/util/rhino/RhinoJSMethods.class
Binary file not shown
Please sign in to comment.
Something went wrong with that request. Please try again.