You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2010/01/12 04:32:53 UTC

svn commit: r898169 - in /myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html: HtmlButtonRendererBase.java HtmlLinkRendererBase.java HtmlRendererUtils.java

Author: lu4242
Date: Tue Jan 12 03:32:53 2010
New Revision: 898169

URL: http://svn.apache.org/viewvc?rev=898169&view=rev
Log:
MYFACES-2477 Ajax related fixes for command components (Thanks to Michael Kurz for this patch)

Modified:
    myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlButtonRendererBase.java
    myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java
    myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java

Modified: myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlButtonRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlButtonRendererBase.java?rev=898169&r1=898168&r2=898169&view=diff
==============================================================================
--- myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlButtonRendererBase.java (original)
+++ myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlButtonRendererBase.java Tue Jan 12 03:32:53 2010
@@ -90,7 +90,9 @@
     {
         String clientId = uiComponent.getClientId(facesContext);
         Map paramMap = facesContext.getExternalContext().getRequestParameterMap();
-        return paramMap.containsKey(clientId) || paramMap.containsKey(clientId + IMAGE_BUTTON_SUFFIX_X) || paramMap.containsKey(clientId + IMAGE_BUTTON_SUFFIX_Y);
+        return paramMap.containsKey(clientId) || paramMap.containsKey(clientId + IMAGE_BUTTON_SUFFIX_X) 
+            || paramMap.containsKey(clientId + IMAGE_BUTTON_SUFFIX_Y)
+            || HtmlRendererUtils.isPartialOrBehaviorSubmit(facesContext, clientId);
     }
 
     public void encodeEnd(FacesContext facesContext, UIComponent uiComponent)

Modified: myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java?rev=898169&r1=898168&r2=898169&view=diff
==============================================================================
--- myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java (original)
+++ myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java Tue Jan 12 03:32:53 2010
@@ -32,6 +32,7 @@
 import javax.faces.component.UIOutput;
 import javax.faces.component.UIParameter;
 import javax.faces.component.behavior.ClientBehavior;
+import javax.faces.component.behavior.ClientBehaviorHint;
 import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.component.html.HtmlCommandLink;
 import javax.faces.component.html.HtmlOutputLink;
@@ -80,8 +81,8 @@
             {
                 String reqValue = (String) facesContext.getExternalContext().getRequestParameterMap().get(
                         HtmlRendererUtils.getHiddenCommandLinkFieldName(formInfo));
-                if (reqValue != null && reqValue.equals(clientId))
-                {
+                if (reqValue != null && reqValue.equals(clientId)
+                    || HtmlRendererUtils.isPartialOrBehaviorSubmit(facesContext, clientId)) {
                     component.queueEvent(new ActionEvent(component));
 
                     RendererUtils.initPartialValidationAndModelUpdate(component, facesContext);
@@ -395,10 +396,12 @@
         }
         else
         {
+            boolean hasSubmittingBehavior = hasSubmittingBehavior(behaviors, ClientBehaviorEvents.CLICK)
+                || hasSubmittingBehavior(behaviors, ClientBehaviorEvents.ACTION);
             //render a javascript that chain the related code
             onclick = HtmlRendererUtils.buildBehaviorChain(facesContext, component, behaviors,
                     ClientBehaviorEvents.CLICK, ClientBehaviorEvents.ACTION, 
-                    commandOnclick , serverEventCode,
+                    commandOnclick , hasSubmittingBehavior ? null : serverEventCode,
                     HtmlRendererUtils.mapAttachedParamsToStringValues(facesContext, component));
         }
         
@@ -407,6 +410,19 @@
         writer.writeAttribute(HTML.ONCLICK_ATTR, onclick, null);
     }
 
+    private boolean hasSubmittingBehavior(Map<String, List<ClientBehavior>> clientBehaviors, String eventName)
+    {
+        List<ClientBehavior> eventBehaviors = clientBehaviors.get(eventName);
+        if (eventBehaviors != null && !eventBehaviors.isEmpty()) {
+            for (ClientBehavior behavior : eventBehaviors) {
+                if (behavior.getHints().contains(ClientBehaviorHint.SUBMITTING)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
     protected String buildServerOnclick(FacesContext facesContext, UIComponent component, 
             String clientId, FormInfo formInfo) throws IOException
     {
@@ -869,5 +885,5 @@
             writer.writeText("", null);
             writer.endElement(HTML.ANCHOR_ELEM);
         }
-    }    
+    }
 }

Modified: myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java?rev=898169&r1=898168&r2=898169&view=diff
==============================================================================
--- myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java (original)
+++ myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java Tue Jan 12 03:32:53 2010
@@ -1778,6 +1778,25 @@
             + HIDDEN_COMMANDLINK_FIELD_NAME;
     }
 
+    public static boolean isPartialOrBehaviorSubmit(FacesContext facesContext, String clientId)
+    {
+        Map<String, String> params = facesContext.getExternalContext().getRequestParameterMap();
+
+        String sourceId = params.get("javax.faces.source");
+        if (sourceId == null || !sourceId.equals(clientId)) {
+            return false;
+        }
+        String behaviorEvent = params.get("javax.faces.behavior.event");
+        if (behaviorEvent != null) {
+            return ClientBehaviorEvents.ACTION.equals(behaviorEvent);
+        }
+        String partialEvent = params.get("javax.faces.partial.event");
+        if (partialEvent != null) {
+            return ClientBehaviorEvents.CLICK.equals(partialEvent);
+        }
+        return false;
+    }
+
     /**
      *
      * @param formInfo
@@ -2014,12 +2033,12 @@
     }
 
     /**
-     * checks if the given component has behaviors attachements
+     * Checks if the given component has a behavior attachment with a given name.
      * 
      * @since 4.0.0
      * @param eventName the event name to be checked for
-     * @param uiComponent the component which possibly has attached client behaviors
-     * @return true if client behaviors are attached, false otherwise
+     * @param behaviors map of behaviors attached to the component
+     * @return true if client behavior with given name is attached, false otherwise
      */
     public static boolean hasClientBehavior(String eventName,
             Map<String, List<ClientBehavior>> behaviors,
@@ -2216,7 +2235,7 @@
         List<String> finalParams = new ArrayList<String>(3);
         if (userEventCode != null && !userEventCode.trim().equals(STR_EMPTY))
         {
-            finalParams.add('\''+userEventCode+'\'');
+            finalParams.add('\'' + StringUtils.replace(userEventCode, '\'', "\\'") + '\'');
         }
 
         final MyfacesConfig currentInstance = MyfacesConfig
@@ -2237,7 +2256,7 @@
         if (serverEventCode != null
                 && !serverEventCode.trim().equals(STR_EMPTY))
         {
-            finalParams.add('\''+serverEventCode+'\'');
+            finalParams.add('\'' + StringUtils.replace(serverEventCode, '\'', "\\'") + '\'');
         }
         Iterator<String> it = finalParams.iterator();