Details
-
Type:
Bug
-
Status: Closed
-
Priority:
Major
-
Resolution: Fixed
-
Affects Version/s: 3.0.RC1
-
Fix Version/s: 3.0.1, EE-3.0.0.GA
-
Component/s: Framework
-
Labels:None
-
Environment:Tomcat 7.0.12
ICEfaces 3RC1a
Description
When an attempt is made to set back to '0' the following response comes back in the console:
<?xml version='1.0' encoding='UTF-8'?>
<partial-response><changes><update id="javax.faces.ViewState"><![CDATA[574103076592712092:7902382816915448980]]></update><eval><![CDATA[alert('Invalid Cycle');]]></eval><extension aceCallbackParam="validationFailed">{"validationFailed":false}</extension></changes></partial-response>
When the value is not set to '0', the component updates as expected.
Attached is a war file and source code for a test case.
-
Hide
- Test_war_exploded.war
- 7.55 MB
- Brad Kroeger
-
- WEB-INF/classes/BackingBean.class 2 kB
- WEB-INF/lib/icefaces-ace.jar 1.39 MB
- WEB-INF/lib/icefaces-compat.jar 2.34 MB
- WEB-INF/lib/icefaces.jar 267 kB
- WEB-INF/.../krysalis-jCharts-1.0.0-alpha-1.jar 151 kB
- WEB-INF/lib/commons-beanutils.jar 226 kB
- WEB-INF/lib/commons-collections.jar 558 kB
- WEB-INF/lib/jstl.jar 20 kB
- WEB-INF/lib/jxl.jar 708 kB
- WEB-INF/lib/commons-digester.jar 140 kB
- WEB-INF/lib/commons-logging.jar 52 kB
- WEB-INF/lib/javax.faces.jar 2.46 MB
- WEB-INF/faces-config.xml 0.3 kB
- WEB-INF/web.xml 3 kB
- index.jsp 0.0 kB
- test.xhtml 3 kB
- META-INF/MANIFEST.MF 0.0 kB
-
- Test.zip
- 4 kB
- Brad Kroeger
-
Hide
- Test2.zip
- 5 kB
- Ted Goddard
-
- Test/src/BackingBean.java 1 kB
- Test/Test.iml 1.0 kB
- Test/web/index.jsp 0.0 kB
- Test/web/META-INF/MANIFEST.MF 0.0 kB
- Test/web/test.xhtml 3 kB
- Test/web/WEB-INF/faces-config.xml 0.3 kB
- Test/web/WEB-INF/web.xml 3 kB
Activity
- All
- Comments
- History
- Activity
- Remote Attachments
- Subversion
Start off with seeing what's going on in:
org.icefaces.impl.context.DOMPartialViewContext.applyBrowserChanges(Map parameters, Document document)
The problem was in the method I had thought, but the reason was completely different than I had anticipated. Basically, there was no omission in the select and option node processing code. Rather, for Mojarra, but not MyFaces, the h:selectOneMenu rendering does not follow the standard ResponseWriter APIs of opening and closing tags, which our DOMResponseWriter uses to build DOM nodes. Instead, they have a performance optimisation where they render into a String buffer, and then write that out as text. So what we have in our dom is a Text node, which does not allow for proper applyBrowserChanges processing.
We contemplated overriding the renderer to allow for proper dom adhering output, but that would have involved overriding a lot of renderer code, that would then need to be maintained. Instead, I thought of a solution whereby we parse the text node, derive the nodes, update the nodes with the typical applyBrowserChanges processing, and then update the actual dom with the new nodes. The idea beig that code path would only execute under very specific circumstances, and wouldn't affect anything else, and would be easy to make a regression test for, since we have the one for this jira.
One snag I ran into, was I had assumed that I would import the new nodes into our dom, and had that code functioning, but then the dom difference was between nodes and the always rendered text node. So I then printed out the nodes into a string, and updated the text node with that string. There was some effort in getting the whitespace to render properly and similarly.
There's still a lingering aspect, which I believe we can safely ignore. Our option node updating code outputs W3C compatible markup, which is <option selected="selected"> whereas Mojarra h:selectOneMenu rendering gives <option selected="true">. So in theory we can get false positives in our dom difference, and update more of the page than necessary. But the real bug is failing to update what has changed, so it's not a real problem.
trunk
27937
icefaces-3.0.x-maintenance
27938
Re-opened due to regressions.
Arran McCullough: Throws SAXParseExceptions with customer application.
All browsers and this doctype: <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
I think it might be related to them using & in the selectItem label.
— Ken Fyten:
I've reverted this commit on ossrepo/icefaces3/branches/icefaces-3.0.x-maintenance branch for EE 3 Beta release.
Also reverted on icefaces3/trunk: Committed revision 27993
Ideas to resolve:
- Use HTML DOM if available in JDK.
- Experiment with DOCtypes for DOM
- Add entity characters to DOM
- Use regular expression or other technique to replace entity chars in the string.
Can see the issue with the following code:
<h:selectOneMenu id="testMenu"
value="#
">
<f:selectItem itemValue="1" itemLabel="One & One"/>
<f:selectItem itemValue="2" itemLabel="Two and Two"/>
</h:selectOneMenu>
Since the DOM parser version changes the order of value="" and selected="", it is essentially guaranteed to modify the TextNode for any interaction with the component, thereby forcing an update of that component.
Modified Test2.zip to include ampersand markup as well as changed the test logic to accept a selection of "3" (this allows the testing of changed input values that should not result in a page update).
Regex implementation checked in but not verified with multiple select cases. The previous intermediate-DOM based version could not be repaired due to the output differences between the original component and the intermediate DOM output.
The encodeEnd() method of MenuRenderer which makes use of FastStringWriter to embed the text node in the DOM does allow for a "multiple" select option.
Source code