You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2018/01/22 10:57:10 UTC

[1/2] wicket git commit: WICKET-6498 JavaScriptDeferHeaderResponse

Repository: wicket
Updated Branches:
  refs/heads/WICKET-6498_deferred_javascript_2 [created] a8588aa1a


WICKET-6498 JavaScriptDeferHeaderResponse

- translates OnDomReady and Load header items to their native non-jquery equivalents
- application uses a default IHeaderResponseDecorator now, that decorates with the ResourceAggregator; this allows to chain header response before and *after* the aggregator


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/c89546bf
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/c89546bf
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/c89546bf

Branch: refs/heads/WICKET-6498_deferred_javascript_2
Commit: c89546bf04cea718ee47cf80ae41e447f90975af
Parents: eb9f6c9
Author: Sven Meier <sv...@apache.org>
Authored: Mon Jan 22 11:33:46 2018 +0100
Committer: Sven Meier <sv...@apache.org>
Committed: Mon Jan 22 11:43:08 2018 +0100

----------------------------------------------------------------------
 .../java/org/apache/wicket/Application.java     |  18 ++-
 .../head/filter/FilteringHeaderResponse.java    |   7 +-
 .../filter/JavaScriptDeferHeaderResponse.java   | 111 +++++++++++++++++++
 .../filter/FilteringHeaderResponseTest.java     |   3 +-
 .../html/DecoratingHeaderResponseTest.java      |   5 +-
 .../examples/ajax/builtin/AjaxApplication.java  |   7 ++
 .../ResourceDecorationApplication.java          |   3 +-
 7 files changed, 134 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/c89546bf/wicket-core/src/main/java/org/apache/wicket/Application.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Application.java b/wicket-core/src/main/java/org/apache/wicket/Application.java
index d6d4bb5..356c8b9 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Application.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Application.java
@@ -195,7 +195,9 @@ public abstract class Application implements UnboundListener, IEventSink
 	/**
 	 * The decorator this application uses to decorate any header responses created by Wicket
 	 */
-	private IHeaderResponseDecorator headerResponseDecorator;
+	private IHeaderResponseDecorator headerResponseDecorator = (headerresponse) -> {
+		return new ResourceAggregator(headerresponse);
+	};
 
 	/**
 	 * Checks if the <code>Application</code> threadlocal is set in this thread
@@ -1614,9 +1616,10 @@ public abstract class Application implements UnboundListener, IEventSink
 	 * @param headerResponseDecorator
 	 *            your custom decorator
 	 */
-	public final Application setHeaderResponseDecorator(
-		final IHeaderResponseDecorator headerResponseDecorator)
+	public final Application setHeaderResponseDecorator(final IHeaderResponseDecorator headerResponseDecorator)
 	{
+		Args.notNull(headerResponseDecorator, "headerResponseDecorator");
+		
 		this.headerResponseDecorator = headerResponseDecorator;
 		return this;
 	}
@@ -1636,14 +1639,7 @@ public abstract class Application implements UnboundListener, IEventSink
 	 */
 	public final IHeaderResponse decorateHeaderResponse(final IHeaderResponse response)
 	{
-		final IHeaderResponse aggregatingResponse = new ResourceAggregator(response);
-
-		if (headerResponseDecorator == null)
-		{
-			return aggregatingResponse;
-		}
-
-		return headerResponseDecorator.decorate(aggregatingResponse);
+		return headerResponseDecorator.decorate(response);
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/c89546bf/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponse.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponse.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponse.java
index 8dee02e..233b588 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponse.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponse.java
@@ -27,7 +27,6 @@ import org.apache.wicket.MetaDataKey;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.head.HeaderItem;
 import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.ResourceAggregator;
 import org.apache.wicket.markup.head.internal.HeaderResponse;
 import org.apache.wicket.markup.html.DecoratingHeaderResponse;
 import org.apache.wicket.request.Response;
@@ -263,14 +262,12 @@ public class FilteringHeaderResponse extends DecoratingHeaderResponse
 			}
 		};
 
-		ResourceAggregator resourceAggregator = new ResourceAggregator(headerRenderer);
-
 		for (HeaderItem curItem : resp)
 		{
-			resourceAggregator.render(curItem);
+			headerRenderer.render(curItem);
 		}
 
