diff --git a/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java b/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java index ca994dc27..3cb880832 100644 --- a/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java +++ b/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java @@ -537,8 +537,8 @@ public void invokeContextCallback(FacesContext context, UIComponent target) // At this point if the algorithm hasn't returned and the topExpression does not have any separator char // we need to do the search backward using findComponent. if (target == null - && searchExpressionContext.getSource() == previous - && (topExpression.indexOf(separatorChar) == -1) ) + && searchExpressionContext.getSource() == previous + && (topExpression.indexOf(separatorChar + "@") == -1) ) // updated for MYFACES-4695 { UIComponent baseNC = previous.getNamingContainer(); if (baseNC != null && baseNC.getParent() != null) 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 5c1777ff8..77ae38a75 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 @@ -410,6 +410,24 @@ public void testIsPassthroughExpression() throws Exception Assert.assertFalse(handler.isPassthroughExpression(searchContextWithAjaxResolve, "@form:@child(0)")); } + @Test + public void testMyFaces4695() throws Exception + { + startViewRequest("/search2.xhtml"); + processLifecycleExecute(); + executeBeforeRender(); + executeBuildViewCycle(); + + SearchExpressionContext searchContext = + SearchExpressionContext.createSearchExpressionContext(facesContext, facesContext.getViewRoot().findComponent("form2:submit")); + + SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler(); + + Assertions.assertEquals("form1:one", handler.resolveClientId(searchContext, "form1:one")); + + processRemainingPhases(); + } + /* @Test public void testCompositeComponentExpression() throws Exception diff --git a/impl/src/test/resources/org/apache/myfaces/component/search/search2.xhtml b/impl/src/test/resources/org/apache/myfaces/component/search/search2.xhtml new file mode 100644 index 000000000..187be74d0 --- /dev/null +++ b/impl/src/test/resources/org/apache/myfaces/component/search/search2.xhtml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + +