Hi,
Here's the response from Roger on my request for an enhancement of the
JSF 2.0 spec.
Best Regards,
Ganesh
-------- Original-Nachricht --------
Betreff: Re: jsdoc spec enhancement request from MyFaces 2.0
development team
Datum: Tue, 21 Apr 2009 09:02:27 -0400
Von: Roger Kitain <[email protected]>
An: Ganesh <[email protected]>
CC: [email protected]
Referenzen: <[email protected]> <[email protected]>
<[email protected]> <[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Hey Ganesh -
Thanks so much for the excellent comments. I agree with the assessment
of the javax.faces.ViewState problem, as well
as I know there is some history. I believe both Mojarra and MyFaces
have a workaround for the rendering of this field.
I am ok with relaxing the spec language to focus on the "name" attribute
of the javax.faces.ViewState field as you suggest
below. At this stage that may me the best solution. I am happy to see
another implementation of the JSF 2.0 Ajax
specification in development.
Regards, Roger.
Ganesh wrote:
Hi,
When developing the AJAX part of MyFaces 2.0 we encountered 2
locations within the jsdoc part of the spec we'd propose for enhancement.
The first is about the hidden inputs for view state: The jsdocs for
jsf.ajax.response imply that each hidden input receives the id
"javax.faces.ViewState" which would result in multiple hidden inputs
with this id in a multi form document. This is how Mojarra is
currently working things out, but other implementations should get a
chance to use a w3c conformant approach - the hidden inputs don't need
ids at all, but only name=javax.faces.ViewState. A comment on this was
already posted by Werner Punz.
The second is about replacing the body section of a document if the
server sends the id javax.faces.ViewRoot: The jsdocs for
jsf.ajax.response say that the impl should >>extract the contents of
the <body> element from the <update> element's CDATA content and
replace the document's <body> section with this contents<<. According
to this the attributes of the body element wouldn't be replaced with
the new attributes, which probably isn't the intended behaviour.
Preserving the attributes can either be achieved by copying them or by
using contextualRagen/adjacentHTML instead of innerHTML.
Here is a proposal for changing the jsdocs for jsf.ajax.response to
enable both enhancements mentioned above - please correct the jsdoc
for <static> jsf.ajax.response(request, context)
like this:
If an update element is found in the response with the identifier
javax.faces.ViewRoot:
<update id="javax.faces.ViewRoot">
<![CDATA[...]]>
</update>
Update the entire DOM as follows:
* Extract the CDATA content and trim the <html> and </html> from
the CDATA content if it is present.
<<<<<<< (remove the following lines)
* If the CDATA content contains a <head> element, and the document
has a <head> section, extract the contents of the <head> element from
the <update> element's CDATA content and replace the document's <head>
section with this contents.
* If the CDATA content contains a <body> element, and the document
has a <body> section, extract the contents of the <body> element from
the <update> element's CDATA content and replace the document's <body>
section with this contents.
======= (add the following lines)
* If the CDATA content contains a <head> element, and the document
has a <head> section, replace the document's <head> section with the
<head> section contained within the CDATA content.
* If the CDATA content contains a <body> element, and the document
has a <body> section, replace the document's <body> section with the
<body> section contained within the CDATA content.
>>>>>>>
* If the CDATA content does not contain a <body> element, replace
the document's <body> section with the CDATA contents.
If an update element is found in the response with the identifier
javax.faces.ViewState:
<update id="javax.faces.ViewState">
<![CDATA[...]]>
</update>
Include this state in the document as follows:
* Extract this <update> element's CDATA contents from the response.
<<<<<< (remove the following lines)
* If the document contains an element with the identifier
javax.faces.ViewState replace its contents with the CDATA
contents.
* For each <form> element in the document:
o If the <form> element contains an <input> element with
the identifier javax.faces.ViewState, replace the
<input> element contents with the <update> element's
CDATA contents.
o If the <form> element does not contain an element with the
identifier javax.faces.ViewState, create an <input>
element of the type hidden, with the identifier
javax.faces.ViewState, set its contents to the <update>
element's CDATA contents, and add the <input> element as
a child to the <form> element.
======= (add the following lines)
* Set the value of all elements within the document with the name
javax.faces.ViewState to the CDATA contents
* Perform the following optionally, implementations my omit this to
enhance performance, as it enforces a search within the DOM tree. For
each <form> element in the document:
o If the <form> element does not contain an element with the
name javax.faces.ViewState, create an <input> element of
the type hidden, with the name javax.faces.ViewState,
set its value to the <update> element's CDATA contents,
and add the <input> element as a child to the <form>
element.
Best Regards,
Ganesh Jung