blob: fc856309dd7c57f6d670995db0c8ab5df9ed90a8 [file] [log] [blame]
2005-04-03 Juergen Donnerstag
Once we introduced wicket namespace to handle wicket tags and attributes
like <wicket:link ..> and <a wicket:id="myLabel" ..> wicket-example tests
failed. Tracing the error down through jWebUnit and HttpUnit I found that
HttpUnit calls ParseHTML.getDOM() for each assertXXX() like test. getDOM()
calls Node.cloneNode( /* deep */ true) to make a copy of the DOM tree
(obviously to protected the DOM against accidental changes). As Xerces-2.6.2
is the underlying XML implementation, the Xerces2 implementation of cloneNode()
gets called. And cloneNode() is causing all the problems. From my point the
cloneNode() (resp. importNode) implementation has several bugs with respect to
namespaces (though I have not studied the xml spec in detail).
a) cloneNode() first creates an empty Document but does not copy the
strictErrorHandling() attribute from the original document. As default
for this attribute is true, strict error handling is always enable
during clone node and there is no way to disable it.
Because html with namespace is not valid xml and since we do not have a
xhtml + wicket DTD, wicket's output with wicket namespace is non-valid xml.
(of course you can strip wicket tags and attrs from output, but for
debugging purposes you'll still need it). Thus Xerces throws a
NAMESPACE_ERR exception. In order to circumvent that problem I copied
the HtmlDocumentImpl.java and changed cloneNode() to always disable
error handling while cloning.
b) Unfortunately cloneNode() still didn't work. Tags like
<span wicket:id="myLabel" id="xxxx"> failed. The clone always looked
like <span wicket:id="myLabel"> and id="xxxx" was swallowed. The reason,
again, was not 100% compliant XML. The wicket attribute did not have a namespace
URI (though I specific <html xmlns:wicket="http://...") and thus the
namespace was simply neglected. Because it was neglected Xerces now
thinks that wicket:id == id and simply replaces the first occurence
with the second. The outcome was that always on attribute was swallowed.
Because 2.6.2 is the newest version but has been available for more than
a year, I checked the current CVS head as well. The problems however
still seem to be there.
As I didn't find a better solution I eventually made a "local" copy of
HttpUnit:ParsedHTML.java and modified getDOM() to not make copy but to
use the original DOM tree.
I'm not even sure a XHTML + Wicket DTD will solve our problem completely.
The reason being that ALL wicket markup must than be XHTML compliant.
As plain (old) HTML however should still be supported ...
In case anyone reads this and nows a better solution, please let me know.