Author: mhermanto
Date: Tue Apr 12 03:20:01 2011
New Revision: 1091280
URL: http://svn.apache.org/viewvc?rev=1091280&view=rev
Log:
Allow override for JS loading mechanism.
http://codereview.appspot.com/4388053/
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsLoadProcessor.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsLoadProcessorTest.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsServletTest.java
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java?rev=1091280&r1=1091279&r2=1091280&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
(original)
+++
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
Tue Apr 12 03:20:01 2011
@@ -68,6 +68,7 @@ public class DefaultGuiceModule extends
bind(Executor.class).annotatedWith(Names.named("shindig.concat.executor")).to(ShindigExecutorService.class);
bindConstant().annotatedWith(Names.named("shindig.jsload.ttl-secs")).to(60
* 60); // 1 hour
+
bindConstant().annotatedWith(Names.named("shindig.jsload.require-onload-with-jsload")).to(true);
install(new DefaultConfigContributorModule());
install(new ParseModule());
@@ -99,7 +100,7 @@ public class DefaultGuiceModule extends
handlerBinder.addBinding().to(HttpRequestHandler.class);
handlerBinder.addBinding().to(GadgetsHandler.class);
}
-
+
/**
* Sets up the multibinding for extended feature resources
*/
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsLoadProcessor.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsLoadProcessor.java?rev=1091280&r1=1091279&r2=1091280&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsLoadProcessor.java
(original)
+++
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsLoadProcessor.java
Tue Apr 12 03:20:01 2011
@@ -43,18 +43,17 @@ public class JsLoadProcessor implements
"})();"; // Concatenated to avoid some browsers do dynamic script
injection.
private final JsUriManager jsUriManager;
- private int jsloadTtlSecs;
+ private final int jsloadTtlSecs;
+ private final boolean requireOnload;
@Inject
public JsLoadProcessor(
- JsUriManager jsUriManager, @Named("shindig.jsload.ttl-secs") int
jsloadTtlSecs) {
+ JsUriManager jsUriManager,
+ @Named("shindig.jsload.ttl-secs") int jsloadTtlSecs,
+ @Named("shindig.jsload.require-onload-with-jsload") boolean
requireOnload) {
this.jsUriManager = jsUriManager;
this.jsloadTtlSecs = jsloadTtlSecs;
- }
-
- @VisibleForTesting
- public void setJsloadTtlSecs(int jsloadTtlSecs) {
- this.jsloadTtlSecs = jsloadTtlSecs;
+ this.requireOnload = requireOnload;
}
public boolean process(JsRequest request, JsResponseBuilder builder)
@@ -65,33 +64,36 @@ public class JsLoadProcessor implements
// versioned JS. The loader script is much smaller and cacheable for a
// configurable amount of time.
if (jsUri.isJsload()) {
+ // Require users to specify &onload=. This ensures a reliable
continuation
+ // of JS execution. IE asynchronously loads script, before it loads
+ // source-scripted and inlined JS.
+ if (requireOnload && jsUri.getOnload() == null) {
+ throw new JsException(HttpServletResponse.SC_BAD_REQUEST,
JSLOAD_ONLOAD_ERROR);
+ }
+
+ int refresh = getCacheTtlSecs(jsUri);
+ builder.setCacheTtlSecs(refresh);
+ builder.setProxyCacheable(true);
+
doJsload(jsUri, builder);
return false;
}
return true;
}
- private void doJsload(JsUri jsUri, JsResponseBuilder resp)
+ protected void doJsload(JsUri jsUri, JsResponseBuilder resp)
throws JsException {
- String onloadStr = jsUri.getOnload();
-
- // Require users to specify &onload=. This ensures a reliable continuation
- // of JS execution. IE asynchronously loads script, before it loads
- // source-scripted and inlined JS.
- if (onloadStr == null) {
- throw new JsException(HttpServletResponse.SC_BAD_REQUEST,
JSLOAD_ONLOAD_ERROR);
- }
-
jsUri.setJsload(false);
jsUri.setNohint(true);
Uri incUri = jsUriManager.makeExternJsUri(jsUri);
-
- int refresh = getCacheTtlSecs(jsUri);
- resp.setCacheTtlSecs(refresh);
- resp.setProxyCacheable(true);
resp.appendJs(createJsloadScript(incUri), CODE_ID);
}
+ protected String createJsloadScript(Uri uri) {
+ String uriString = uri.toString();
+ return String.format(JSLOAD_JS_TPL, uriString);
+ }
+
private int getCacheTtlSecs(JsUri jsUri) {
if (jsUri.isNoCache()) {
return 0;
@@ -102,10 +104,4 @@ public class JsLoadProcessor implements
}
}
- @VisibleForTesting
- String createJsloadScript(Uri uri) {
- String uriString = uri.toString();
- return String.format(JSLOAD_JS_TPL, uriString);
- }
-
}
Modified:
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsLoadProcessorTest.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsLoadProcessorTest.java?rev=1091280&r1=1091279&r2=1091280&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsLoadProcessorTest.java
(original)
+++
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsLoadProcessorTest.java
Tue Apr 12 03:20:01 2011
@@ -54,11 +54,11 @@ public class JsLoadProcessorTest {
jsUri = control.createMock(JsUri.class);
uri = Uri.parse("http://example.org/foo.xml");
response = new JsResponseBuilder();
- processor = new JsLoadProcessor(jsUriManager, 1234);
-
+ processor = new JsLoadProcessor(jsUriManager, 1234, true);
+
EasyMock.expect(request.getJsUri()).andReturn(jsUri);
}
-
+
@Test
public void testSkipsWhenNoJsLoad() throws Exception {
EasyMock.expect(jsUri.isJsload()).andReturn(false);
@@ -67,7 +67,7 @@ public class JsLoadProcessorTest {
assertTrue(processor.process(request, response));
control.verify();
}
-
+
@Test
public void testFailsWhenNoOnloadIsSpecified() throws Exception {
EasyMock.expect(jsUri.isJsload()).andReturn(true);
@@ -82,7 +82,7 @@ public class JsLoadProcessorTest {
}
control.verify();
}
-
+
@Test
public void testGeneratesLoaderCodeWithNoCache() throws Exception {
setExpectations(true, null);
Modified:
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsServletTest.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsServletTest.java?rev=1091280&r1=1091279&r2=1091280&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsServletTest.java
(original)
+++
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsServletTest.java
Tue Apr 12 03:20:01 2011
@@ -72,8 +72,10 @@ public class JsServletTest extends Servl
servlet.setJsRequestBuilder(new JsRequestBuilder(jsUriManagerMock));
getJsProcessorMock = mock(GetJsContentProcessor.class);
-
- jsLoadProcessor = new JsLoadProcessor(jsUriManagerMock, 0);
+ }
+
+ private void setUp(int jsloadTtlSecs) {
+ jsLoadProcessor = new JsLoadProcessor(jsUriManagerMock, jsloadTtlSecs,
true);
JsProcessorRegistry jsProcessorRegistry =
new DefaultJsProcessorRegistry(
ImmutableList.<JsProcessor>of(jsLoadProcessor, new
IfModifiedSinceProcessor(),
@@ -110,16 +112,18 @@ public class JsServletTest extends Servl
@Test
public void testJsServletGivesErrorWhenUriManagerThrowsException() throws
Exception {
+ setUp(0);
expect(jsUriManagerMock.processExternJsUri(isA(Uri.class))).andThrow(new
GadgetException(null));
replay();
-
+
servlet.doGet(request, recorder);
assertEquals(HttpServletResponse.SC_BAD_REQUEST,
recorder.getHttpStatusCode());
verify();
}
-
+
@Test
public void
testWithIfModifiedSinceHeaderPresentAndVersionReturnsNotModified() throws
Exception {
+ setUp(0);
JsUri jsUri = mockJsUri(CONTAINER_PARAM, RenderingContext.CONTAINER,
false, false, false,
null, REFRESH_INTERVAL_SEC, UriStatus.VALID_VERSIONED);
expect(jsUriManagerMock.processExternJsUri(isA(Uri.class))).andReturn(jsUri);
@@ -130,9 +134,10 @@ public class JsServletTest extends Servl
assertEquals(HttpServletResponse.SC_NOT_MODIFIED,
recorder.getHttpStatusCode());
verify();
}
-
+
@Test
public void testWithIfModifiedSinceHeaderPresentButNoVersionActsNormal()
throws Exception {
+ setUp(0);
JsUri jsUri = mockJsUri(CONTAINER_PARAM, RenderingContext.CONTAINER,
false, false, false,
null, REFRESH_INTERVAL_SEC, UriStatus.VALID_UNVERSIONED);
expect(jsUriManagerMock.processExternJsUri(isA(Uri.class))).andReturn(jsUri);
@@ -154,9 +159,10 @@ public class JsServletTest extends Servl
assertEquals(EXAMPLE_JS_CODE, recorder.getResponseAsString());
verify();
}
-
+
@Test
public void testDoJsloadNormal() throws Exception {
+ setUp(0);
String url =
"http://localhost/gadgets/js/feature.js?v=abc&nocache=0&onload=" + ONLOAD_PARAM;
JsUri jsUri = mockJsUri(CONTAINER_PARAM, RenderingContext.CONTAINER, true,
true, false,
ONLOAD_PARAM, REFRESH_INTERVAL_SEC, UriStatus.VALID_VERSIONED);
@@ -176,6 +182,8 @@ public class JsServletTest extends Servl
@Test
public void testDoJsloadWithJsLoadTimeout() throws Exception {
+ setUp(TIMEOUT_SEC); // Enable JS load timeout.
+
String url =
"http://localhost/gadgets/js/feature.js?v=abc&nocache=0&onload=" + ONLOAD_PARAM;
JsUri jsUri = mockJsUri(CONTAINER_PARAM, RenderingContext.CONTAINER, true,
true,
false, ONLOAD_PARAM, -1, UriStatus.VALID_VERSIONED); // Disable
refresh interval.
@@ -183,7 +191,6 @@ public class JsServletTest extends Servl
expect(jsUriManagerMock.processExternJsUri(isA(Uri.class))).andReturn(jsUri);
expect(jsUriManagerMock.makeExternJsUri(isA(JsUri.class)))
.andReturn(Uri.parse(url));
- jsLoadProcessor.setJsloadTtlSecs(TIMEOUT_SEC); // Enable JS load timeout.
httpUtilMock.setCachingHeaders(recorder, TIMEOUT_SEC, false);
replay();
@@ -196,6 +203,7 @@ public class JsServletTest extends Servl
@Test
public void testDoJsloadNoOnload() throws Exception {
+ setUp(0);
JsUri jsUri = mockJsUri(CONTAINER_PARAM, RenderingContext.CONTAINER, true,
true, false,
null, // lacks &onload=
REFRESH_INTERVAL_SEC, UriStatus.VALID_VERSIONED);
@@ -210,6 +218,7 @@ public class JsServletTest extends Servl
@Test
public void testDoJsloadNoCache() throws Exception {
+ setUp(0);
String url =
"http://localhost/gadgets/js/feature.js?v=abc&nocache=1&onload=" + ONLOAD_PARAM;
JsUri jsUri = mockJsUri(CONTAINER_PARAM, RenderingContext.CONTAINER, true,
true,
true, // Set to no cache.