You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ta...@apache.org on 2026/06/18 13:55:06 UTC
(myfaces) branch main updated: refactored propertiesMarked / eventsMarked
This is an automated email from the ASF dual-hosted git repository.
tandraschko pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/myfaces.git
The following commit(s) were added to refs/heads/main by this push:
new 1351a2f89 refactored propertiesMarked / eventsMarked
1351a2f89 is described below
commit 1351a2f896c75ec81f9e31776d08c4b993ebfa59
Author: tandraschko <ta...@apache.org>
AuthorDate: Thu Jun 18 15:54:41 2026 +0200
refactored propertiesMarked / eventsMarked
---
.../core/api/shared/CommonHtmlAttributes.java | 13 +--
.../renderkit/html/base/HtmlBodyRendererBase.java | 67 ++++-------
.../html/base/HtmlCheckboxRendererBase.java | 62 +++++-----
.../renderkit/html/base/HtmlFormRendererBase.java | 65 ++++-------
.../renderkit/html/base/HtmlGridRendererBase.java | 86 +++++---------
.../renderkit/html/base/HtmlGroupRendererBase.java | 49 ++++----
.../renderkit/html/base/HtmlImageRendererBase.java | 65 ++++-------
.../html/base/HtmlInputFileRendererBase.java | 70 +++--------
.../renderkit/html/base/HtmlLinkRendererBase.java | 120 +++++++++----------
.../html/base/HtmlMessageRendererBase.java | 22 +---
.../renderkit/html/base/HtmlRadioRendererBase.java | 33 +++---
.../myfaces/renderkit/html/base/HtmlRenderer.java | 117 +++++++++++++++++++
.../html/base/HtmlSecretRendererBase.java | 71 +++--------
.../html/base/HtmlSelectableRendererBase.java | 107 +++++++++--------
.../renderkit/html/base/HtmlTableRendererBase.java | 74 +++++-------
.../renderkit/html/base/HtmlTextRendererBase.java | 67 +++--------
.../html/base/HtmlTextareaRendererBase.java | 70 +++++------
.../renderkit/html/util/CommonHtmlEventsUtil.java | 52 +++++++--
.../renderkit/html/util/HtmlRendererUtils.java | 130 +++++++++++++++++++++
.../renderkit/html/util/SelectItemsUtils.java | 14 +--
20 files changed, 676 insertions(+), 678 deletions(-)
diff --git a/api/src/main/java/org/apache/myfaces/core/api/shared/CommonHtmlAttributes.java b/api/src/main/java/org/apache/myfaces/core/api/shared/CommonHtmlAttributes.java
index c5284dcfc..95d83738d 100644
--- a/api/src/main/java/org/apache/myfaces/core/api/shared/CommonHtmlAttributes.java
+++ b/api/src/main/java/org/apache/myfaces/core/api/shared/CommonHtmlAttributes.java
@@ -98,13 +98,12 @@ public class CommonHtmlAttributes
public static final long SIZE = 0x4000000000L;
public static final long ROLE = 0x8000000000L;
-
- //HTML5
- public static final long ONINPUT = 0x1000000000L;
- public static final long ONINVALID = 0x2000000000L;
- public static final long ONRESET = 0x4000000000L;
-
- public static final long ONCONTEXTMENU = 0x8000000000L;
+
+ public static final long ONINPUT = 0x20000000000000L;
+ public static final long ONINVALID = 0x40000000000000L;
+ public static final long ONRESET = 0x80000000000000L;
+
+ public static final long ONCONTEXTMENU = 0x100000000000000L;
public static final long ONSUBMIT = 0x10000000000L;
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlBodyRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlBodyRendererBase.java
index 6faacc36c..0aa71e7b3 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlBodyRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlBodyRendererBase.java
@@ -30,7 +30,6 @@
import jakarta.faces.component.UIComponent;
import jakarta.faces.component.UIViewRoot;
import jakarta.faces.component.behavior.ClientBehavior;
-import jakarta.faces.component.behavior.ClientBehaviorHolder;
import jakarta.faces.context.FacesContext;
import jakarta.faces.context.ResponseWriter;
@@ -61,9 +60,11 @@ public void encodeBegin(FacesContext facesContext, UIComponent component) throws
super.encodeBegin(facesContext, component); //check for NP
ResponseWriter writer = facesContext.getResponseWriter();
- if (component instanceof ClientBehaviorHolder holder)
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, component);
+ Map<String, List<ClientBehavior>> behaviors = getClientBehaviors(component);
+
+ if (behaviors != null)
{
- Map<String, List<ClientBehavior>> behaviors = holder.getClientBehaviors();
if (!behaviors.isEmpty())
{
ResourceUtils.renderDefaultJsfJsInlineIfNecessary(facesContext, writer);
@@ -72,71 +73,51 @@ public void encodeBegin(FacesContext facesContext, UIComponent component) throws
writer.startElement(HTML.BODY_ELEM, component);
if (!behaviors.isEmpty())
{
- // Note "name" does not exists as attribute in <body> tag.
- writer.writeAttribute(HTML.ID_ATTR, component.getClientId(facesContext),null);
- }
- else
- {
- if (HtmlRendererUtils.isOutputHtml5Doctype(facesContext))
- {
- HtmlRendererUtils.writeIdIfNecessary(writer, component, facesContext);
- }
+ // Note "name" does not exist as an attribute in the <body> tag.
+ writer.writeAttribute(HTML.ID_ATTR, component.getClientId(facesContext), null);
}
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
+ else if (HtmlRendererUtils.isOutputHtml5Doctype(facesContext))
{
- CommonHtmlAttributesUtil.renderEventProperties(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(component), component);
- }
- else
- {
- if (isCommonEventsOptimizationEnabled(facesContext))
- {
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(component),
- CommonHtmlEventsUtil.getMarkedEvents(component), component, behaviors);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, component, behaviors);
- }
+ HtmlRendererUtils.writeIdIfNecessary(writer, component, facesContext);
}
+
+ renderEventHandlers(facesContext, writer, component, behaviors, commonPropertiesMarked);
+
HtmlRendererUtils.renderBehaviorizedAttribute(facesContext, writer, HTML.ONLOAD_ATTR, component,
ClientBehaviorEvents.LOAD, behaviors, HTML.ONLOAD_ATTR);
HtmlRendererUtils.renderBehaviorizedAttribute(facesContext, writer, HTML.ONUNLOAD_ATTR, component,
ClientBehaviorEvents.UNLOAD, behaviors, HTML.ONUNLOAD_ATTR);
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+
+ if (commonPropertiesMarked != null)
{
- HtmlRendererUtils.renderHTMLAttributes(writer, component,
- HTML.BODY_ATTRIBUTES_WITHOUT_EVENTS);
- CommonHtmlAttributesUtil.renderCommonPassthroughPropertiesWithoutEvents(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(component), component);
+ HtmlRendererUtils.renderHTMLAttributes(writer, component, HTML.BODY_ATTRIBUTES_WITHOUT_EVENTS);
+ CommonHtmlAttributesUtil.renderCommonPassthroughPropertiesWithoutEvents(
+ writer, commonPropertiesMarked, component);
}
else
{
HtmlRendererUtils.renderHTMLAttributes(writer, component,
HTML.BODY_PASSTHROUGH_ATTRIBUTES_WITHOUT_EVENTS);
}
- HtmlRendererUtils.renderHTMLStringAttribute(writer, component, HTML.XMLNS_ATTR , HTML.XMLNS_ATTR);
-
}
else
{
writer.startElement(HTML.BODY_ELEM, component);
HtmlRendererUtils.writeIdIfNecessary(writer, component, facesContext);
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+
+ if (commonPropertiesMarked != null)
{
- HtmlRendererUtils.renderHTMLAttributes(writer, component,
- HTML.BODY_ATTRIBUTES);
- CommonHtmlAttributesUtil.renderCommonPassthroughProperties(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(component), component);
+ HtmlRendererUtils.renderHTMLAttributes(writer, component, HTML.BODY_ATTRIBUTES);
+ CommonHtmlAttributesUtil.renderCommonPassthroughProperties(
+ writer, commonPropertiesMarked, component);
}
else
{
- HtmlRendererUtils.renderHTMLAttributes(writer, component,
- HTML.BODY_PASSTHROUGH_ATTRIBUTES);
+ HtmlRendererUtils.renderHTMLAttributes(writer, component, HTML.BODY_PASSTHROUGH_ATTRIBUTES);
}
- HtmlRendererUtils.renderHTMLStringAttribute(writer, component, HTML.XMLNS_ATTR , HTML.XMLNS_ATTR);
}
+
+ HtmlRendererUtils.renderHTMLStringAttribute(writer, component, HTML.XMLNS_ATTR, HTML.XMLNS_ATTR);
}
@Override
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlCheckboxRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlCheckboxRendererBase.java
index d35bcc512..f60a95528 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlCheckboxRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlCheckboxRendererBase.java
@@ -398,39 +398,34 @@ else if (renderId)
if (uiComponent instanceof ClientBehaviorHolder holder)
{
behaviors = holder.getClientBehaviors();
-
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, uiComponent);
+
+ if (behaviors.isEmpty() && commonPropertiesMarked != null)
{
- long commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent);
- CommonHtmlAttributesUtil.renderChangeEventProperty(writer,
- commonPropertiesMarked, uiComponent);
- CommonHtmlAttributesUtil.renderEventProperties(writer,
- commonPropertiesMarked, uiComponent);
- CommonHtmlAttributesUtil.renderFieldEventPropertiesWithoutOnchange(writer,
- commonPropertiesMarked, uiComponent);
+ CommonHtmlAttributesUtil.renderChangeEventProperty(writer, commonPropertiesMarked, uiComponent);
+ CommonHtmlAttributesUtil.renderEventProperties(writer, commonPropertiesMarked, uiComponent);
+ CommonHtmlAttributesUtil.renderFieldEventPropertiesWithoutOnchange(
+ writer, commonPropertiesMarked, uiComponent);
}
else
{
- long commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent);
HtmlRendererUtils.renderBehaviorizedOnchangeEventHandler(
- facesContext, writer, uiComponent, itemId != null ? itemId : clientId, behaviors);
- if (isCommonEventsOptimizationEnabled(facesContext))
+ facesContext, writer, uiComponent, itemId != null ? itemId : clientId, behaviors);
+ Long commonEventsMarked = getCommonEventsMarked(facesContext, uiComponent);
+ if (commonEventsMarked != null)
{
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(uiComponent);
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
+ CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
commonPropertiesMarked, commonEventsMarked, uiComponent,
itemId != null ? itemId : clientId, behaviors);
CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchange(
- facesContext, writer, commonPropertiesMarked, commonEventsMarked, uiComponent,
+ facesContext, writer, commonPropertiesMarked, commonEventsMarked, uiComponent,
itemId != null ? itemId : clientId, behaviors);
}
else
{
- HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext,
- writer, uiComponent, behaviors);
+ HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, uiComponent, behaviors);
HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchange(
- facesContext, writer, uiComponent,
- itemId != null ? itemId : clientId, behaviors);
+ facesContext, writer, uiComponent, itemId != null ? itemId : clientId, behaviors);
}
}
HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
@@ -447,31 +442,28 @@ else if (renderId)
if (uiComponent instanceof ClientBehaviorHolder holder)
{
behaviors = holder.getClientBehaviors();
-
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, uiComponent);
+
+ if (behaviors.isEmpty() && commonPropertiesMarked != null)
{
- long commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent);
- CommonHtmlAttributesUtil.renderChangeEventProperty(writer,
- commonPropertiesMarked, uiComponent);
- CommonHtmlAttributesUtil.renderEventProperties(writer,
- commonPropertiesMarked, uiComponent);
- CommonHtmlAttributesUtil.renderFieldEventPropertiesWithoutOnchange(writer,
- commonPropertiesMarked, uiComponent);
+ CommonHtmlAttributesUtil.renderChangeEventProperty(writer, commonPropertiesMarked, uiComponent);
+ CommonHtmlAttributesUtil.renderEventProperties(writer, commonPropertiesMarked, uiComponent);
+ CommonHtmlAttributesUtil.renderFieldEventPropertiesWithoutOnchange(
+ writer, commonPropertiesMarked, uiComponent);
}
else
{
- long commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent);
HtmlRendererUtils.renderBehaviorizedOnchangeEventHandler(
facesContext, writer, uiComponent, itemId != null ? itemId : clientId, behaviors);
- if (isCommonEventsOptimizationEnabled(facesContext))
+ Long commonEventsMarked = getCommonEventsMarked(facesContext, uiComponent);
+ if (commonEventsMarked != null)
{
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(uiComponent);
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
- commonPropertiesMarked, commonEventsMarked, uiComponent,
+ CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
+ commonPropertiesMarked, commonEventsMarked, uiComponent,
itemId != null ? itemId : clientId, behaviors);
CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchange(
- facesContext, writer, commonPropertiesMarked, commonEventsMarked,
- uiComponent, itemId != null ? itemId : clientId, behaviors);
+ facesContext, writer, commonPropertiesMarked, commonEventsMarked,
+ uiComponent, itemId != null ? itemId : clientId, behaviors);
}
else
{
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlFormRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlFormRendererBase.java
index 39f096850..c5c70ab32 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlFormRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlFormRendererBase.java
@@ -22,7 +22,6 @@
import org.apache.myfaces.renderkit.html.util.HtmlRendererUtils;
import org.apache.myfaces.renderkit.html.util.ClientBehaviorRendererUtils;
import org.apache.myfaces.renderkit.html.util.CommonHtmlAttributesUtil;
-import org.apache.myfaces.renderkit.html.util.CommonHtmlEventsUtil;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@@ -32,7 +31,6 @@
import jakarta.faces.component.UIComponent;
import jakarta.faces.component.UIForm;
import jakarta.faces.component.behavior.ClientBehavior;
-import jakarta.faces.component.behavior.ClientBehaviorHolder;
import jakarta.faces.context.FacesContext;
import jakarta.faces.context.ResponseWriter;
@@ -81,14 +79,10 @@ public void encodeBegin(FacesContext facesContext, UIComponent component) throws
String actionURL = getActionUrl(facesContext, htmlForm);
String method = getMethod(facesContext, htmlForm);
- Map<String, List<ClientBehavior>> behaviors = null;
- if (component instanceof ClientBehaviorHolder holder)
+ Map<String, List<ClientBehavior>> behaviors = getClientBehaviors(component);
+ if (behaviors != null && !behaviors.isEmpty())
{
- behaviors = holder.getClientBehaviors();
- if (!behaviors.isEmpty())
- {
- ResourceUtils.renderDefaultJsfJsInlineIfNecessary(facesContext, writer);
- }
+ ResourceUtils.renderDefaultJsfJsInlineIfNecessary(facesContext, writer);
}
writer.startElement(HTML.FORM_ELEM, htmlForm);
@@ -103,50 +97,33 @@ public void encodeBegin(FacesContext facesContext, UIComponent component) throws
String encodedActionURL = facesContext.getExternalContext().encodeActionURL(actionURL);
writer.writeURIAttribute(HTML.ACTION_ATTR, encodedActionURL, null);
- if (htmlForm instanceof ClientBehaviorHolder holder)
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, htmlForm);
+
+ if (behaviors != null)
{
- long marked = CommonHtmlAttributesUtil.getMarkedAttributes(htmlForm);
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
- {
- CommonHtmlAttributesUtil.renderEventProperties(writer, marked, htmlForm);
- }
- else
- {
- if (isCommonEventsOptimizationEnabled(facesContext))
- {
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
- marked,
- CommonHtmlEventsUtil.getMarkedEvents(htmlForm), htmlForm, behaviors);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, htmlForm, behaviors);
- }
- }
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ renderEventHandlers(facesContext, writer, htmlForm, behaviors, commonPropertiesMarked);
+ }
+
+ if (commonPropertiesMarked != null)
+ {
+ if (behaviors != null)
{
- CommonHtmlAttributesUtil.renderCommonPassthroughPropertiesWithoutEvents(writer,
- marked, component);
- HtmlRendererUtils.renderHTMLAttributes(writer, htmlForm, HTML.FORM_ATTRIBUTES);
+ CommonHtmlAttributesUtil.renderCommonPassthroughPropertiesWithoutEvents(
+ writer, commonPropertiesMarked, component);
}
else
{
- HtmlRendererUtils.renderHTMLAttributes(writer, htmlForm,
- HTML.FORM_PASSTHROUGH_ATTRIBUTES_WITHOUT_EVENTS);
+ CommonHtmlAttributesUtil.renderCommonPassthroughProperties(
+ writer, commonPropertiesMarked, component);
}
+ HtmlRendererUtils.renderHTMLAttributes(writer, htmlForm, HTML.FORM_ATTRIBUTES);
}
else
{
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- CommonHtmlAttributesUtil.renderCommonPassthroughProperties(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(component), component);
- HtmlRendererUtils.renderHTMLAttributes(writer, htmlForm, HTML.FORM_ATTRIBUTES);
- }
- else
- {
- HtmlRendererUtils.renderHTMLAttributes(writer, htmlForm, HTML.FORM_PASSTHROUGH_ATTRIBUTES);
- }
+ HtmlRendererUtils.renderHTMLAttributes(writer, htmlForm,
+ behaviors != null
+ ? HTML.FORM_PASSTHROUGH_ATTRIBUTES_WITHOUT_EVENTS
+ : HTML.FORM_PASSTHROUGH_ATTRIBUTES);
}
writer.write(""); // force start element tag to be closed
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlGridRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlGridRendererBase.java
index 9652dfdeb..fadee2a5a 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlGridRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlGridRendererBase.java
@@ -21,7 +21,6 @@
import org.apache.myfaces.renderkit.html.util.HtmlRendererUtils;
import org.apache.myfaces.renderkit.html.util.ClientBehaviorRendererUtils;
import org.apache.myfaces.renderkit.html.util.CommonHtmlAttributesUtil;
-import org.apache.myfaces.renderkit.html.util.CommonHtmlEventsUtil;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@@ -32,7 +31,6 @@
import jakarta.faces.component.UIComponent;
import jakarta.faces.component.UIPanel;
import jakarta.faces.component.behavior.ClientBehavior;
-import jakarta.faces.component.behavior.ClientBehaviorHolder;
import jakarta.faces.component.html.HtmlPanelGrid;
import jakarta.faces.context.FacesContext;
import jakarta.faces.context.ResponseWriter;
@@ -106,78 +104,52 @@ public void encodeEnd(FacesContext facesContext, UIComponent component) throws I
}
ResponseWriter writer = facesContext.getResponseWriter();
- Map<String, List<ClientBehavior>> behaviors = null;
- if (component instanceof ClientBehaviorHolder holder)
- {
- behaviors = holder.getClientBehaviors();
- }
+ Map<String, List<ClientBehavior>> behaviors = getClientBehaviors(component);
if (behaviors != null && !behaviors.isEmpty())
{
ResourceUtils.renderDefaultJsfJsInlineIfNecessary(facesContext, writer);
}
-
+
writer.startElement(HTML.TABLE_ELEM, component);
-
- if (component instanceof ClientBehaviorHolder)
+
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, component);
+
+ if (behaviors != null && !behaviors.isEmpty())
{
- if (!behaviors.isEmpty())
- {
- HtmlRendererUtils.writeIdAndName(writer, component, facesContext);
- }
- else
- {
- HtmlRendererUtils.writeIdIfNecessary(writer, component, facesContext);
- }
- long commonPropertiesMarked = 0L;
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(component);
- }
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
- {
- CommonHtmlAttributesUtil.renderEventProperties(writer,
- commonPropertiesMarked, component);
- }
- else
- {
- if (isCommonEventsOptimizationEnabled(facesContext))
- {
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
- commonPropertiesMarked,
- CommonHtmlEventsUtil.getMarkedEvents(component), component, behaviors);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, component, behaviors);
- }
- }
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- HtmlRendererUtils.renderHTMLAttributes(writer, component, HTML.TABLE_ATTRIBUTES);
- CommonHtmlAttributesUtil.renderCommonPassthroughPropertiesWithoutEvents(writer,
- commonPropertiesMarked, component);
- }
- else
- {
- HtmlRendererUtils.renderHTMLAttributes(writer, component,
- HTML.TABLE_PASSTHROUGH_ATTRIBUTES_WITHOUT_EVENTS);
- }
+ HtmlRendererUtils.writeIdAndName(writer, component, facesContext);
}
else
{
HtmlRendererUtils.writeIdIfNecessary(writer, component, facesContext);
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ }
+
+ if (behaviors != null)
+ {
+ renderEventHandlers(facesContext, writer, component, behaviors, commonPropertiesMarked);
+ }
+
+ if (commonPropertiesMarked != null)
+ {
+ HtmlRendererUtils.renderHTMLAttributes(writer, component, HTML.TABLE_ATTRIBUTES);
+ if (behaviors != null)
{
- HtmlRendererUtils.renderHTMLAttributes(writer, component, HTML.TABLE_ATTRIBUTES);
- CommonHtmlAttributesUtil.renderCommonPassthroughProperties(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(component), component);
+ CommonHtmlAttributesUtil.renderCommonPassthroughPropertiesWithoutEvents(
+ writer, commonPropertiesMarked, component);
}
else
{
- HtmlRendererUtils.renderHTMLAttributes(writer, component, HTML.TABLE_PASSTHROUGH_ATTRIBUTES);
+ CommonHtmlAttributesUtil.renderCommonPassthroughProperties(
+ writer, commonPropertiesMarked, component);
}
}
+ else
+ {
+ HtmlRendererUtils.renderHTMLAttributes(writer, component,
+ behaviors != null
+ ? HTML.TABLE_PASSTHROUGH_ATTRIBUTES_WITHOUT_EVENTS
+ : HTML.TABLE_PASSTHROUGH_ATTRIBUTES);
+ }
writer.flush();
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlGroupRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlGroupRendererBase.java
index 41046570b..46e35d5a1 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlGroupRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlGroupRendererBase.java
@@ -96,9 +96,10 @@ private boolean needsWrapper(FacesContext context, UIComponent component)
{
return true;
}
- if (isCommonPropertiesOptimizationEnabled(context))
+ Long commonPropertiesMarked = getCommonPropertiesMarked(context, component);
+ if (commonPropertiesMarked != null)
{
- return CommonHtmlAttributesUtil.getMarkedAttributes(component) > 0;
+ return commonPropertiesMarked > 0;
}
return hasAnyPassthroughAttribute(component, HTML.COMMON_PASSTROUGH_ATTRIBUTES);
}
@@ -134,35 +135,34 @@ private void writeWrapperStart(FacesContext context, UIComponent component) thro
ResourceUtils.renderDefaultJsfJsInlineIfNecessary(context, writer);
}
+ Long commonPropertiesMarked = getCommonPropertiesMarked(context, component);
+
if (hasClientBehaviors(behaviors) || shouldRenderId(context, component))
{
writer.startElement(layoutElement, component);
-
writer.writeAttribute(HTML.ID_ATTR, component.getClientId(context), null);
- long commonPropertiesMarked = 0L;
- if (isCommonPropertiesOptimizationEnabled(context))
+ if (commonPropertiesMarked != null)
{
- commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(component);
- CommonHtmlAttributesUtil.renderCommonPassthroughPropertiesWithoutEvents(writer,
- commonPropertiesMarked, component);
+ CommonHtmlAttributesUtil.renderCommonPassthroughPropertiesWithoutEvents(
+ writer, commonPropertiesMarked, component);
}
else
{
HtmlRendererUtils.renderHTMLAttributes(writer, component, HTML.UNIVERSAL_ATTRIBUTES);
}
- if (!hasClientBehaviors(behaviors) && isCommonPropertiesOptimizationEnabled(context))
+
+ if (!hasClientBehaviors(behaviors) && commonPropertiesMarked != null)
{
- CommonHtmlAttributesUtil.renderEventProperties(writer,
- commonPropertiesMarked, component);
+ CommonHtmlAttributesUtil.renderEventProperties(writer, commonPropertiesMarked, component);
}
else
{
- if (isCommonEventsOptimizationEnabled(context))
+ Long commonEventsMarked = getCommonEventsMarked(context, component);
+ if (commonEventsMarked != null)
{
CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(context, writer,
- commonPropertiesMarked,
- CommonHtmlEventsUtil.getMarkedEvents(component), component, behaviors);
+ commonPropertiesMarked, commonEventsMarked, component, behaviors);
}
else
{
@@ -172,24 +172,17 @@ private void writeWrapperStart(FacesContext context, UIComponent component) thro
}
else
{
- if (isCommonPropertiesOptimizationEnabled(context))
+ if (commonPropertiesMarked != null && commonPropertiesMarked > 0)
{
- long commonAttributesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(component);
- if (commonAttributesMarked > 0)
- {
- writer.startElement(layoutElement, component);
- HtmlRendererUtils.writeIdIfNecessary(writer, component, context);
-
- CommonHtmlAttributesUtil.renderCommonPassthroughProperties(writer,
- commonAttributesMarked, component);
- }
+ writer.startElement(layoutElement, component);
+ HtmlRendererUtils.writeIdIfNecessary(writer, component, context);
+ CommonHtmlAttributesUtil.renderCommonPassthroughProperties(
+ writer, commonPropertiesMarked, component);
}
- else
+ else if (commonPropertiesMarked == null)
{
HtmlRendererUtils.renderHTMLAttributesWithOptionalStartElement(writer,
- component,
- layoutElement,
- HTML.COMMON_PASSTROUGH_ATTRIBUTES);
+ component, layoutElement, HTML.COMMON_PASSTROUGH_ATTRIBUTES);
}
}
}
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlImageRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlImageRendererBase.java
index 151335b97..c3205402b 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlImageRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlImageRendererBase.java
@@ -21,7 +21,6 @@
import org.apache.myfaces.renderkit.html.util.HtmlRendererUtils;
import org.apache.myfaces.renderkit.html.util.ClientBehaviorRendererUtils;
import org.apache.myfaces.renderkit.html.util.CommonHtmlAttributesUtil;
-import org.apache.myfaces.renderkit.html.util.CommonHtmlEventsUtil;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@@ -61,14 +60,10 @@ public void encodeEnd(FacesContext facesContext, UIComponent uiComponent) throws
ResponseWriter writer = facesContext.getResponseWriter();
- Map<String, List<ClientBehavior>> behaviors = null;
- if (uiComponent instanceof ClientBehaviorHolder holder)
+ Map<String, List<ClientBehavior>> behaviors = getClientBehaviors(uiComponent);
+ if (behaviors != null && !behaviors.isEmpty())
{
- behaviors = holder.getClientBehaviors();
- if (!behaviors.isEmpty())
- {
- ResourceUtils.renderDefaultJsfJsInlineIfNecessary(facesContext, writer);
- }
+ ResourceUtils.renderDefaultJsfJsInlineIfNecessary(facesContext, writer);
}
writer.startElement(HTML.IMG_ELEM, uiComponent);
@@ -116,51 +111,33 @@ public void encodeEnd(FacesContext facesContext, UIComponent uiComponent) throws
}
}
- if (uiComponent instanceof ClientBehaviorHolder)
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, uiComponent);
+
+ if (behaviors != null)
{
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
- {
- CommonHtmlAttributesUtil.renderEventProperties(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent), uiComponent);
- }
- else
- {
- if (isCommonEventsOptimizationEnabled(facesContext))
- {
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent),
- CommonHtmlEventsUtil.getMarkedEvents(uiComponent), uiComponent, behaviors);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, uiComponent, behaviors);
- }
- }
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ renderEventHandlers(facesContext, writer, uiComponent, behaviors, commonPropertiesMarked);
+ }
+
+ if (commonPropertiesMarked != null)
+ {
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.IMG_ATTRIBUTES);
+ if (behaviors != null)
{
- HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.IMG_ATTRIBUTES);
- CommonHtmlAttributesUtil.renderCommonPassthroughPropertiesWithoutEvents(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent), uiComponent);
+ CommonHtmlAttributesUtil.renderCommonPassthroughPropertiesWithoutEvents(
+ writer, commonPropertiesMarked, uiComponent);
}
else
{
- HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
- HTML.IMG_PASSTHROUGH_ATTRIBUTES_WITHOUT_EVENTS);
+ CommonHtmlAttributesUtil.renderCommonPassthroughProperties(
+ writer, commonPropertiesMarked, uiComponent);
}
}
else
{
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.IMG_ATTRIBUTES);
- CommonHtmlAttributesUtil.renderCommonPassthroughProperties(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent), uiComponent);
- }
- else
- {
- HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
- HTML.IMG_PASSTHROUGH_ATTRIBUTES);
- }
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
+ behaviors != null
+ ? HTML.IMG_PASSTHROUGH_ATTRIBUTES_WITHOUT_EVENTS
+ : HTML.IMG_PASSTHROUGH_ATTRIBUTES);
}
writer.endElement(HTML.IMG_ELEM);
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlInputFileRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlInputFileRendererBase.java
index 55139c6c3..7acc6de20 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlInputFileRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlInputFileRendererBase.java
@@ -21,7 +21,6 @@
import org.apache.myfaces.renderkit.html.util.HtmlRendererUtils;
import org.apache.myfaces.renderkit.html.util.ClientBehaviorRendererUtils;
import org.apache.myfaces.renderkit.html.util.CommonHtmlAttributesUtil;
-import org.apache.myfaces.renderkit.html.util.CommonHtmlEventsUtil;
import jakarta.faces.component.UIComponent;
import jakarta.faces.component.UIInput;
import jakarta.faces.context.FacesContext;
@@ -168,66 +167,33 @@ protected void renderInputBegin(FacesContext facesContext, UIComponent component
writer.writeAttribute(HTML.NAME_ATTR, clientId, null);
writer.writeAttribute(HTML.TYPE_ATTR, HTML.INPUT_TYPE_FILE, null);
- Map<String, List<ClientBehavior>> behaviors = null;
- if (component instanceof ClientBehaviorHolder holder)
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, component);
+ Map<String, List<ClientBehavior>> behaviors = getClientBehaviors(component);
+
+ if (behaviors != null)
{
- behaviors = holder.getClientBehaviors();
-
- long commonPropertiesMarked = 0L;
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(component);
- }
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
- {
- CommonHtmlAttributesUtil.renderChangeEventProperty(writer,
- commonPropertiesMarked, component);
- CommonHtmlAttributesUtil.renderEventProperties(writer,
- commonPropertiesMarked, component);
- CommonHtmlAttributesUtil.renderFieldEventPropertiesWithoutOnchange(writer,
- commonPropertiesMarked, component);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedOnchangeEventHandler(facesContext, writer, component, behaviors);
- if (isCommonEventsOptimizationEnabled(facesContext))
- {
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(component);
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
- commonPropertiesMarked, commonEventsMarked, component, behaviors);
- CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchange(
- facesContext, writer, commonPropertiesMarked, commonEventsMarked, component, behaviors);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, component, behaviors);
- HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchange(
- facesContext, writer, component, behaviors);
- }
- }
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ renderFieldEventHandlers(facesContext, writer, component, behaviors, commonPropertiesMarked);
+ }
+
+ if (commonPropertiesMarked != null)
+ {
+ if (behaviors != null)
{
- CommonHtmlAttributesUtil.renderInputPassthroughPropertiesWithoutDisabledAndEvents(writer,
- commonPropertiesMarked, component);
+ CommonHtmlAttributesUtil.renderInputPassthroughPropertiesWithoutDisabledAndEvents(
+ writer, commonPropertiesMarked, component);
}
else
{
- HtmlRendererUtils.renderHTMLAttributes(writer, component,
- HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_EVENTS);
+ CommonHtmlAttributesUtil.renderInputPassthroughPropertiesWithoutDisabled(
+ writer, commonPropertiesMarked, component);
}
}
else
{
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- CommonHtmlAttributesUtil.renderInputPassthroughPropertiesWithoutDisabled(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(component), component);
- }
- else
- {
- HtmlRendererUtils.renderHTMLAttributes(writer, component,
- HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED);
- }
+ HtmlRendererUtils.renderHTMLAttributes(writer, component,
+ behaviors != null
+ ? HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_EVENTS
+ : HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED);
}
HtmlInputFile inputFile = (HtmlInputFile) component;
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlLinkRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlLinkRendererBase.java
index 60f0f1721..8a7ed7a58 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlLinkRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlLinkRendererBase.java
@@ -238,11 +238,8 @@ protected void renderCommandLinkStart(FacesContext facesContext, UIComponent com
boolean disabled = HtmlRendererUtils.isDisabled(component);
- // Hoist optimization flags — always true in production; avoid repeated virtual dispatch.
- boolean commonPropertiesOptimization = isCommonPropertiesOptimizationEnabled(facesContext);
- boolean commonEventsOptimization = isCommonEventsOptimizationEnabled(facesContext);
- long commonPropertiesMarked = commonPropertiesOptimization
- ? CommonHtmlAttributesUtil.getMarkedAttributes(component) : 0L;
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, component);
+ Long commonEventsMarked = getCommonEventsMarked(facesContext, component);
if (disabled || form == null)
{
@@ -262,7 +259,7 @@ protected void renderCommandLinkStart(FacesContext facesContext, UIComponent com
// only render onclick if != disabled
if (!disabled)
{
- if (behaviors.isEmpty() && commonPropertiesOptimization)
+ if (behaviors.isEmpty() && commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderEventProperties(writer,
commonPropertiesMarked, component);
@@ -271,9 +268,8 @@ protected void renderCommandLinkStart(FacesContext facesContext, UIComponent com
}
else
{
- if (commonEventsOptimization)
+ if (commonEventsMarked != null)
{
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(component);
CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
commonPropertiesMarked, commonEventsMarked, component, behaviors);
CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
@@ -290,7 +286,7 @@ protected void renderCommandLinkStart(FacesContext facesContext, UIComponent com
}
else
{
- if (behaviors.isEmpty() && commonPropertiesOptimization)
+ if (behaviors.isEmpty() && commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderEventPropertiesWithoutOnclick(writer,
commonPropertiesMarked, component);
@@ -299,9 +295,8 @@ protected void renderCommandLinkStart(FacesContext facesContext, UIComponent com
}
else
{
- if (commonEventsOptimization)
+ if (commonEventsMarked != null)
{
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(component);
CommonHtmlEventsUtil.renderBehaviorizedEventHandlersWithoutOnclick(facesContext, writer,
commonPropertiesMarked, commonEventsMarked, component, behaviors);
CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
@@ -316,7 +311,7 @@ protected void renderCommandLinkStart(FacesContext facesContext, UIComponent com
}
}
}
- if (commonPropertiesOptimization)
+ if (commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderAnchorPassthroughPropertiesDisabledWithoutEvents(writer,
commonPropertiesMarked, component);
@@ -330,7 +325,7 @@ protected void renderCommandLinkStart(FacesContext facesContext, UIComponent com
else
{
HtmlRendererUtils.writeIdIfNecessary(writer, component, facesContext);
- if (commonPropertiesOptimization)
+ if (commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderAnchorPassthroughPropertiesDisabled(writer,
commonPropertiesMarked, component);
@@ -378,7 +373,7 @@ protected void renderCommandLinkStart(FacesContext facesContext, UIComponent com
HtmlRendererUtils.writeIdIfNecessary(writer, component, facesContext);
}
}
- if (behaviors.isEmpty() && commonPropertiesOptimization)
+ if (behaviors.isEmpty() && commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderEventPropertiesWithoutOnclick(writer,
commonPropertiesMarked, component);
@@ -387,12 +382,22 @@ protected void renderCommandLinkStart(FacesContext facesContext, UIComponent com
}
else
{
- HtmlRendererUtils.renderBehaviorizedEventHandlersWithoutOnclick(
- facesContext, writer, component, behaviors);
- HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
- facesContext, writer, component, behaviors);
+ if (commonEventsMarked != null)
+ {
+ CommonHtmlEventsUtil.renderBehaviorizedEventHandlersWithoutOnclick(facesContext, writer,
+ commonPropertiesMarked, commonEventsMarked, component, behaviors);
+ CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
+ facesContext, writer, commonPropertiesMarked, commonEventsMarked, component, behaviors);
+ }
+ else
+ {
+ HtmlRendererUtils.renderBehaviorizedEventHandlersWithoutOnclick(
+ facesContext, writer, component, behaviors);
+ HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
+ facesContext, writer, component, behaviors);
+ }
}
- if (commonPropertiesOptimization)
+ if (commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderAnchorPassthroughPropertiesWithoutStyleAndEvents(writer,
commonPropertiesMarked, component);
@@ -407,7 +412,7 @@ protected void renderCommandLinkStart(FacesContext facesContext, UIComponent com
{
renderJavaScriptAnchorStart(facesContext, writer, component, clientId, form);
HtmlRendererUtils.writeIdIfNecessary(writer, component, facesContext);
- if (commonPropertiesOptimization)
+ if (commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderAnchorPassthroughPropertiesWithoutOnclickAndStyle(writer,
commonPropertiesMarked, component);
@@ -727,6 +732,7 @@ protected void renderOutputLinkStart(FacesContext facesContext, UIOutput output)
if (HtmlRendererUtils.isDisabled(output))
{
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, output);
writer.startElement(HTML.SPAN_ELEM, output);
if (output instanceof ClientBehaviorHolder holder)
{
@@ -739,13 +745,9 @@ protected void renderOutputLinkStart(FacesContext facesContext, UIOutput output)
{
HtmlRendererUtils.writeIdIfNecessary(writer, output, facesContext);
}
- long commonPropertiesMarked = 0L;
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(output);
- }
+ Long commonEventsMarked = getCommonEventsMarked(facesContext, output);
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
+ if (behaviors.isEmpty() && commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderEventProperties(writer,
commonPropertiesMarked, output);
@@ -754,9 +756,8 @@ protected void renderOutputLinkStart(FacesContext facesContext, UIOutput output)
}
else
{
- if (isCommonEventsOptimizationEnabled(facesContext))
+ if (commonEventsMarked != null)
{
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(output);
CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
commonPropertiesMarked, commonEventsMarked, output, behaviors);
CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
@@ -769,7 +770,7 @@ protected void renderOutputLinkStart(FacesContext facesContext, UIOutput output)
facesContext, writer, output, behaviors);
}
}
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ if (commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderAnchorPassthroughPropertiesDisabledWithoutEvents(writer,
commonPropertiesMarked, output);
@@ -783,10 +784,10 @@ protected void renderOutputLinkStart(FacesContext facesContext, UIOutput output)
else
{
HtmlRendererUtils.writeIdIfNecessary(writer, output, facesContext);
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ if (commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderAnchorPassthroughPropertiesDisabled(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(output), output);
+ commonPropertiesMarked, output);
}
else
{
@@ -837,6 +838,7 @@ else if (isAnchorInHref)
}
href = facesContext.getExternalContext().encodeResourceURL(href); //TODO: or encodeActionURL ?
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, output);
//write anchor
writer.startElement(HTML.ANCHOR_ELEM, output);
writer.writeURIAttribute(HTML.HREF_ATTR, href, null);
@@ -851,12 +853,9 @@ else if (isAnchorInHref)
{
HtmlRendererUtils.writeIdAndNameIfNecessary(writer, output, facesContext);
}
- long commonPropertiesMarked = 0L;
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(output);
- }
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
+ Long commonEventsMarked = getCommonEventsMarked(facesContext, output);
+
+ if (behaviors.isEmpty() && commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderEventProperties(writer,
commonPropertiesMarked, output);
@@ -865,9 +864,8 @@ else if (isAnchorInHref)
}
else
{
- if (isCommonEventsOptimizationEnabled(facesContext))
+ if (commonEventsMarked != null)
{
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(output);
CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
commonPropertiesMarked, commonEventsMarked, output, behaviors);
CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
@@ -880,7 +878,7 @@ else if (isAnchorInHref)
facesContext, writer, output, behaviors);
}
}
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ if (commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderAnchorPassthroughPropertiesWithoutEvents(writer,
commonPropertiesMarked, output);
@@ -894,10 +892,10 @@ else if (isAnchorInHref)
else
{
HtmlRendererUtils.writeIdAndNameIfNecessary(writer, output, facesContext);
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ if (commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderAnchorPassthroughProperties(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(output), output);
+ commonPropertiesMarked, output);
}
else
{
@@ -922,6 +920,7 @@ protected void renderOutcomeLinkStart(FacesContext facesContext, UIOutcomeTarget
//output.getAttributes().put(END_LINK_OUTCOME_AS_SPAN, Boolean.TRUE);
//Note one h:link cannot have a nested h:link as a child, so it is safe
//to just put this flag on FacesContext attribute map
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, output);
facesContext.getAttributes().put(END_LINK_OUTCOME_AS_SPAN, Boolean.TRUE);
writer.startElement(HTML.SPAN_ELEM, output);
if (output instanceof ClientBehaviorHolder holder)
@@ -935,12 +934,9 @@ protected void renderOutcomeLinkStart(FacesContext facesContext, UIOutcomeTarget
{
HtmlRendererUtils.writeIdIfNecessary(writer, output, facesContext);
}
- long commonPropertiesMarked = 0L;
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(output);
- }
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
+ Long commonEventsMarked = getCommonEventsMarked(facesContext, output);
+
+ if (behaviors.isEmpty() && commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderEventProperties(writer,
commonPropertiesMarked, output);
@@ -949,9 +945,8 @@ protected void renderOutcomeLinkStart(FacesContext facesContext, UIOutcomeTarget
}
else
{
- if (isCommonEventsOptimizationEnabled(facesContext))
+ if (commonEventsMarked != null)
{
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(output);
CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
commonPropertiesMarked, commonEventsMarked, output, behaviors);
CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
@@ -964,7 +959,7 @@ protected void renderOutcomeLinkStart(FacesContext facesContext, UIOutcomeTarget
facesContext, writer, output, behaviors);
}
}
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ if (commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderAnchorPassthroughPropertiesDisabledWithoutEvents(writer,
commonPropertiesMarked, output);
@@ -978,10 +973,10 @@ protected void renderOutcomeLinkStart(FacesContext facesContext, UIOutcomeTarget
else
{
HtmlRendererUtils.writeIdIfNecessary(writer, output, facesContext);
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ if (commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderAnchorPassthroughPropertiesDisabled(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(output), output);
+ commonPropertiesMarked, output);
}
else
{
@@ -998,6 +993,7 @@ protected void renderOutcomeLinkStart(FacesContext facesContext, UIOutcomeTarget
}
else
{
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, output);
//write anchor
writer.startElement(HTML.ANCHOR_ELEM, output);
writer.writeURIAttribute(HTML.HREF_ATTR, targetHref, null);
@@ -1012,12 +1008,9 @@ protected void renderOutcomeLinkStart(FacesContext facesContext, UIOutcomeTarget
{
HtmlRendererUtils.writeIdAndNameIfNecessary(writer, output, facesContext);
}
- long commonPropertiesMarked = 0L;
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(output);
- }
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
+ Long commonEventsMarked = getCommonEventsMarked(facesContext, output);
+
+ if (behaviors.isEmpty() && commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderEventProperties(writer,
commonPropertiesMarked, output);
@@ -1026,9 +1019,8 @@ protected void renderOutcomeLinkStart(FacesContext facesContext, UIOutcomeTarget
}
else
{
- if (isCommonEventsOptimizationEnabled(facesContext))
+ if (commonEventsMarked != null)
{
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(output);
CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
commonPropertiesMarked, commonEventsMarked, output, behaviors);
CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
@@ -1041,7 +1033,7 @@ protected void renderOutcomeLinkStart(FacesContext facesContext, UIOutcomeTarget
facesContext, writer, output, behaviors);
}
}
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ if (commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderAnchorPassthroughPropertiesWithoutEvents(writer,
commonPropertiesMarked, output);
@@ -1055,10 +1047,10 @@ protected void renderOutcomeLinkStart(FacesContext facesContext, UIOutcomeTarget
else
{
HtmlRendererUtils.writeIdAndNameIfNecessary(writer, output, facesContext);
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ if (commonPropertiesMarked != null)
{
CommonHtmlAttributesUtil.renderAnchorPassthroughProperties(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(output), output);
+ commonPropertiesMarked, output);
}
else
{
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlMessageRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlMessageRendererBase.java
index 21b6d397d..bcc720e4c 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlMessageRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlMessageRendererBase.java
@@ -19,8 +19,6 @@
package org.apache.myfaces.renderkit.html.base;
import org.apache.myfaces.renderkit.html.util.HtmlRendererUtils;
-import org.apache.myfaces.renderkit.html.util.CommonHtmlAttributesUtil;
-import org.apache.myfaces.renderkit.html.util.CommonHtmlEventsUtil;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
@@ -266,24 +264,8 @@ else if (renderId)
if (message instanceof ClientBehaviorHolder holder)
{
behaviors = holder.getClientBehaviors();
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
- {
- CommonHtmlAttributesUtil.renderEventProperties(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(message), message);
- }
- else
- {
- if (isCommonEventsOptimizationEnabled(facesContext))
- {
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(message),
- CommonHtmlEventsUtil.getMarkedEvents(message), message, behaviors);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, message, behaviors);
- }
- }
+ renderEventHandlers(facesContext, writer, message, behaviors,
+ getCommonPropertiesMarked(facesContext, message));
HtmlRendererUtils.renderHTMLAttributes(writer, message,
HTML.UNIVERSAL_ATTRIBUTES_WITHOUT_STYLE_AND_TITLE);
}
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlRadioRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlRadioRendererBase.java
index f3c42269f..1d46726ce 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlRadioRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlRadioRendererBase.java
@@ -499,33 +499,27 @@ else if (renderId)
if (uiComponent instanceof ClientBehaviorHolder holder)
{
behaviors = holder.getClientBehaviors();
-
- long commonPropertiesMarked = 0L;
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent);
- }
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, uiComponent);
+
+ if (behaviors.isEmpty() && commonPropertiesMarked != null)
{
- CommonHtmlAttributesUtil.renderChangeEventProperty(writer,
- commonPropertiesMarked, uiComponent);
- CommonHtmlAttributesUtil.renderEventProperties(writer,
- commonPropertiesMarked, uiComponent);
- CommonHtmlAttributesUtil.renderFieldEventPropertiesWithoutOnchange(writer,
- commonPropertiesMarked, uiComponent);
+ CommonHtmlAttributesUtil.renderChangeEventProperty(writer, commonPropertiesMarked, uiComponent);
+ CommonHtmlAttributesUtil.renderEventProperties(writer, commonPropertiesMarked, uiComponent);
+ CommonHtmlAttributesUtil.renderFieldEventPropertiesWithoutOnchange(
+ writer, commonPropertiesMarked, uiComponent);
}
else
{
- HtmlRendererUtils.renderBehaviorizedOnchangeEventHandler(facesContext, writer, uiComponent,
+ HtmlRendererUtils.renderBehaviorizedOnchangeEventHandler(facesContext, writer, uiComponent,
itemId != null ? itemId : clientId, behaviors);
- if (isCommonEventsOptimizationEnabled(facesContext))
+ Long commonEventsMarked = getCommonEventsMarked(facesContext, uiComponent);
+ if (commonEventsMarked != null)
{
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(uiComponent);
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
+ CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
commonPropertiesMarked, commonEventsMarked, uiComponent,
itemId != null ? itemId : clientId, behaviors);
CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchange(
- facesContext, writer, commonPropertiesMarked, commonEventsMarked, uiComponent,
+ facesContext, writer, commonPropertiesMarked, commonEventsMarked, uiComponent,
itemId != null ? itemId : clientId, behaviors);
}
else
@@ -533,8 +527,7 @@ else if (renderId)
HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, uiComponent,
itemId != null ? itemId : clientId, behaviors);
HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchange(
- facesContext, writer, uiComponent,
- itemId != null ? itemId : clientId, behaviors);
+ facesContext, writer, uiComponent, itemId != null ? itemId : clientId, behaviors);
}
}
HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlRenderer.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlRenderer.java
index baea057ad..d9b3f037a 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlRenderer.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlRenderer.java
@@ -22,11 +22,18 @@
import jakarta.faces.application.ViewHandler;
import jakarta.faces.component.UIComponent;
import jakarta.faces.component.UIViewRoot;
+import jakarta.faces.component.behavior.ClientBehavior;
+import jakarta.faces.component.behavior.ClientBehaviorHolder;
import jakarta.faces.context.FacesContext;
+import jakarta.faces.context.ResponseWriter;
import jakarta.faces.render.Renderer;
import java.io.IOException;
import java.util.List;
+import java.util.Map;
+import org.apache.myfaces.renderkit.html.util.CommonHtmlAttributesUtil;
+import org.apache.myfaces.renderkit.html.util.CommonHtmlEventsUtil;
import org.apache.myfaces.renderkit.html.util.HTML;
+import org.apache.myfaces.renderkit.html.util.HtmlRendererUtils;
import org.apache.myfaces.renderkit.html.util.ComponentAttrs;
public abstract class HtmlRenderer
@@ -130,4 +137,114 @@ protected boolean isCommonEventsOptimizationEnabled(FacesContext facesContext)
{
return false;
}
+
+ /**
+ * Returns the registered client behaviors for {@code component} if it implements
+ * {@link jakarta.faces.component.behavior.ClientBehaviorHolder}, or {@code null}
+ * otherwise. A non-null return value replaces a separate {@code boolean hasClientBehaviors}
+ * flag — callers can do a single null check instead of carrying two variables.
+ */
+ protected Map<String, List<ClientBehavior>> getClientBehaviors(UIComponent component)
+ {
+ return component instanceof ClientBehaviorHolder holder
+ ? holder.getClientBehaviors()
+ : null;
+ }
+
+ /**
+ * Returns the bitmask of common attributes set on {@code component} when the
+ * common-properties optimization is enabled, or {@code null} when the optimization
+ * is disabled (indicating the generic attribute-array path should be used instead).
+ */
+ protected Long getCommonPropertiesMarked(FacesContext facesContext, UIComponent component)
+ {
+ return isCommonPropertiesOptimizationEnabled(facesContext)
+ ? CommonHtmlAttributesUtil.getMarkedAttributes(component)
+ : null;
+ }
+
+ /**
+ * Returns the bitmask of common events registered on {@code component} when the
+ * common-events optimization is enabled, or {@code null} when it is disabled
+ * (indicating the generic behaviorized-event rendering path should be used instead).
+ */
+ protected Long getCommonEventsMarked(FacesContext facesContext, UIComponent component)
+ {
+ return isCommonEventsOptimizationEnabled(facesContext)
+ ? CommonHtmlEventsUtil.getMarkedEvents(component)
+ : null;
+ }
+
+ /**
+ * Renders generic event handlers (onclick, onmouseXxx, onkeyXxx, …) for a component
+ * that may carry client behaviors. Uses the bitmask-only path when no behaviors are
+ * registered and {@code commonPropertiesMarked} is non-null (optimization enabled);
+ * otherwise merges attributes with the registered behaviors.
+ *
+ * @param commonPropertiesMarked bitmask from {@link #getCommonPropertiesMarked}, or
+ * {@code null} when the optimization is disabled
+ */
+ protected void renderEventHandlers(FacesContext facesContext, ResponseWriter writer,
+ UIComponent component, Map<String, List<ClientBehavior>> behaviors,
+ Long commonPropertiesMarked) throws IOException
+ {
+ if (behaviors.isEmpty() && commonPropertiesMarked != null)
+ {
+ CommonHtmlAttributesUtil.renderEventProperties(writer, commonPropertiesMarked, component);
+ }
+ else
+ {
+ Long commonEventsMarked = getCommonEventsMarked(facesContext, component);
+ if (commonEventsMarked != null)
+ {
+ CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
+ commonPropertiesMarked, commonEventsMarked, component, behaviors);
+ }
+ else
+ {
+ HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, component, behaviors);
+ }
+ }
+ }
+
+ /**
+ * Renders event handlers for an input/field element: onchange, generic events
+ * (onclick, onmouseXxx, onkeyXxx, …), and field events (onfocus, onblur, onselect).
+ * Uses the bitmask-only path when no behaviors are registered and
+ * {@code commonPropertiesMarked} is non-null (optimization enabled); otherwise merges
+ * attributes with the registered behaviors.
+ *
+ * @param commonPropertiesMarked bitmask from {@link #getCommonPropertiesMarked}, or
+ * {@code null} when the optimization is disabled
+ */
+ protected void renderFieldEventHandlers(FacesContext facesContext, ResponseWriter writer,
+ UIComponent component, Map<String, List<ClientBehavior>> behaviors,
+ Long commonPropertiesMarked) throws IOException
+ {
+ if (behaviors.isEmpty() && commonPropertiesMarked != null)
+ {
+ CommonHtmlAttributesUtil.renderChangeEventProperty(writer, commonPropertiesMarked, component);
+ CommonHtmlAttributesUtil.renderEventProperties(writer, commonPropertiesMarked, component);
+ CommonHtmlAttributesUtil.renderFieldEventPropertiesWithoutOnchange(
+ writer, commonPropertiesMarked, component);
+ }
+ else
+ {
+ HtmlRendererUtils.renderBehaviorizedOnchangeEventHandler(facesContext, writer, component, behaviors);
+ Long commonEventsMarked = getCommonEventsMarked(facesContext, component);
+ if (commonEventsMarked != null)
+ {
+ CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
+ commonPropertiesMarked, commonEventsMarked, component, behaviors);
+ CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchange(
+ facesContext, writer, commonPropertiesMarked, commonEventsMarked, component, behaviors);
+ }
+ else
+ {
+ HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, component, behaviors);
+ HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchange(
+ facesContext, writer, component, behaviors);
+ }
+ }
+ }
}
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlSecretRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlSecretRendererBase.java
index 1302a3295..9633e2e4f 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlSecretRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlSecretRendererBase.java
@@ -21,7 +21,6 @@
import org.apache.myfaces.renderkit.html.util.HtmlRendererUtils;
import org.apache.myfaces.renderkit.html.util.ClientBehaviorRendererUtils;
import org.apache.myfaces.renderkit.html.util.CommonHtmlAttributesUtil;
-import org.apache.myfaces.renderkit.html.util.CommonHtmlEventsUtil;
import org.apache.myfaces.renderkit.RendererUtils;
import org.apache.myfaces.renderkit.html.util.ResourceUtils;
@@ -110,65 +109,33 @@ protected void renderInputBegin(FacesContext facesContext, UIComponent uiCompone
writer.writeAttribute(HTML.VALUE_ATTR, strValue, ComponentAttrs.VALUE_ATTR);
}
- if (uiComponent instanceof ClientBehaviorHolder holder)
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, uiComponent);
+ Map<String, List<ClientBehavior>> behaviors = getClientBehaviors(uiComponent);
+
+ if (behaviors != null)
{
- Map<String, List<ClientBehavior>> behaviors = holder.getClientBehaviors();
-
- long commonPropertiesMarked = 0L;
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent);
- }
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
- {
- CommonHtmlAttributesUtil.renderChangeEventProperty(writer,
- commonPropertiesMarked, uiComponent);
- CommonHtmlAttributesUtil.renderEventProperties(writer,
- commonPropertiesMarked, uiComponent);
- CommonHtmlAttributesUtil.renderFieldEventPropertiesWithoutOnchange(writer,
- commonPropertiesMarked, uiComponent);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedOnchangeEventHandler(facesContext, writer, uiComponent, behaviors);
- if (isCommonEventsOptimizationEnabled(facesContext))
- {
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(uiComponent);
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
- commonPropertiesMarked, commonEventsMarked, uiComponent, behaviors);
- CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchange(
- facesContext, writer, commonPropertiesMarked, commonEventsMarked, uiComponent, behaviors);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, uiComponent, behaviors);
- HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchange(
- facesContext, writer, uiComponent, behaviors);
- }
- }
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ renderFieldEventHandlers(facesContext, writer, uiComponent, behaviors, commonPropertiesMarked);
+ }
+
+ if (commonPropertiesMarked != null)
+ {
+ if (behaviors != null)
{
- CommonHtmlAttributesUtil.renderInputPassthroughPropertiesWithoutDisabledAndEvents(writer,
- commonPropertiesMarked, uiComponent);
+ CommonHtmlAttributesUtil.renderInputPassthroughPropertiesWithoutDisabledAndEvents(
+ writer, commonPropertiesMarked, uiComponent);
}
else
{
- HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
- HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_EVENTS);
+ CommonHtmlAttributesUtil.renderInputPassthroughPropertiesWithoutDisabled(
+ writer, commonPropertiesMarked, uiComponent);
}
}
else
{
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- CommonHtmlAttributesUtil.renderInputPassthroughPropertiesWithoutDisabled(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent), uiComponent);
- }
- else
- {
- HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
- HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED);
- }
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
+ behaviors != null
+ ? HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_EVENTS
+ : HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED);
}
if (isDisabled(facesContext, uiComponent))
@@ -222,7 +189,7 @@ public void decode(FacesContext facesContext, UIComponent component)
RendererUtils.checkParamValidity(facesContext, component, UIInput.class);
HtmlRendererUtils.decodeUIInput(facesContext, component);
- if (component instanceof ClientBehaviorHolder && !HtmlRendererUtils.isDisabled(component))
+ if (component instanceof ClientBehaviorHolder && !isDisabled(facesContext, component))
{
ClientBehaviorRendererUtils.decodeClientBehaviors(facesContext, component);
}
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlSelectableRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlSelectableRendererBase.java
index bc71231b7..a6b6236c5 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlSelectableRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlSelectableRendererBase.java
@@ -29,7 +29,6 @@
import jakarta.faces.component.UISelectMany;
import jakarta.faces.component.UISelectOne;
import jakarta.faces.component.behavior.ClientBehavior;
-import jakarta.faces.component.behavior.ClientBehaviorHolder;
import jakarta.faces.context.FacesContext;
import jakarta.faces.context.ResponseWriter;
import jakarta.faces.convert.Converter;
@@ -50,15 +49,9 @@ protected void internalRenderSelect(FacesContext facesContext,
// Hoist client ID and optimization flags once; both are used multiple times below.
String clientId = uiComponent.getClientId(facesContext);
- boolean commonPropertiesOptimization = isCommonPropertiesOptimizationEnabled(facesContext);
- long commonPropertiesMarked = commonPropertiesOptimization
- ? CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent) : 0L;
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, uiComponent);
- Map<String, List<ClientBehavior>> behaviors = null;
- if (uiComponent instanceof ClientBehaviorHolder holder)
- {
- behaviors = holder.getClientBehaviors();
- }
+ Map<String, List<ClientBehavior>> behaviors = getClientBehaviors(uiComponent);
if (behaviors != null && !behaviors.isEmpty())
{
@@ -95,59 +88,28 @@ protected void internalRenderSelect(FacesContext facesContext,
if (behaviors != null)
{
- if (behaviors.isEmpty() && commonPropertiesOptimization)
- {
- CommonHtmlAttributesUtil.renderChangeEventProperty(writer, commonPropertiesMarked, uiComponent);
- CommonHtmlAttributesUtil.renderEventProperties(writer, commonPropertiesMarked, uiComponent);
- // Note that on Faces 2.3, selectable components don't need onselect attribute
- // Please see https://issues.apache.org/jira/browse/MYFACES-4190
- CommonHtmlAttributesUtil.renderFieldEventPropertiesWithoutOnchangeAndOnselect(writer,
- commonPropertiesMarked, uiComponent);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedOnchangeEventHandler(facesContext, writer, uiComponent, behaviors);
- if (isCommonEventsOptimizationEnabled(facesContext))
- {
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(uiComponent);
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
- commonPropertiesMarked, commonEventsMarked, uiComponent, behaviors);
- CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
- facesContext, writer, commonPropertiesMarked, commonEventsMarked, uiComponent, behaviors);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, uiComponent, behaviors);
- HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(facesContext,
- writer, uiComponent, behaviors);
- }
- }
-
- if (commonPropertiesOptimization)
+ renderSelectEventHandlers(facesContext, writer, uiComponent, behaviors, commonPropertiesMarked);
+ }
+
+ if (commonPropertiesMarked != null)
+ {
+ if (behaviors != null)
{
- CommonHtmlAttributesUtil.renderSelectPassthroughPropertiesWithoutDisabledAndEvents(writer,
- commonPropertiesMarked, uiComponent);
+ CommonHtmlAttributesUtil.renderSelectPassthroughPropertiesWithoutDisabledAndEvents(
+ writer, commonPropertiesMarked, uiComponent);
}
else
{
- HtmlRendererUtils.renderHTMLAttributes(
- writer,
- uiComponent,
- HTML.SELECT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_EVENTS);
+ CommonHtmlAttributesUtil.renderSelectPassthroughPropertiesWithoutDisabled(
+ writer, commonPropertiesMarked, uiComponent);
}
}
else
{
- if (commonPropertiesOptimization)
- {
- CommonHtmlAttributesUtil.renderSelectPassthroughPropertiesWithoutDisabled(writer,
- commonPropertiesMarked, uiComponent);
- }
- else
- {
- HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
- HTML.SELECT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED);
- }
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
+ behaviors != null
+ ? HTML.SELECT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_EVENTS
+ : HTML.SELECT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED);
}
if (disabled)
@@ -168,5 +130,40 @@ protected void internalRenderSelect(FacesContext facesContext,
writer.writeText(RendererUtils.EMPTY_STRING, null);
writer.endElement(HTML.SELECT_ELEM);
}
-
+
+ /**
+ * Renders event attributes for a select element, merging with any registered client behaviors.
+ * Note: on Faces 2.3+ selectable components don't need the onselect attribute (MYFACES-4190).
+ */
+ private void renderSelectEventHandlers(FacesContext facesContext, ResponseWriter writer,
+ UIComponent uiComponent, Map<String, List<ClientBehavior>> behaviors,
+ Long commonPropertiesMarked) throws IOException
+ {
+ if (behaviors.isEmpty() && commonPropertiesMarked != null)
+ {
+ CommonHtmlAttributesUtil.renderChangeEventProperty(writer, commonPropertiesMarked, uiComponent);
+ CommonHtmlAttributesUtil.renderEventProperties(writer, commonPropertiesMarked, uiComponent);
+ CommonHtmlAttributesUtil.renderFieldEventPropertiesWithoutOnchangeAndOnselect(
+ writer, commonPropertiesMarked, uiComponent);
+ }
+ else
+ {
+ HtmlRendererUtils.renderBehaviorizedOnchangeEventHandler(facesContext, writer, uiComponent, behaviors);
+ Long commonEventsMarked = getCommonEventsMarked(facesContext, uiComponent);
+ if (commonEventsMarked != null)
+ {
+ CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
+ commonPropertiesMarked, commonEventsMarked, uiComponent, behaviors);
+ CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
+ facesContext, writer, commonPropertiesMarked, commonEventsMarked, uiComponent, behaviors);
+ }
+ else
+ {
+ HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, uiComponent, behaviors);
+ HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
+ facesContext, writer, uiComponent, behaviors);
+ }
+ }
+ }
+
}
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlTableRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlTableRendererBase.java
index 20ff71fe2..3959ef567 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlTableRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlTableRendererBase.java
@@ -21,7 +21,6 @@
import org.apache.myfaces.renderkit.html.util.HtmlRendererUtils;
import org.apache.myfaces.renderkit.html.util.ClientBehaviorRendererUtils;
import org.apache.myfaces.renderkit.html.util.CommonHtmlAttributesUtil;
-import org.apache.myfaces.renderkit.html.util.CommonHtmlEventsUtil;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@@ -132,63 +131,44 @@ protected void startTable(FacesContext facesContext, UIComponent uiComponent) th
ResponseWriter writer = facesContext.getResponseWriter();
writer.startElement(HTML.TABLE_ELEM, uiComponent);
- Map<String, List<ClientBehavior>> behaviors = null;
- if (uiComponent instanceof ClientBehaviorHolder holder)
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, uiComponent);
+ Map<String, List<ClientBehavior>> behaviors = getClientBehaviors(uiComponent);
+
+ if (behaviors != null && !behaviors.isEmpty())
{
- behaviors = holder.getClientBehaviors();
- if (!behaviors.isEmpty())
- {
- HtmlRendererUtils.writeIdAndName(writer, uiComponent, facesContext);
- }
- else
- {
- HtmlRendererUtils.writeIdIfNecessary(writer, uiComponent, facesContext);
- }
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
- {
- CommonHtmlAttributesUtil.renderEventProperties(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent), uiComponent);
- }
- else
- {
- if (isCommonEventsOptimizationEnabled(facesContext))
- {
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent),
- CommonHtmlEventsUtil.getMarkedEvents(uiComponent), uiComponent, behaviors);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, uiComponent, behaviors);
- }
- }
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.TABLE_ATTRIBUTES);
- CommonHtmlAttributesUtil.renderCommonPassthroughPropertiesWithoutEvents(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent), uiComponent);
- }
- else
- {
- HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
- HTML.TABLE_PASSTHROUGH_ATTRIBUTES_WITHOUT_EVENTS);
- }
+ HtmlRendererUtils.writeIdAndName(writer, uiComponent, facesContext);
}
else
{
HtmlRendererUtils.writeIdIfNecessary(writer, uiComponent, facesContext);
- if (isCommonPropertiesOptimizationEnabled(facesContext))
+ }
+
+ if (behaviors != null)
+ {
+ renderEventHandlers(facesContext, writer, uiComponent, behaviors, commonPropertiesMarked);
+ }
+
+ if (commonPropertiesMarked != null)
+ {
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.TABLE_ATTRIBUTES);
+ if (behaviors != null)
{
- HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.TABLE_ATTRIBUTES);
- CommonHtmlAttributesUtil.renderCommonPassthroughProperties(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent), uiComponent);
+ CommonHtmlAttributesUtil.renderCommonPassthroughPropertiesWithoutEvents(
+ writer, commonPropertiesMarked, uiComponent);
}
else
{
- HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
- HTML.TABLE_PASSTHROUGH_ATTRIBUTES);
+ CommonHtmlAttributesUtil.renderCommonPassthroughProperties(
+ writer, commonPropertiesMarked, uiComponent);
}
}
+ else
+ {
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
+ behaviors != null
+ ? HTML.TABLE_PASSTHROUGH_ATTRIBUTES_WITHOUT_EVENTS
+ : HTML.TABLE_PASSTHROUGH_ATTRIBUTES);
+ }
}
/**
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlTextRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlTextRendererBase.java
index 7aceb6f22..a42b5a5ca 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlTextRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlTextRendererBase.java
@@ -45,7 +45,6 @@
import org.apache.myfaces.renderkit.RendererUtils;
import org.apache.myfaces.renderkit.html.util.ClientBehaviorRendererUtils;
import org.apache.myfaces.renderkit.html.util.CommonHtmlAttributesUtil;
-import org.apache.myfaces.renderkit.html.util.CommonHtmlEventsUtil;
import org.apache.myfaces.renderkit.html.util.ComponentAttrs;
import org.apache.myfaces.renderkit.html.util.HTML;
import org.apache.myfaces.renderkit.html.util.HtmlRendererUtils;
@@ -243,65 +242,33 @@ protected void renderInputBegin(FacesContext facesContext, UIComponent component
renderValue(facesContext, component, writer);
- boolean commonPropertiesOptimization = isCommonPropertiesOptimizationEnabled(facesContext);
- long commonPropertiesMarked = commonPropertiesOptimization
- ? CommonHtmlAttributesUtil.getMarkedAttributes(component) : 0L;
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, component);
+ Map<String, List<ClientBehavior>> behaviors = getClientBehaviors(component);
- Map<String, List<ClientBehavior>> behaviors = null;
- if (component instanceof ClientBehaviorHolder holder)
+ if (behaviors != null)
{
- behaviors = holder.getClientBehaviors();
+ renderFieldEventHandlers(facesContext, writer, component, behaviors, commonPropertiesMarked);
+ }
- if (behaviors.isEmpty() && commonPropertiesOptimization)
- {
- CommonHtmlAttributesUtil.renderChangeEventProperty(writer,
- commonPropertiesMarked, component);
- CommonHtmlAttributesUtil.renderEventProperties(writer,
- commonPropertiesMarked, component);
- CommonHtmlAttributesUtil.renderFieldEventPropertiesWithoutOnchange(writer,
- commonPropertiesMarked, component);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedOnchangeEventHandler(facesContext, writer, component, behaviors);
- if (isCommonEventsOptimizationEnabled(facesContext))
- {
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(component);
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
- commonPropertiesMarked, commonEventsMarked, component, behaviors);
- CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchange(
- facesContext, writer, commonPropertiesMarked, commonEventsMarked, component, behaviors);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, component, behaviors);
- HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchange(
- facesContext, writer, component, behaviors);
- }
- }
- if (commonPropertiesOptimization)
+ if (commonPropertiesMarked != null)
+ {
+ if (behaviors != null)
{
- CommonHtmlAttributesUtil.renderInputPassthroughPropertiesWithoutDisabledAndEvents(writer,
- commonPropertiesMarked, component);
+ CommonHtmlAttributesUtil.renderInputPassthroughPropertiesWithoutDisabledAndEvents(
+ writer, commonPropertiesMarked, component);
}
else
{
- HtmlRendererUtils.renderHTMLAttributes(writer, component,
- HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_EVENTS);
+ CommonHtmlAttributesUtil.renderInputPassthroughPropertiesWithoutDisabled(
+ writer, commonPropertiesMarked, component);
}
}
else
{
- if (commonPropertiesOptimization)
- {
- CommonHtmlAttributesUtil.renderInputPassthroughPropertiesWithoutDisabled(writer,
- commonPropertiesMarked, component);
- }
- else
- {
- HtmlRendererUtils.renderHTMLAttributes(writer, component,
- HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED);
- }
+ HtmlRendererUtils.renderHTMLAttributes(writer, component,
+ behaviors != null
+ ? HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_EVENTS
+ : HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED);
}
if (isDisabled(facesContext, component))
@@ -377,7 +344,7 @@ public void decode(FacesContext facesContext, UIComponent component)
}
HtmlRendererUtils.decodeUIInput(facesContext, component);
- if (component instanceof ClientBehaviorHolder && !HtmlRendererUtils.isDisabled(component))
+ if (component instanceof ClientBehaviorHolder && !isDisabled(facesContext, component))
{
ClientBehaviorRendererUtils.decodeClientBehaviors(facesContext, component);
}
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlTextareaRendererBase.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlTextareaRendererBase.java
index d427b08e3..662bfd403 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlTextareaRendererBase.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlTextareaRendererBase.java
@@ -21,7 +21,6 @@
import org.apache.myfaces.renderkit.html.util.HtmlRendererUtils;
import org.apache.myfaces.renderkit.html.util.ClientBehaviorRendererUtils;
import org.apache.myfaces.renderkit.html.util.CommonHtmlAttributesUtil;
-import org.apache.myfaces.renderkit.html.util.CommonHtmlEventsUtil;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@@ -93,43 +92,15 @@ protected void renderTextAreaBegin(FacesContext facesContext, UIComponent uiComp
HtmlRendererUtils.writeIdIfNecessary(writer, uiComponent, facesContext);
writer.writeAttribute(HTML.NAME_ATTR, uiComponent.getClientId(facesContext), null);
}
- long commonPropertiesMarked = 0L;
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent);
- }
- if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
+ Long commonPropertiesMarked = getCommonPropertiesMarked(facesContext, uiComponent);
+
+ renderFieldEventHandlers(facesContext, writer, uiComponent, behaviors, commonPropertiesMarked);
+
+ if (commonPropertiesMarked != null)
{
- CommonHtmlAttributesUtil.renderChangeEventProperty(writer,
- commonPropertiesMarked, uiComponent);
- CommonHtmlAttributesUtil.renderEventProperties(writer,
- commonPropertiesMarked, uiComponent);
- CommonHtmlAttributesUtil.renderFieldEventPropertiesWithoutOnchange(writer,
- commonPropertiesMarked, uiComponent);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedOnchangeEventHandler(facesContext, writer, uiComponent, behaviors);
- if (isCommonEventsOptimizationEnabled(facesContext))
- {
- long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(uiComponent);
- CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
- commonPropertiesMarked, commonEventsMarked, uiComponent, behaviors);
- CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchange(
- facesContext, writer, commonPropertiesMarked, commonEventsMarked, uiComponent, behaviors);
- }
- else
- {
- HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, uiComponent, behaviors);
- HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchange(
- facesContext, writer, uiComponent, behaviors);
- }
- }
- if (isCommonPropertiesOptimizationEnabled(facesContext))
- {
- CommonHtmlAttributesUtil.renderCommonFieldPassthroughPropertiesWithoutDisabledAndEvents(writer,
- CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent), uiComponent);
- HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.TEXTAREA_ATTRIBUTES);
+ CommonHtmlAttributesUtil.renderCommonFieldPassthroughPropertiesWithoutDisabledAndEvents(
+ writer, commonPropertiesMarked, uiComponent);
+ renderTextareaSpecificAttributes(writer, uiComponent);
}
else
{
@@ -145,7 +116,7 @@ protected void renderTextAreaBegin(FacesContext facesContext, UIComponent uiComp
{
CommonHtmlAttributesUtil.renderCommonFieldPassthroughPropertiesWithoutDisabled(writer,
CommonHtmlAttributesUtil.getMarkedAttributes(uiComponent), uiComponent);
- HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.TEXTAREA_ATTRIBUTES);
+ renderTextareaSpecificAttributes(writer, uiComponent);
}
else
{
@@ -160,6 +131,27 @@ protected void renderTextAreaBegin(FacesContext facesContext, UIComponent uiComp
}
}
+ /**
+ * Renders textarea-specific attributes (cols, readonly, rows, wrap) using typed getters
+ * for HtmlInputTextarea to bypass the _ComponentAttributesMap descriptor-lookup overhead.
+ */
+ private static void renderTextareaSpecificAttributes(ResponseWriter writer, UIComponent uiComponent)
+ throws IOException
+ {
+ if (uiComponent instanceof HtmlInputTextarea ta)
+ {
+ HtmlRendererUtils.renderHTMLAttribute(writer, HTML.COLS_ATTR, HTML.COLS_ATTR, ta.getCols());
+ HtmlRendererUtils.renderHTMLAttribute(writer, HTML.READONLY_ATTR, HTML.READONLY_ATTR, ta.isReadonly());
+ HtmlRendererUtils.renderHTMLAttribute(writer, HTML.ROWS_ATTR, HTML.ROWS_ATTR, ta.getRows());
+ // wrap has no typed getter on HtmlInputTextarea; fall back to the attributes map
+ HtmlRendererUtils.renderHTMLStringAttribute(writer, uiComponent, HTML.WRAP_ATTR, HTML.WRAP_ATTR);
+ }
+ else
+ {
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.TEXTAREA_ATTRIBUTES);
+ }
+ }
+
//Subclasses can override the writing of the "text" value of the textarea
protected void renderTextAreaValue(FacesContext facesContext, UIComponent uiComponent) throws IOException
{
@@ -212,7 +204,7 @@ public void decode(FacesContext facesContext, UIComponent component)
RendererUtils.checkParamValidity(facesContext, component, UIInput.class);
HtmlRendererUtils.decodeUIInput(facesContext, component);
- if (component instanceof ClientBehaviorHolder && !HtmlRendererUtils.isDisabled(component))
+ if (component instanceof ClientBehaviorHolder && !isDisabled(facesContext, component))
{
ClientBehaviorRendererUtils.decodeClientBehaviors(facesContext, component);
}
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/util/CommonHtmlEventsUtil.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/util/CommonHtmlEventsUtil.java
index 71ce0a8dc..7b8da20f4 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/util/CommonHtmlEventsUtil.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/util/CommonHtmlEventsUtil.java
@@ -388,7 +388,7 @@ && deferClientBehaviorScriptIfCspNonceActive(facesContext, targetElementId, html
public static void renderBehaviorizedEventHandlers(
FacesContext facesContext, ResponseWriter writer,
- long commonAttributesMarked, long commonEventsMarked,
+ Long commonAttributesMarked, Long commonEventsMarked,
UIComponent uiComponent,
Map<String, List<ClientBehavior>> clientBehaviors)
throws IOException
@@ -400,11 +400,20 @@ public static void renderBehaviorizedEventHandlers(
public static void renderBehaviorizedEventHandlers(
FacesContext facesContext, ResponseWriter writer,
- long commonAttributesMarked, long commonEventsMarked,
+ Long commonAttributesMarked, Long commonEventsMarked,
UIComponent uiComponent, String sourceId,
Map<String, List<ClientBehavior>> clientBehaviors)
throws IOException
{
+ if (commonAttributesMarked == null)
+ {
+ commonAttributesMarked = 0L;
+ }
+ if (commonEventsMarked == null)
+ {
+ commonEventsMarked = 0L;
+ }
+
if (commonAttributesMarked == 0 && commonEventsMarked == 0)
{
return;
@@ -487,7 +496,7 @@ public static void renderBehaviorizedEventHandlers(
public static void renderBehaviorizedEventHandlersWithoutOnclick(
FacesContext facesContext, ResponseWriter writer,
- long commonAttributesMarked, long commonEventsMarked,
+ Long commonAttributesMarked, Long commonEventsMarked,
UIComponent uiComponent,
Map<String, List<ClientBehavior>> clientBehaviors)
throws IOException
@@ -506,11 +515,20 @@ public static void renderBehaviorizedEventHandlersWithoutOnclick(
*/
public static void renderBehaviorizedEventHandlersWithoutOnclick(
FacesContext facesContext, ResponseWriter writer,
- long commonAttributesMarked, long commonEventsMarked,
+ Long commonAttributesMarked, Long commonEventsMarked,
UIComponent uiComponent, String sourceId,
Map<String, List<ClientBehavior>> clientBehaviors)
throws IOException
{
+ if (commonAttributesMarked == null)
+ {
+ commonAttributesMarked = 0L;
+ }
+ if (commonEventsMarked == null)
+ {
+ commonEventsMarked = 0L;
+ }
+
if (commonAttributesMarked == 0 && commonEventsMarked == 0)
{
return;
@@ -670,7 +688,7 @@ public static void renderBehaviorizedFieldEventHandlersWithoutOnfocus(
public static void renderBehaviorizedFieldEventHandlersWithoutOnchange(
FacesContext facesContext, ResponseWriter writer,
- long commonAttributesMarked, long commonEventsMarked,
+ Long commonAttributesMarked, Long commonEventsMarked,
UIComponent uiComponent,
Map<String, List<ClientBehavior>> clientBehaviors)
throws IOException
@@ -682,11 +700,20 @@ public static void renderBehaviorizedFieldEventHandlersWithoutOnchange(
public static void renderBehaviorizedFieldEventHandlersWithoutOnchange(
FacesContext facesContext, ResponseWriter writer,
- long commonAttributesMarked, long commonEventsMarked,
+ Long commonAttributesMarked, Long commonEventsMarked,
UIComponent uiComponent, String sourceId,
Map<String, List<ClientBehavior>> clientBehaviors)
throws IOException
{
+ if (commonAttributesMarked == null)
+ {
+ commonAttributesMarked = 0L;
+ }
+ if (commonEventsMarked == null)
+ {
+ commonEventsMarked = 0L;
+ }
+
if (commonAttributesMarked == 0 && commonEventsMarked == 0)
{
return;
@@ -717,7 +744,7 @@ public static void renderBehaviorizedFieldEventHandlersWithoutOnchange(
public static void renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
FacesContext facesContext, ResponseWriter writer,
- long commonAttributesMarked, long commonEventsMarked,
+ Long commonAttributesMarked, Long commonEventsMarked,
UIComponent uiComponent,
Map<String, List<ClientBehavior>> clientBehaviors)
throws IOException
@@ -731,11 +758,20 @@ public static void renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselec
public static void renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
FacesContext facesContext, ResponseWriter writer,
- long commonAttributesMarked, long commonEventsMarked,
+ Long commonAttributesMarked, Long commonEventsMarked,
UIComponent uiComponent, String sourceId,
Map<String, List<ClientBehavior>> clientBehaviors)
throws IOException
{
+ if (commonAttributesMarked == null)
+ {
+ commonAttributesMarked = 0L;
+ }
+ if (commonEventsMarked == null)
+ {
+ commonEventsMarked = 0L;
+ }
+
if (commonAttributesMarked == 0 && commonEventsMarked == 0)
{
return;
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/util/HtmlRendererUtils.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/util/HtmlRendererUtils.java
index 1c4aa8f6d..417fd03a2 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/util/HtmlRendererUtils.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/util/HtmlRendererUtils.java
@@ -47,9 +47,25 @@
import jakarta.faces.component.ValueHolder;
import jakarta.faces.component.behavior.ClientBehavior;
import jakarta.faces.component.behavior.ClientBehaviorContext;
+import jakarta.faces.component.html.HtmlCommandButton;
+import jakarta.faces.component.html.HtmlCommandLink;
import jakarta.faces.component.html.HtmlDataTable;
+import jakarta.faces.component.html.HtmlInputFile;
+import jakarta.faces.component.html.HtmlInputSecret;
+import jakarta.faces.component.html.HtmlInputText;
+import jakarta.faces.component.html.HtmlInputTextarea;
import jakarta.faces.component.html.HtmlMessages;
+import jakarta.faces.component.html.HtmlOutcomeTargetButton;
+import jakarta.faces.component.html.HtmlOutcomeTargetLink;
+import jakarta.faces.component.html.HtmlOutputLink;
import jakarta.faces.component.html.HtmlPanelGrid;
+import jakarta.faces.component.html.HtmlSelectBooleanCheckbox;
+import jakarta.faces.component.html.HtmlSelectManyCheckbox;
+import jakarta.faces.component.html.HtmlSelectManyListbox;
+import jakarta.faces.component.html.HtmlSelectManyMenu;
+import jakarta.faces.component.html.HtmlSelectOneListbox;
+import jakarta.faces.component.html.HtmlSelectOneMenu;
+import jakarta.faces.component.html.HtmlSelectOneRadio;
import jakarta.faces.component.visit.VisitCallback;
import jakarta.faces.component.visit.VisitContext;
import jakarta.faces.component.visit.VisitResult;
@@ -166,11 +182,125 @@ public static boolean isDisabledOrReadOnly(UIComponent component)
public static boolean isDisabled(UIComponent component)
{
+ // Typed getter fast-path for all standard HTML components — avoids the
+ // _ComponentAttributesMap property-descriptor lookup on every decode/render call.
+ if (component instanceof HtmlInputText c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlSelectOneMenu c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlSelectManyMenu c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlSelectBooleanCheckbox c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlSelectManyCheckbox c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlCommandButton c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlCommandLink c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlInputTextarea c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlInputSecret c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlInputFile c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlSelectOneListbox c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlSelectManyListbox c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlSelectOneRadio c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlOutcomeTargetButton c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlOutcomeTargetLink c)
+ {
+ return c.isDisabled();
+ }
+ if (component instanceof HtmlOutputLink c)
+ {
+ return c.isDisabled();
+ }
+ // Custom/composite component: fall back to attributes map
return isTrue(component.getAttributes().get("disabled"));
}
public static boolean isReadOnly(UIComponent component)
{
+ // Typed getter fast-path for all standard HTML components — avoids the
+ // _ComponentAttributesMap property-descriptor lookup on every decode/render call.
+ if (component instanceof HtmlInputText c)
+ {
+ return c.isReadonly();
+ }
+ if (component instanceof HtmlSelectOneMenu c)
+ {
+ return c.isReadonly();
+ }
+ if (component instanceof HtmlSelectManyMenu c)
+ {
+ return c.isReadonly();
+ }
+ if (component instanceof HtmlSelectBooleanCheckbox c)
+ {
+ return c.isReadonly();
+ }
+ if (component instanceof HtmlSelectManyCheckbox c)
+ {
+ return c.isReadonly();
+ }
+ if (component instanceof HtmlCommandButton c)
+ {
+ return c.isReadonly();
+ }
+ if (component instanceof HtmlInputTextarea c)
+ {
+ return c.isReadonly();
+ }
+ if (component instanceof HtmlInputSecret c)
+ {
+ return c.isReadonly();
+ }
+ if (component instanceof HtmlSelectOneListbox c)
+ {
+ return c.isReadonly();
+ }
+ if (component instanceof HtmlSelectManyListbox c)
+ {
+ return c.isReadonly();
+ }
+ if (component instanceof HtmlSelectOneRadio c)
+ {
+ return c.isReadonly();
+ }
+ // Custom/composite component: fall back to attributes map
return isTrue(component.getAttributes().get("readonly"));
}
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/util/SelectItemsUtils.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/util/SelectItemsUtils.java
index ededa288d..879a7ff97 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/util/SelectItemsUtils.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/util/SelectItemsUtils.java
@@ -96,7 +96,7 @@ protected static void internalRenderSelectOptions(FacesContext context,
ResponseWriter writer = context.getResponseWriter();
// check for the hideNoSelectionOption attribute
boolean hideNoSelectionOption = isHideNoSelectionOption(component);
- boolean componentDisabled = isTrue(component.getAttributes().get("disabled"));
+ boolean componentDisabled = HtmlRendererUtils.isDisabled(component);
for (int i = 0; i < selectItemList.size(); i++)
{
@@ -230,16 +230,4 @@ protected static void internalRenderSelectOptions(FacesContext context,
}
}
- private static boolean isTrue(Object obj)
- {
- if (obj instanceof String string)
- {
- return Boolean.valueOf(string);
- }
- if (!(obj instanceof Boolean))
- {
- return false;
- }
- return ((Boolean) obj);
- }
}