You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@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;