GWT 2.4 included a custom copy of htmlunit, apparently built from rev 
5940[1] of the htmlunit's source - the following unit test passes under 
that version using the com.google.gwt.xml.XML module:

  public void testSelectElement() {
    String xml = "<root><child></child><child /><child 
attr='value'>contents</child><other /></root>";
    Document doc = XMLParser.parse(xml);
    NodeList children = 
doc.getDocumentElement().getElementsByTagName("child");// works
    assertEquals(3, children.getLength());

    NodeList all = doc.getDocumentElement().getElementsByTagName("*");// 
fails
    assertEquals(4, all.getLength());//child x3 + other
  }

The method getElementsByTagName is implemented by 
XMLParserImplStandard.getElementsByTagNameImpl(JavaScriptObject, String), 
which invokes o.getElementsByTagNameNS("*",tagName); in JSNI, resulting in 
o.getElementsByTagNameNS("*","*") in the failing case. This works in all 
real browsers (that would use that impl), and in the 2.4.0 copy of htmlunit.

In the GWT 2.5.0-rc1 -dev jar, this has been updated to the 1.9 release[2], 
which no longer passes this test case. I've noticed that there is an extra 
patch for 1.9 that modifies document.getElementsByTagNameNS[3], but this 
apparently doesn't affect the case where getElementsByTagNameNS is invoked 
on an element (or the fix is for something else altogether). Based on my 
quick testing, it isn't possible to load both gwt-dev 2.5.0-rc1 and 
htmlunit r5940 on the classpath to resolve this, as the GWT unit test code 
is now wiring up webClient.setJavaScriptErrorListener, and didn't do so in 
earlier GWT versions.

Is there an additional patch which can be applied to HtmlUnit to ensure 
that this behavior is the same in real/emulated browsers? Is there a 
cleaner way to detect that HtmlUnit is being used, to kick to another impl 
of such classes?

Tentative workaround for the actual case where this presented itself (the 
XML module was just a way to build a clear case of the issue) was to check 
if tagName was "*", and if so, invoke element.getElementsByTagName("*") 
instead.


[1] 
http://code.google.com/p/google-web-toolkit/source/browse/releases/2.4/dev/build.xml#101
[2] 
http://code.google.com/p/google-web-toolkit/source/browse/releases/2.5/dev/build.xml#102
[3] 
http://code.google.com/p/google-web-toolkit/source/browse/#svn%2Ftools%2Flib%2Fhtmlunit%2Fhtmlunit-2.9

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/google-web-toolkit/-/60xpTM7j7msJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to