From: <asa...@us...> - 2013-10-04 20:41:17
|
Revision: 8591 http://sourceforge.net/p/htmlunit/code/8591 Author: asashour Date: 2013-10-04 20:41:11 +0000 (Fri, 04 Oct 2013) Log Message: ----------- JavaScript: .innerHTML to correctly process nested SVG elements. Issue 1548 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDocument.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElementTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-10-04 18:33:20 UTC (rev 8590) +++ trunk/htmlunit/src/changes/changes.xml 2013-10-04 20:41:11 UTC (rev 8591) @@ -8,6 +8,9 @@ <body> <release version="2.13" date="???" description="Bugfixes"> + <action type="fix" dev="asashour" issue="1548"> + JavaScript: .innerHTML to correctly process nested SVG elements. + </action> <action type="fix" dev="rbri"> Date.toUTCString and Date.toGMTString now returns the correct format in IE mode. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDocument.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDocument.java 2013-10-04 18:33:20 UTC (rev 8590) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDocument.java 2013-10-04 20:41:11 UTC (rev 8591) @@ -287,9 +287,8 @@ * {@inheritDoc} */ @Override - @SuppressWarnings("unchecked") - public DomNode getDomNodeOrNull() { - DomNode node = super.getDomNodeOrNull(); + public <N extends DomNode> N getDomNodeOrNull() { + N node = super.getDomNodeOrNull(); if (node == null) { node = getDomNodeOrNullFromRealDocument(); } @@ -306,8 +305,8 @@ * * @return the real document's DOM node, or <tt>null</tt> if we're not emulating IE */ - private DomNode getDomNodeOrNullFromRealDocument() { - DomNode node = null; + private <N extends DomNode> N getDomNodeOrNullFromRealDocument() { + N node = null; // don't use getBrowserVersion() here because this is called // from getBrowserVersion() and will endless loop final boolean ie = getWindow().getWebWindow().getWebClient().getBrowserVersion().hasFeature(GENERATED_51); Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2013-10-04 18:33:20 UTC (rev 8590) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2013-10-04 20:41:11 UTC (rev 8591) @@ -929,11 +929,12 @@ buffer.append(s); } else if (html) { - final HtmlElement element = (HtmlElement) node; - final HTMLElement scriptObject = (HTMLElement) node.getScriptObject(); + final DomElement element = (DomElement) node; + final Element scriptObject = (Element) node.getScriptObject(); final boolean isUpperCase = getBrowserVersion().hasFeature(HTMLELEMENT_OUTER_HTML_UPPER_CASE); String tag = element.getTagName(); - if (isUpperCase && !scriptObject.isLowerCaseInOuterHtml()) { + if (isUpperCase && scriptObject instanceof HTMLElement + && !((HTMLElement) scriptObject).isLowerCaseInOuterHtml()) { tag = tag.toUpperCase(Locale.ENGLISH); } buffer.append("<").append(tag); @@ -958,7 +959,7 @@ buffer.append(">"); // Add the children. printChildren(buffer, node, html); - if (!scriptObject.isEndTagForbidden()) { + if (!(scriptObject instanceof HTMLElement) || !((HTMLElement) scriptObject).isEndTagForbidden()) { buffer.append("</").append(tag).append(">"); } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElementTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElementTest.java 2013-10-04 18:33:20 UTC (rev 8590) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElementTest.java 2013-10-04 20:41:11 UTC (rev 8591) @@ -4652,4 +4652,32 @@ loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = "<svg id=\"svgElem2\"></svg>", IE = "undefined") + public void innerHTML_svg() throws Exception { + final String html = "<html>\n" + + "<head>\n" + + " <script>\n" + + " function test() {\n" + + " var div = document.createElement('div');\n" + + " document.body.appendChild(div);\n" + + " if (document.createElementNS) {\n" + + " var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n" + + " svg.setAttribute('id', 'svgElem2');\n" + + " div.appendChild(svg);\n" + + " alert(div.innerHTML);\n" + + " } else {\n" + + " alert('undefined');\n" + + " }\n" + + " }\n" + + " </script>\n" + + "</head><body onload='test()'>\n" + + "</body></html>"; + + loadPageWithAlerts2(html); + } } |