From: <asa...@us...> - 2012-11-21 10:25:38
|
Revision: 7751 http://sourceforge.net/p/htmlunit/code/7751 Author: asashour Date: 2012-11-21 10:25:36 +0000 (Wed, 21 Nov 2012) Log Message: ----------- JavaScript: element.outerHTML should throw an error if the provided value closes the parent. Issue 1452 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml 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 2012-11-21 07:47:01 UTC (rev 7750) +++ trunk/htmlunit/src/changes/changes.xml 2012-11-21 10:25:36 UTC (rev 7751) @@ -8,6 +8,9 @@ <body> <release version="2.12" date="???" description="Bugfixes"> + <action type="fix" dev="asashour" issue="1452"> + JavaScript: element.outerHTML should throw an error if the provided value closes the parent. + </action> <action type="fix" dev="asashour"> JavaScript: element.outerHTML should not print end tag if it is forbidden. </action> 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 2012-11-21 07:47:01 UTC (rev 7750) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2012-11-21 10:25:36 UTC (rev 7751) @@ -66,6 +66,7 @@ import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.cyberneko.html.HTMLElements; import org.w3c.css.sac.CSSException; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; @@ -1033,8 +1034,26 @@ throw Context.reportRuntimeError("outerHTML is read-only for tag " + domNode.getNodeName()); } - final DomNode proxyNode = new ProxyDomNode(domNode.getPage(), domNode, false); - parseHtmlSnippet(proxyNode, false, value); + final DomDocumentFragment fragment = (DomDocumentFragment) domNode.getPage().createDocumentFragment(); + parseHtmlSnippet(fragment, false, value); + DomNode child = fragment.getFirstChild(); + if (child instanceof DomElement) { + final String parentName = domNode.getParentNode().getNodeName().toUpperCase(); + final short[] closes = HTMLElements.getElement(child.getNodeName()).closes; + if (closes != null) { + for (final short close : closes) { + if (HTMLElements.getElement(close).name.equals(parentName)) { + throw Context.reportRuntimeError("outerHTML can not set '" + value + + "' while its parent is " + domNode.getParentNode()); + } + } + } + } + + while (child != null) { + domNode.insertBefore(child); + child = fragment.getFirstChild(); + } domNode.remove(); } 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 2012-11-21 07:47:01 UTC (rev 7750) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElementTest.java 2012-11-21 10:25:36 UTC (rev 7751) @@ -915,7 +915,6 @@ "New = <span id=\"innerNode\">Old outerHTML</span>" }, FF = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <span id=\"innerNode\">Old outerHTML</span>" }) - @NotYetImplemented(IE) public void setOuterHTMLAddBlockToParagraph() throws Exception { final String html = createPageForSetOuterHTML("p", "<div>test</div>"); loadPageWithAlerts2(html); @@ -932,7 +931,6 @@ "New = <span id=\"innerNode\">Old outerHTML</span>" }, FF = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <span id=\"innerNode\">Old outerHTML</span>" }) - @NotYetImplemented(IE) public void setOuterHTMLAddParagraphToParagraph() throws Exception { final String html = createPageForSetOuterHTML("p", "<p>test</p>"); loadPageWithAlerts2(html); @@ -964,7 +962,6 @@ "New = <span id=\"innerNode\">Old outerHTML</span>" }, FF = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <span id=\"innerNode\">Old outerHTML</span>" }) - @NotYetImplemented(IE) public void setOuterHTMLAddAnchorToAnchor() throws Exception { final String html = createPageForSetOuterHTML("a", "<a>test</a>"); loadPageWithAlerts2(html); |