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();
+  }
 }