You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2010/08/19 22:51:50 UTC
svn commit: r987307 - in /tapestry/tapestry5/trunk/tapestry-core/src:
main/java/org/apache/tapestry5/internal/services/
main/java/org/apache/tapestry5/internal/services/ajax/
main/java/org/apache/tapestry5/services/
main/java/org/apache/tapestry5/servi...
Author: hlship
Date: Thu Aug 19 20:51:50 2010
New Revision: 987307
URL: http://svn.apache.org/viewvc?rev=987307&view=rev
Log:
TAP5-1244: Move autofocus() from RenderSupport to JavaScriptSupport
Added:
tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/
tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportAutofocusTests.groovy
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderSupportImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptSupport.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RenderSupportImplTest.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImplTest.java
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderSupportImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderSupportImpl.java?rev=987307&r1=987306&r2=987307&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderSupportImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderSupportImpl.java Thu Aug 19 20:51:50 2010
@@ -33,12 +33,12 @@ public class RenderSupportImpl implement
private final AssetSource assetSource;
- private FieldFocusPriority focusPriority;
-
- private String focusFieldId;
-
private final JavaScriptSupport javascriptSupport;
+ // As of 5.2.1, RenderSupportImpl doesn't have any internal mutable state and could be converted
+ // to a service (using the service proxy to the JSS)
+ // instead of an Environmental. But we'll just delete it in 5.3.
+
/**
* @param symbolSource
* Used to expand symbols (in {@linkplain #addClasspathScriptLink(String...)}
@@ -46,8 +46,6 @@ public class RenderSupportImpl implement
* Used to convert classpath scripts to {@link org.apache.tapestry5.Asset}s
* @param javascriptSupport
* Used to add JavaScript libraries and blocks of initialization JavaScript to the rendered page
- * @param ClientInfrastructure
- * Identifies which JavaScript libraries and stylesheets are needed in a full page render
*/
public RenderSupportImpl(SymbolSource symbolSource, AssetSource assetSource, JavaScriptSupport javascriptSupport)
{
@@ -131,13 +129,7 @@ public class RenderSupportImpl implement
public void autofocus(FieldFocusPriority priority, String fieldId)
{
- assert priority != null;
- assert InternalUtils.isNonBlank(fieldId);
- if (focusFieldId == null || priority.compareTo(focusPriority) > 0)
- {
- this.focusPriority = priority;
- focusFieldId = fieldId;
- }
+ javascriptSupport.autofocus(priority, fieldId);
}
/**
@@ -157,15 +149,6 @@ public class RenderSupportImpl implement
addScript("Tapestry.init(%s);", wrapper);
}
- /**
- * Commit any outstanding changes.
- */
- public void commit()
- {
- if (focusFieldId != null)
- javascriptSupport.addInitializerCall("activate", focusFieldId);
- }
-
public void addStylesheetLink(Asset stylesheet, String media)
{
javascriptSupport.importStylesheet(new StylesheetLink(stylesheet, new StylesheetOptions(media)));
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java?rev=987307&r1=987306&r2=987307&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java Thu Aug 19 20:51:50 2010
@@ -20,6 +20,7 @@ import java.util.Set;
import org.apache.tapestry5.Asset;
import org.apache.tapestry5.ComponentResources;
+import org.apache.tapestry5.FieldFocusPriority;
import org.apache.tapestry5.func.F;
import org.apache.tapestry5.func.Worker;
import org.apache.tapestry5.internal.InternalConstants;
@@ -61,6 +62,10 @@ public class JavaScriptSupportImpl imple
private final JavaScriptStackPathConstructor stackPathConstructor;
+ private FieldFocusPriority focusPriority;
+
+ private String focusFieldId;
+
private static final Coercion<Asset, String> toPath = new Coercion<Asset, String>()
{
public String coerce(Asset input)
@@ -92,6 +97,9 @@ public class JavaScriptSupportImpl imple
public void commit()
{
+ if (focusFieldId != null)
+ addInitializerCall("activate", focusFieldId);
+
F.flow(stylesheetLinks).each(new Worker<StylesheetLink>()
{
public void work(StylesheetLink value)
@@ -264,4 +272,16 @@ public class JavaScriptSupportImpl imple
addAssetsFromStack(stackName);
}
+ public void autofocus(FieldFocusPriority priority, String fieldId)
+ {
+ assert priority != null;
+ assert InternalUtils.isNonBlank(fieldId);
+
+ if (focusFieldId == null || priority.compareTo(focusPriority) > 0)
+ {
+ this.focusPriority = priority;
+ focusFieldId = fieldId;
+ }
+ }
+
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=987307&r1=987306&r2=987307&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java Thu Aug 19 20:51:50 2010
@@ -2008,8 +2008,6 @@ public final class TapestryModule
renderer.renderMarkup(writer);
environment.pop(RenderSupport.class);
-
- support.commit();
}
};
@@ -2170,8 +2168,6 @@ public final class TapestryModule
renderer.renderMarkup(writer, reply);
- support.commit();
-
environment.pop(RenderSupport.class);
}
};
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptSupport.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptSupport.java?rev=987307&r1=987306&r2=987307&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptSupport.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptSupport.java Thu Aug 19 20:51:50 2010
@@ -16,6 +16,7 @@ package org.apache.tapestry5.services.ja
import org.apache.tapestry5.Asset;
import org.apache.tapestry5.ComponentResources;
+import org.apache.tapestry5.FieldFocusPriority;
import org.apache.tapestry5.RenderSupport;
import org.apache.tapestry5.SymbolConstants;
import org.apache.tapestry5.annotations.Environmental;
@@ -181,4 +182,17 @@ public interface JavaScriptSupport
* Import a Javascript library with an arbitrary URL.
*/
void importJavaScriptLibrary(String libraryURL);
+
+ /**
+ * Invoked to set focus on a rendered field. Takes into account priority, meaning that a field with errors will take
+ * precedence over a merely required field, and over a field that is optional. The value
+ * {@link org.apache.tapestry5.FieldFocusPriority#OVERRIDE} can be used to force a particular field to receive
+ * focus.
+ *
+ * @param priority
+ * focus is set only if the provided priority is greater than the current priority
+ * @param fieldId
+ * id of client-side element to take focus
+ */
+ void autofocus(FieldFocusPriority priority, String fieldId);
}
Added: tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportAutofocusTests.groovy
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportAutofocusTests.groovy?rev=987307&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportAutofocusTests.groovy (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportAutofocusTests.groovy Thu Aug 19 20:51:50 2010
@@ -0,0 +1,87 @@
+// Copyright 2010 The Apache Software Foundation
+//
+// Licensed 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.tapestry5.internal.services.ajax
+
+import org.apache.tapestry5.FieldFocusPriority;
+import org.apache.tapestry5.internal.services.javascript.JavaScriptStackPathConstructor;
+import org.apache.tapestry5.internal.test.InternalBaseTestCase
+import org.apache.tapestry5.json.JSONObject;
+import org.apache.tapestry5.services.javascript.InitializationPriority;
+import org.apache.tapestry5.services.javascript.JavaScriptStack
+import org.apache.tapestry5.services.javascript.JavaScriptStackSource
+import org.apache.tapestry5.services.javascript.JavaScriptSupport;
+import org.testng.annotations.Test;
+
+/**
+ * Tests {@link JavaScriptSupport#autofocus(org.apache.tapestry5.FieldFocusPriority, String)}
+ *
+ */
+class JavaScriptSupportAutofocusTests extends InternalBaseTestCase
+{
+ private autofocus_template(expectedFieldId, cls) {
+ def linker = mockDocumentLinker()
+ def stackSource = newMock(JavaScriptStackSource.class)
+ def stackPathConstructor = newMock(JavaScriptStackPathConstructor.class)
+ def coreStack = newMock(JavaScriptStack.class)
+
+ // Adding the autofocus will drag in the core stack
+
+ expect(stackSource.getStack("core")).andReturn coreStack
+
+ expect(stackPathConstructor.constructPathsForJavaScriptStack("core")).andReturn([])
+
+ expect(coreStack.getStacks()).andReturn([])
+ expect(coreStack.getStylesheets()).andReturn([])
+ expect(coreStack.getInitialization()).andReturn(null)
+
+ JSONObject expected = new JSONObject("{\"activate\":[\"$expectedFieldId\"]}")
+
+ linker.setInitialization(InitializationPriority.NORMAL, expected)
+
+ replay()
+
+ def jss = new JavaScriptSupportImpl(linker, stackSource, stackPathConstructor)
+
+ cls jss
+
+ jss.commit()
+
+ verify()
+ }
+
+ @Test
+ void simple_autofocus() {
+
+ autofocus_template "fred", {
+ it.autofocus FieldFocusPriority.OPTIONAL, "fred"
+ }
+ }
+
+ @Test
+ void first_focus_field_at_priority_wins() {
+ autofocus_template "fred", {
+ it.autofocus FieldFocusPriority.OPTIONAL, "fred"
+ it.autofocus FieldFocusPriority.OPTIONAL, "barney"
+ }
+ }
+
+ @Test
+ void higher_priority_wins_focus() {
+ autofocus_template "barney", {
+ it.autofocus FieldFocusPriority.OPTIONAL, "fred"
+ it.autofocus FieldFocusPriority.REQUIRED, "barney"
+ }
+ }
+}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RenderSupportImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RenderSupportImplTest.java?rev=987307&r1=987306&r2=987307&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RenderSupportImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RenderSupportImplTest.java Thu Aug 19 20:51:50 2010
@@ -156,81 +156,39 @@ public class RenderSupportImplTest exten
support.addInit("foo", "fred", "barney");
- support.commit();
-
verify();
}
@Test
- public void field_focus()
- {
- JavaScriptSupport js = mockJavaScriptSupport();
-
- js.addInitializerCall("activate", "foo");
-
- replay();
-
- RenderSupportImpl support = new RenderSupportImpl(null, null, js);
-
- support.autofocus(FieldFocusPriority.OPTIONAL, "foo");
-
- support.commit();
-
- verify();
- }
-
- @Test
- public void first_focus_field_at_priority_wins()
+ public void addInit_passes_through_to_JavaScriptSupport()
{
- JavaScriptSupport js = mockJavaScriptSupport();
-
- js.addInitializerCall("activate", "foo");
-
- replay();
-
- RenderSupportImpl support = new RenderSupportImpl(null, null, js);
-
- support.autofocus(FieldFocusPriority.OPTIONAL, "foo");
- support.autofocus(FieldFocusPriority.OPTIONAL, "bar");
-
- support.commit();
-
- verify();
- }
+ JSONObject parameter = new JSONObject("clientid", "fred");
- @Test
- public void higher_priority_wins_focus()
- {
JavaScriptSupport js = mockJavaScriptSupport();
- js.addInitializerCall("activate", "bar");
+ js.addInitializerCall("setup", parameter);
replay();
RenderSupportImpl support = new RenderSupportImpl(null, null, js);
- support.autofocus(FieldFocusPriority.OPTIONAL, "foo");
- support.autofocus(FieldFocusPriority.REQUIRED, "bar");
-
- support.commit();
+ support.addInit("setup", parameter);
verify();
}
@Test
- public void addInit_passes_through_to_JavaScriptSupport()
+ public void autofocus_pass_thru_to_javascriptsupport()
{
- JSONObject parameter = new JSONObject("clientid", "fred");
-
JavaScriptSupport js = mockJavaScriptSupport();
- js.addInitializerCall("setup", parameter);
+ js.autofocus(FieldFocusPriority.OVERRIDE, "fred");
replay();
RenderSupportImpl support = new RenderSupportImpl(null, null, js);
- support.addInit("setup", parameter);
+ support.autofocus(FieldFocusPriority.OVERRIDE, "fred");
verify();
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImplTest.java?rev=987307&r1=987306&r2=987307&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImplTest.java Thu Aug 19 20:51:50 2010
@@ -20,8 +20,10 @@ import java.util.List;
import org.apache.tapestry5.Asset;
import org.apache.tapestry5.ComponentResources;
+import org.apache.tapestry5.FieldFocusPriority;
import org.apache.tapestry5.internal.InternalConstants;
import org.apache.tapestry5.internal.services.DocumentLinker;
+import org.apache.tapestry5.internal.services.RenderSupportImpl;
import org.apache.tapestry5.internal.services.javascript.JavaScriptStackPathConstructor;
import org.apache.tapestry5.internal.test.InternalBaseTestCase;
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;