-		resourceAggregator.close();
+		headerRenderer.close();
 
 		return strResponse.getBuffer();
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/c89546bf/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/JavaScriptDeferHeaderResponse.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/JavaScriptDeferHeaderResponse.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/JavaScriptDeferHeaderResponse.java
new file mode 100644
index 0000000..15dd49e
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/JavaScriptDeferHeaderResponse.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.markup.head.filter;
+
+import org.apache.wicket.core.util.string.JavaScriptUtils;
+import org.apache.wicket.markup.head.AbstractJavaScriptReferenceHeaderItem;
+import org.apache.wicket.markup.head.HeaderItem;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.IWrappedHeaderItem;
+import org.apache.wicket.markup.head.JavaScriptContentHeaderItem;
+import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
+import org.apache.wicket.markup.head.OnLoadHeaderItem;
+import org.apache.wicket.markup.html.DecoratingHeaderResponse;
+import org.apache.wicket.request.Response;
+import org.apache.wicket.util.string.Strings;
+
+/**
+ * A header response that defers all {@link AbstractJavaScriptReferenceHeaderItem}s.
+ * 
+ * @author svenmeier
++ */
+public class JavaScriptDeferHeaderResponse extends DecoratingHeaderResponse
+{
+	public JavaScriptDeferHeaderResponse(IHeaderResponse response)
+	{
+		super(response);
+	}
+	
+	@Override
+	public void render(HeaderItem item)
+	{
+		if (item instanceof IWrappedHeaderItem) {
+			item = ((IWrappedHeaderItem)item).getWrapped();
+		}
+
+		if (item instanceof AbstractJavaScriptReferenceHeaderItem) {
+			((AbstractJavaScriptReferenceHeaderItem)item).setDefer(true);
+		} else if (item instanceof OnDomReadyHeaderItem) {
+			item = new NativeOnDomContentLoadedHeaderItem(((OnDomReadyHeaderItem)item).getJavaScript());
+		} else if (item instanceof OnLoadHeaderItem) {
+			item = new NativeOnLoadHeaderItem(((OnLoadHeaderItem)item).getJavaScript());
+		} else if (item instanceof JavaScriptContentHeaderItem) {
+			item = new NativeOnDomContentLoadedHeaderItem(((JavaScriptContentHeaderItem)item).getJavaScript());
+		}
+		
+		super.render(item);
+	}
+
+	private class NativeOnDomContentLoadedHeaderItem extends OnDomReadyHeaderItem
+	{
+		/**
+		 * Construct.
+		 *
+		 * @param javaScript
+		 */
+		public NativeOnDomContentLoadedHeaderItem(CharSequence javaScript)
+		{
+			super(javaScript);
+		}
+
+		@Override
+		public void render(Response response)
+		{
+			CharSequence js = getJavaScript();
+			if (Strings.isEmpty(js) == false)
+			{
+				JavaScriptUtils.writeJavaScript(response,
+					"(function(){ var f = function() {" + js + ";};\nif ('loading' !== document.readyState) f(); else document.addEventListener('DOMContentLoaded', f); })();");
+			}
+		}
+	}
+	
+	private class NativeOnLoadHeaderItem extends OnLoadHeaderItem
+	{
+
+		/**
+		 * Construct.
+		 *
+		 * @param javaScript
+		 */
+		public NativeOnLoadHeaderItem(CharSequence javaScript)
+		{
+			super(javaScript);
+		}
+
+		@Override
+		public void render(Response response)
+		{
+			CharSequence js = getJavaScript();
+			if (Strings.isEmpty(js) == false)
+			{
+				JavaScriptUtils.writeJavaScript(response,
+					"(function(){ var f = function() {" + js + ";};\nif ('complete' === document.readyState) f(); else window.addEventListener('load', f); })();");
+			}
+		}
+	}	
+} 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/c89546bf/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponseTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponseTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponseTest.java
index 6c50132..d8a901a 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponseTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponseTest.java
@@ -19,6 +19,7 @@ package org.apache.wicket.markup.head.filter;
 import java.util.Collections;
 
 import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.ResourceAggregator;
 import org.apache.wicket.markup.head.StringHeaderItem;
 import org.apache.wicket.markup.head.internal.HeaderResponse;
 import org.apache.wicket.markup.html.IHeaderResponseDecorator;
@@ -45,7 +46,7 @@ public class FilteringHeaderResponseTest extends WicketTestCase
 			{
 				// use this header resource decorator to load all JavaScript resources in the page
 				// footer (after </body>)
-				return new JavaScriptFilteredIntoFooterHeaderResponse(response, "footerJS");
+				return new ResourceAggregator(new JavaScriptFilteredIntoFooterHeaderResponse(response, "footerJS"));
 			}
 		});
 		executeTest(FilteredHeaderPage.class, "FilteredHeaderPageExpected.html");

http://git-wip-us.apache.org/repos/asf/wicket/blob/c89546bf/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java
index 7a8b533..30f8d5b 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java
@@ -24,6 +24,7 @@ import org.apache.wicket.markup.IMarkupResourceStreamProvider;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.head.JavaScriptReferenceHeaderItem;
+import org.apache.wicket.markup.head.ResourceAggregator;
 import org.apache.wicket.markup.parser.XmlPullParser;
 import org.apache.wicket.markup.parser.XmlTag;
 import org.apache.wicket.request.resource.PackageResourceReference;
@@ -56,7 +57,7 @@ public class DecoratingHeaderResponseTest extends WicketTestCase
 			@Override
 			public IHeaderResponse decorate(IHeaderResponse response)
 			{
-				return new DecoratingHeaderResponse(response)
+				return new ResourceAggregator(new DecoratingHeaderResponse(response)
 				{
 					@Override
 					public void render(HeaderItem item)
@@ -69,7 +70,7 @@ public class DecoratingHeaderResponseTest extends WicketTestCase
 						}
 						super.render(item);
 					}
-				};
+				});
 			}
 		});
 		tester.startPage(TestPage.class);

