You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by jo...@apache.org on 2011/05/24 21:22:50 UTC
svn commit: r1127231 - in /shindig/trunk/java/gadgets/src:
main/java/org/apache/shindig/gadgets/js/
test/java/org/apache/shindig/gadgets/js/
Author: johnh
Date: Tue May 24 19:22:49 2011
New Revision: 1127231
URL: http://svn.apache.org/viewvc?rev=1127231&view=rev
Log:
Removes AddJslCallbackProcessor in favor of blending it with
AddOnloadFunctionProcessor.
The two classes provide the same general functionality, with commingled logic.
"First-stage"/dynamic JS uses an &onload= handler injected by name, whereas
"second-stage" JS, loaded by jsload=1, uses a callback set up by the loader
rather than being directly injected. This is because the second-stage JS is
intended to be highly-cacheable -- to the point where it can be precomputed.
Removed:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/AddJslCallbackProcessor.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/AddJslCallbackProcessorTest.java
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/AddOnloadFunctionProcessor.java
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsServingPipelineModule.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/AddOnloadFunctionProcessorTest.java
Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/AddOnloadFunctionProcessor.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/AddOnloadFunctionProcessor.java?rev=1127231&r1=1127230&r2=1127231&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/AddOnloadFunctionProcessor.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/AddOnloadFunctionProcessor.java Tue May 24 19:22:49 2011
@@ -21,16 +21,23 @@ package org.apache.shindig.gadgets.js;
import com.google.common.annotations.VisibleForTesting;
import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.shindig.gadgets.uri.JsUriManager.JsUri;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletResponse;
/**
- * Adds code to call a function after the Javascript code has been interpreted.
+ * Adds code to call an onload function after the Javascript code has been interpreted.
+ * The onload function can be injected in one of two ways:
+ * 1. Via the &onload query parameter. This is used for "first-stage" JS when the method
+ * is directly injected.
+ * 2. Via ___jsl.c variable. This is set by "loader" JS which loads highly-cached
+ * 2nd-stage code that does not have onload injected.
*/
public class AddOnloadFunctionProcessor implements JsProcessor {
- private static final String CODE_ID = "[onload-processor]";
+ private static final String ONLOAD_CODE_ID = "[onload-processor]";
+ private static final String JSL_CODE_ID = "[jsload-callback]";
@VisibleForTesting
public static final String ONLOAD_FUNCTION_NAME_ERROR = "Invalid onload callback specified";
@@ -42,23 +49,38 @@ public class AddOnloadFunctionProcessor
"window[nm]();" +
'}' +
"})();";
+
+ @VisibleForTesting
+ static final String JSL_CALLBACK_JS = "(function(){" +
+ "var j=window['___jsl'];" +
+ "if(j['c']&&--j['o']<=0){"+
+ "j['c']();" +
+ "delete j['c'];" +
+ "delete j['o'];" +
+ "}" +
+ "})();";
private static final Pattern ONLOAD_FN_PATTERN = Pattern.compile("[a-zA-Z0-9_]+");
public boolean process(JsRequest request, JsResponseBuilder builder)
throws JsException {
+ JsUri jsUri = request.getJsUri();
+
// Add onload handler to add callback function.
- String onloadStr = request.getJsUri().getOnload();
+ String onloadStr = jsUri.getOnload();
if (onloadStr != null) {
if (!ONLOAD_FN_PATTERN.matcher(onloadStr).matches()) {
throw new JsException(HttpServletResponse.SC_BAD_REQUEST, ONLOAD_FUNCTION_NAME_ERROR);
}
- builder.appendJs(createOnloadScript(onloadStr), CODE_ID);
+ builder.appendJs(createOnloadScript(onloadStr), ONLOAD_CODE_ID);
+ } else if (jsUri.isNohint()) {
+ // "Second-stage" JS, which may have had a callback set by loader.
+ // This type of JS doesn't create a hint, but does attempt to use one.
+ builder.appendJs(JSL_CALLBACK_JS, JSL_CODE_ID);
}
return true;
}
-
@VisibleForTesting
String createOnloadScript(String function) {
return String.format(ONLOAD_JS_TPL, StringEscapeUtils.escapeJavaScript(function));
Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsServingPipelineModule.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsServingPipelineModule.java?rev=1127231&r1=1127230&r2=1127231&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsServingPipelineModule.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsServingPipelineModule.java Tue May 24 19:22:49 2011
@@ -49,8 +49,7 @@ public class JsServingPipelineModule ext
SeparatorCommentingProcessor separatorCommentingProcessor,
ConfigInjectionProcessor configInjectionProcessor,
AddJslLoadedVariableProcessor addJslLoadedVariableProcessor,
- AddOnloadFunctionProcessor addOnloadFunctionProcessor,
- AddJslCallbackProcessor addJslCallbackProcessor) {
+ AddOnloadFunctionProcessor addOnloadFunctionProcessor) {
return ImmutableList.of(
addJslInfoVariableProcessor,
jsLoaderGeneratorProcessor,
@@ -61,8 +60,7 @@ public class JsServingPipelineModule ext
separatorCommentingProcessor,
configInjectionProcessor,
addJslLoadedVariableProcessor,
- addOnloadFunctionProcessor,
- addJslCallbackProcessor);
+ addOnloadFunctionProcessor);
}
@Provides
Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/AddOnloadFunctionProcessorTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/AddOnloadFunctionProcessorTest.java?rev=1127231&r1=1127230&r2=1127231&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/AddOnloadFunctionProcessorTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/AddOnloadFunctionProcessorTest.java Tue May 24 19:22:49 2011
@@ -54,8 +54,9 @@ public class AddOnloadFunctionProcessorT
}
@Test
- public void testSkipsWhenNoOnloadIsSpecified() throws Exception {
+ public void testSkipsWhenNoOnloadAndWithHintSpecified() throws Exception {
EasyMock.expect(jsUri.getOnload()).andReturn(null);
+ EasyMock.expect(jsUri.isNohint()).andReturn(false);
response = control.createMock(JsResponseBuilder.class);
control.replay();
assertTrue(processor.process(request, response));
@@ -86,4 +87,24 @@ public class AddOnloadFunctionProcessorT
assertEquals(expectedBody, response.build().toJsString());
control.verify();
}
+
+ @Test
+ public void testWithoutHint() throws Exception {
+ EasyMock.expect(jsUri.getOnload()).andReturn(null);
+ EasyMock.expect(jsUri.isNohint()).andReturn(true);
+ control.replay();
+ assertTrue(processor.process(request, response));
+ assertEquals(AddOnloadFunctionProcessor.JSL_CALLBACK_JS, response.build().toJsString());
+ control.verify();
+ }
+
+ @Test
+ public void testWithHint() throws Exception {
+ EasyMock.expect(jsUri.getOnload()).andReturn(null);
+ EasyMock.expect(jsUri.isNohint()).andReturn(false);
+ control.replay();
+ assertTrue(processor.process(request, response));
+ assertEquals("", response.build().toJsString());
+ control.verify();
+ }
}