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