[ https://issues.apache.org/jira/browse/MYFACES-4658?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17833656#comment-17833656 ]
Volodymyr Siedlecki commented on MYFACES-4658: ---------------------------------------------- [~werpu] I'm not sure what the correct logic is here, so I'll assign this to you. > faces.util.chain behavior changed > --------------------------------- > > Key: MYFACES-4658 > URL: https://issues.apache.org/jira/browse/MYFACES-4658 > Project: MyFaces Core > Issue Type: Bug > Affects Versions: 4.0.2 > Reporter: Volodymyr Siedlecki > Priority: Major > > Given the following generated HTML, an alert will occur. If you click OK, it > will perform an action on a backing bean. However, if you cancel, it should > not. > {code:java} > <input type="submit" value="Test" onclick="return faces.util.chain(this, > event,function(event){return confirm('Please Confirm');});">{code} > On Faces 3.0, if cancel is pressed, then the backing bean is not invoked. On > Faces 4.0, however, pressing cancel *does* invoke the bean. > Faces 3.0: > jsf.util.chain snippet: > {noformat} > if (FUNC == typeof arguments[cnt]) { > ret = arguments[cnt].call(source, event); > } else { > //either a function or a string can be passed in case of a > string we have to wrap it into another function > ret = new Function("event", arguments[cnt]).call(source, > event); > } > //now if one function returns false in between we stop the > execution of the cycle > //here, note we do a strong comparison here to avoid constructs > like 'false' or null triggering > if (ret === false /*undefined check implicitly done here by using > a strong compare*/) { > return false; > } > }{noformat} > Faces 4.0: > {noformat} > function chain(source, event, ...funcs) { > // we can use our lazy stream each functionality to run our chain > here. > // by passing a boolean as return value into the onElem call > // we can stop early at the first false, just like the spec requests > let ret; > funcs.every(func => { > let returnVal = resolveAndExecute(source, event, func); > if (returnVal !== false) { > ret = returnVal; > } > return returnVal !== false; > }); > return ret; > }{noformat} > It looks like conditions changed here? "ret === false" became "returnVal !== > false" ? If cancel is pressed, false is returned, which means the chain > function returns false in 3.0. In faces 4.0, ret is never set, so undefined > is returned. -- This message was sent by Atlassian Jira (v8.20.10#820010)