http://git-wip-us.apache.org/repos/asf/wicket/blob/c89546bf/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
index 82caa41..c38265a 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
@@ -22,6 +22,8 @@ import org.apache.wicket.ajax.AjaxNewWindowNotifyingBehavior;
 import org.apache.wicket.application.IComponentInitializationListener;
 import org.apache.wicket.examples.WicketExampleApplication;
 import org.apache.wicket.examples.ajax.builtin.modal.ModalWindowPage;
+import org.apache.wicket.markup.head.ResourceAggregator;
+import org.apache.wicket.markup.head.filter.JavaScriptDeferHeaderResponse;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.response.filter.AjaxServerAndClientTimeFilter;
 
@@ -44,6 +46,11 @@ public class AjaxApplication extends WicketExampleApplication
 
 		getDebugSettings().setAjaxDebugModeEnabled(true);
 		
+		setHeaderResponseDecorator(response -> {
+			// use this header resource decorator to defer all JavaScript resources
+			return new ResourceAggregator(new JavaScriptDeferHeaderResponse(response));
+		});
+
 		getComponentInitializationListeners().add(new IComponentInitializationListener()
 		{
 			@Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/c89546bf/wicket-examples/src/main/java/org/apache/wicket/examples/resourcedecoration/ResourceDecorationApplication.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/resourcedecoration/ResourceDecorationApplication.java b/wicket-examples/src/main/java/org/apache/wicket/examples/resourcedecoration/ResourceDecorationApplication.java
index 5af41de..b8b45e9 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/resourcedecoration/ResourceDecorationApplication.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/resourcedecoration/ResourceDecorationApplication.java
@@ -17,6 +17,7 @@
 package org.apache.wicket.examples.resourcedecoration;
 
 import org.apache.wicket.Application;
+import org.apache.wicket.markup.head.ResourceAggregator;
 import org.apache.wicket.markup.head.filter.JavaScriptFilteredIntoFooterHeaderResponse;
 import org.apache.wicket.markup.html.IHeaderResponseDecorator;
 import org.apache.wicket.protocol.http.WebApplication;
@@ -46,7 +47,7 @@ public class ResourceDecorationApplication extends WebApplication
 		setHeaderResponseDecorator(response -> {
 			// use this header resource decorator to load all JavaScript resources in the page
 			// footer (after </body>)
-			return new JavaScriptFilteredIntoFooterHeaderResponse(response, "footerJS");
+			return new ResourceAggregator(new JavaScriptFilteredIntoFooterHeaderResponse(response, "footerJS"));
 		});
 	}
 


[2/2] wicket git commit: WICKET-6498 always add event listener regardless of readyState

Posted by sv...@apache.org.
WICKET-6498 always add event listener regardless of readyState

for Ajax requests PartialPageUpdate will pack all OnDomReady and OnLoad items into an <evaluate> block anyways


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/a8588aa1
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/a8588aa1
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/a8588aa1

Branch: refs/heads/WICKET-6498_deferred_javascript_2
Commit: a8588aa1a371599f09e2d8b7b5752aac57308c9a
Parents: c89546b
Author: Sven Meier <sv...@apache.org>
Authored: Mon Jan 22 11:45:36 2018 +0100
Committer: Sven Meier <sv...@apache.org>
Committed: Mon Jan 22 11:55:57 2018 +0100

----------------------------------------------------------------------
 .../markup/head/filter/JavaScriptDeferHeaderResponse.java      | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/a8588aa1/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/JavaScriptDeferHeaderResponse.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/JavaScriptDeferHeaderResponse.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/JavaScriptDeferHeaderResponse.java
index 15dd49e..bf11290 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/JavaScriptDeferHeaderResponse.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/JavaScriptDeferHeaderResponse.java
@@ -78,8 +78,7 @@ public class JavaScriptDeferHeaderResponse extends DecoratingHeaderResponse
 			CharSequence js = getJavaScript();
 			if (Strings.isEmpty(js) == false)
 			{
-				JavaScriptUtils.writeJavaScript(response,
-					"(function(){ var f = function() {" + js + ";};\nif ('loading' !== document.readyState) f(); else document.addEventListener('DOMContentLoaded', f); })();");
+				JavaScriptUtils.writeJavaScript(response, "document.addEventListener('DOMContentLoaded', function() { " + js + "; });");
 			}
 		}
 	}
@@ -103,8 +102,7 @@ public class JavaScriptDeferHeaderResponse extends DecoratingHeaderResponse
 			CharSequence js = getJavaScript();
 			if (Strings.isEmpty(js) == false)
 			{
-				JavaScriptUtils.writeJavaScript(response,
-					"(function(){ var f = function() {" + js + ";};\nif ('complete' === document.readyState) f(); else window.addEventListener('load', f); })();");
+				JavaScriptUtils.writeJavaScript(response, "window.addEventListener('load', function() { " + js + "; });");
 			}
 		}
 	}