From 9c4177a5ca54e0ecc94ca2119695b2c3798a1052 Mon Sep 17 00:00:00 2001 From: Volodymyr Siedlecki Date: Thu, 27 Aug 2026 13:21:28 -0400 Subject: [PATCH 1/2] Revert ChildSearchKeywordResolver.java to fix MYFACES-4764 --- .../component/search/ChildSearchKeywordResolver.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/impl/src/main/java/org/apache/myfaces/component/search/ChildSearchKeywordResolver.java b/impl/src/main/java/org/apache/myfaces/component/search/ChildSearchKeywordResolver.java index ae1309ae97..06b5d5c1a3 100644 --- a/impl/src/main/java/org/apache/myfaces/component/search/ChildSearchKeywordResolver.java +++ b/impl/src/main/java/org/apache/myfaces/component/search/ChildSearchKeywordResolver.java @@ -18,7 +18,6 @@ */ package org.apache.myfaces.component.search; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import jakarta.faces.FacesException; @@ -56,17 +55,15 @@ public void resolve(SearchKeywordContext expressionContext, UIComponent current, } int count = 0; - List children = current.getChildren(); - int n = children.size(); - for (int i = 0; i < n; i++) + for (int i = 0; i < current.getChildCount(); i++) { - if (!(children.get(i) instanceof UntargetableComponent)) + if (!(current.getChildren().get(i) instanceof UntargetableComponent)) { count++; } if (count == childNumber + 1) { - expressionContext.invokeContextCallback(children.get(i)); + expressionContext.invokeContextCallback(current.getChildren().get(childNumber)); break; } } From 22f5159aadeba006bd0bd779d3846258c428e0c6 Mon Sep 17 00:00:00 2001 From: Volodymyr Siedlecki Date: Mon, 31 Aug 2026 12:56:33 -0400 Subject: [PATCH 2/2] Create test for MYFACES-4764 --- .../search/SearchExpressionImplTest.java | 24 +++++++++++++ .../component/search/search_myfaces4764.xhtml | 35 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 impl/src/test/resources/org/apache/myfaces/component/search/search_myfaces4764.xhtml diff --git a/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java b/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java index 2ae0fade4c..1befee2cd4 100644 --- a/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java +++ b/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java @@ -419,6 +419,30 @@ public void testMyFaces4695() throws Exception processRemainingPhases(); } + /** + * Regression test for MYFACES-4764. + */ + @Test + public void testMyFaces4764() throws Exception + { + startViewRequest("/search_myfaces4764.xhtml"); + processLifecycleExecute(); + executeBeforeRender(); + executeBuildViewCycle(); + + SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler(); + + UIComponent body = facesContext.getViewRoot().findComponent("body"); + Assertions.assertNotNull(body, "body component must exist"); + + SearchExpressionContext ctx1 = SearchExpressionContext.createSearchExpressionContext(facesContext, body); + + Assertions.assertEquals("first", handler.resolveClientId(ctx1, "@child(1)"), + "@child(1) must resolve to 'first'"); + + processRemainingPhases(); + } + /* @Test public void testCompositeComponentExpression() throws Exception diff --git a/impl/src/test/resources/org/apache/myfaces/component/search/search_myfaces4764.xhtml b/impl/src/test/resources/org/apache/myfaces/component/search/search_myfaces4764.xhtml new file mode 100644 index 0000000000..4a4c0f79a7 --- /dev/null +++ b/impl/src/test/resources/org/apache/myfaces/component/search/search_myfaces4764.xhtml @@ -0,0 +1,35 @@ + + + + + + + + separator1 + + separator2 + + separator3 + + +