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);
-    }
 }