You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Volodymyr Siedlecki (Jira)" <de...@myfaces.apache.org> on 2024/04/03 15:59:00 UTC
[jira] [Created] (MYFACES-4658) faces.util.chain behavior changed
Volodymyr Siedlecki created MYFACES-4658:
--------------------------------------------
Summary: 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
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)