From: <rb...@us...> - 2014-02-27 18:43:44
|
Revision: 9147 http://sourceforge.net/p/htmlunit/code/9147 Author: rbri Date: 2014-02-27 18:43:40 +0000 (Thu, 27 Feb 2014) Log Message: ----------- Fix our implementation of innerText for table elements Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableRowElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableSectionElement.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableElementTest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableRowElementTest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableSectionElementTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-02-27 06:50:50 UTC (rev 9146) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-02-27 18:43:40 UTC (rev 9147) @@ -1093,6 +1093,10 @@ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_INNER_HTML_REDUCE_WHITESPACES, + /** Indicates that innerText is readonly for tables. */ + @BrowserFeature(@WebBrowser(CHROME)) + JS_INNER_TEXT_READONLY_FOR_TABLE, + /** Javascript function returning a length (e.g. getWidth) without 'px' at the end. */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 10)) JS_LENGTH_WITHOUT_PX, Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableElement.java 2014-02-27 06:50:50 UTC (rev 9146) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableElement.java 2014-02-27 18:43:40 UTC (rev 9147) @@ -15,6 +15,7 @@ package com.gargoylesoftware.htmlunit.javascript.host.html; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_INNER_HTML_READONLY_FOR_SOME_TAGS; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_INNER_TEXT_READONLY_FOR_TABLE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures. JS_TABLE_SET_CAPTION_ALTHOUGH_ALREADY_SET_THROWS_ERROR; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_TABLE_SET_TFOOT_ALTHOUGH_ALREADY_SET_THROWS_ERROR; @@ -395,6 +396,9 @@ */ @Override protected void setInnerTextImpl(final String value) { - throw Context.reportRuntimeError("innerText is read-only for tag 'table'"); + if (getBrowserVersion().hasFeature(JS_INNER_TEXT_READONLY_FOR_TABLE)) { + throw Context.reportRuntimeError("innerText is read-only for tag 'table'"); + } + super.setInnerTextImpl(value); } } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableRowElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableRowElement.java 2014-02-27 06:50:50 UTC (rev 9146) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableRowElement.java 2014-02-27 18:43:40 UTC (rev 9147) @@ -16,6 +16,7 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.GENERATED_172; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_INNER_HTML_READONLY_FOR_SOME_TAGS; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_INNER_TEXT_READONLY_FOR_TABLE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_TABLE_ROW_SECTION_INDEX_BIG_INT_IF_UNATTACHED; import java.util.ArrayList; @@ -221,6 +222,9 @@ */ @Override protected void setInnerTextImpl(final String value) { - throw Context.reportRuntimeError("innerText is read-only for tag 'tr'"); + if (getBrowserVersion().hasFeature(JS_INNER_TEXT_READONLY_FOR_TABLE)) { + throw Context.reportRuntimeError("innerText is read-only for tag 'tr'"); + } + super.setInnerTextImpl(value); } } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableSectionElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableSectionElement.java 2014-02-27 06:50:50 UTC (rev 9146) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableSectionElement.java 2014-02-27 18:43:40 UTC (rev 9147) @@ -15,6 +15,7 @@ package com.gargoylesoftware.htmlunit.javascript.host.html; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_INNER_HTML_READONLY_FOR_SOME_TAGS; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_INNER_TEXT_READONLY_FOR_TABLE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_TABLE_VALIGN_SUPPORTS_IE_VALUES; import net.sourceforge.htmlunit.corejs.javascript.Context; @@ -153,7 +154,10 @@ */ @Override protected void setInnerTextImpl(final String value) { - throw Context.reportRuntimeError("innerText is read-only for tag '" - + getDomNodeOrDie().getNodeName() + "'"); + if (getBrowserVersion().hasFeature(JS_INNER_TEXT_READONLY_FOR_TABLE)) { + throw Context.reportRuntimeError("innerText is read-only for tag '" + + getDomNodeOrDie().getNodeName() + "'"); + } + super.setInnerTextImpl(value); } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableElementTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableElementTest.java 2014-02-27 06:50:50 UTC (rev 9146) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableElementTest.java 2014-02-27 18:43:40 UTC (rev 9147) @@ -643,4 +643,33 @@ + "</html>"; loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "undefined", "[object Text]", "abc", "[object Text]", "" }, + CHROME = {"cell1", "[object Text]", "ex", "cell1", "[object Text]", "ex", "cell1" }, + IE8 = { "cell1", "[object]", "abc", "[object]", "" }, + IE11 = { "cell1", "[object Text]", "abc", "[object Text]", "" }) + public void innerText() throws Exception { + final String html + = "<html><body>\n" + + " <table id='tab'>\n" + + " <tr><td>cell1</td></tr>\n" + + " </table>\n" + + "<script>\n" + + " var node = document.getElementById('tab');\n" + + " alert(node.innerText);\n" + + " alert(node.firstChild);\n" + + + " try { node.innerText = 'abc'; } catch(e) {alert('ex');}\n" + + " alert(node.innerText);\n" + + " alert(node.firstChild);\n" + + + " try { node.innerText = ''; } catch(e) {alert('ex');}\n" + + " alert(node.innerText);\n" + + "</script></body></html>"; + loadPageWithAlerts2(html); + } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableRowElementTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableRowElementTest.java 2014-02-27 06:50:50 UTC (rev 9146) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableRowElementTest.java 2014-02-27 18:43:40 UTC (rev 9147) @@ -348,4 +348,34 @@ + "</body></html>"; loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "undefined", "[object HTMLTableCellElement]", "abc", "[object HTMLTableCellElement]", "" }, + CHROME = {"cell1", "[object HTMLTableCellElement]", + "ex", "cell1", "[object HTMLTableCellElement]", "ex", "cell1" }, + IE8 = { "cell1", "[object]", "abc", "[object]", "" }, + IE11 = { "cell1", "[object HTMLTableDataCellElement]", "abc", "[object Text]", "" }) + public void innerText() throws Exception { + final String html + = "<html><body>\n" + + " <table>\n" + + " <tr id='tab_row'><td>cell1</td></tr>\n" + + " </table>\n" + + "<script>\n" + + " var node = document.getElementById('tab_row');\n" + + " alert(node.innerText);\n" + + " alert(node.firstChild);\n" + + + " try { node.innerText = 'abc'; } catch(e) {alert('ex');}\n" + + " alert(node.innerText);\n" + + " alert(node.firstChild);\n" + + + " try { node.innerText = ''; } catch(e) {alert('ex');}\n" + + " alert(node.innerText);\n" + + "</script></body></html>"; + loadPageWithAlerts2(html); + } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableSectionElementTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableSectionElementTest.java 2014-02-27 06:50:50 UTC (rev 9146) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableSectionElementTest.java 2014-02-27 18:43:40 UTC (rev 9147) @@ -39,7 +39,7 @@ * @throws Exception if an error occurs */ @Test - @Alerts(FF = {"", "hello", "left", "hi", "right" }, + @Alerts(DEFAULT = {"", "hello", "left", "hi", "right" }, IE = {"", "error", "", "left", "error", "left", "right" }) @NotYetImplemented({ FF17, FF24 }) public void align_thead() throws Exception { @@ -50,7 +50,7 @@ * @throws Exception if an error occurs */ @Test - @Alerts(FF = {"", "hello", "left", "hi", "right" }, + @Alerts(DEFAULT = {"", "hello", "left", "hi", "right" }, IE = {"", "error", "", "left", "error", "left", "right" }) @NotYetImplemented({ FF17, FF24 }) public void align_tbody() throws Exception { @@ -61,7 +61,7 @@ * @throws Exception if an error occurs */ @Test - @Alerts(FF = {"", "hello", "left", "hi", "right" }, + @Alerts(DEFAULT = {"", "hello", "left", "hi", "right" }, IE = {"", "error", "", "left", "error", "left", "right" }) @NotYetImplemented({ FF17, FF24 }) public void align_tfoot() throws Exception { @@ -109,7 +109,7 @@ * @throws Exception if an error occurs */ @Test - @Alerts(FF = { "top", "baseline", "3", "middle", "8", "BOTtom" }, + @Alerts(DEFAULT = { "top", "baseline", "3", "middle", "8", "BOTtom" }, IE = { "top", "baseline", "top", "error", "middle", "baseline", "bottom" }) @NotYetImplemented({ FF17, FF24 }) public void vAlign_thead() throws Exception { @@ -120,7 +120,7 @@ * @throws Exception if an error occurs */ @Test - @Alerts(FF = { "top", "baseline", "3", "middle", "8", "BOTtom" }, + @Alerts(DEFAULT = { "top", "baseline", "3", "middle", "8", "BOTtom" }, IE = { "top", "baseline", "top", "error", "middle", "baseline", "bottom" }) @NotYetImplemented({ FF17, FF24 }) public void vAlign_tbody() throws Exception { @@ -131,7 +131,7 @@ * @throws Exception if an error occurs */ @Test - @Alerts(FF = { "top", "baseline", "3", "middle", "8", "BOTtom" }, + @Alerts(DEFAULT = { "top", "baseline", "3", "middle", "8", "BOTtom" }, IE = { "top", "baseline", "top", "error", "middle", "baseline", "bottom" }) @NotYetImplemented({ FF17, FF24 }) public void vAlign_tfoot() throws Exception { @@ -369,4 +369,94 @@ + "</body></html>"; loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "undefined", "[object HTMLTableRowElement]", "abc", "[object HTMLTableRowElement]", "" }, + CHROME = {"cell1", "[object HTMLTableRowElement]", + "ex", "cell1", "[object HTMLTableRowElement]", "ex", "cell1" }, + IE8 = { "cell1", "[object]", "abc", "[object]", "" }, + IE11 = { "cell1", "[object HTMLTableRowElement]", "abc", "[object Text]", "" }) + public void innerText_body() throws Exception { + final String html + = "<html><body>\n" + + " <table>\n" + + " <tbody id='tab_row'><tr><td>cell1</td></tr></tbody>\n" + + " </table>\n" + + "<script>\n" + + " var node = document.getElementById('tab_row');\n" + + " alert(node.innerText);\n" + + " alert(node.firstChild);\n" + + + " try { node.innerText = 'abc'; } catch(e) {alert('ex');}\n" + + " alert(node.innerText);\n" + + " alert(node.firstChild);\n" + + + " try { node.innerText = ''; } catch(e) {alert('ex');}\n" + + " alert(node.innerText);\n" + + "</script></body></html>"; + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "undefined", "[object HTMLTableRowElement]", "abc", "[object HTMLTableRowElement]", "" }, + CHROME = {"cell1", "[object HTMLTableRowElement]", + "ex", "cell1", "[object HTMLTableRowElement]", "ex", "cell1" }, + IE8 = { "cell1", "[object]", "abc", "[object]", "" }, + IE11 = { "cell1", "[object HTMLTableRowElement]", "abc", "[object Text]", "" }) + public void innerText_header() throws Exception { + final String html + = "<html><body>\n" + + " <table>\n" + + " <thead id='tab_row'><tr><td>cell1</td></tr></thead>\n" + + " </table>\n" + + "<script>\n" + + " var node = document.getElementById('tab_row');\n" + + " alert(node.innerText);\n" + + " alert(node.firstChild);\n" + + + " try { node.innerText = 'abc'; } catch(e) {alert('ex');}\n" + + " alert(node.innerText);\n" + + " alert(node.firstChild);\n" + + + " try { node.innerText = ''; } catch(e) {alert('ex');}\n" + + " alert(node.innerText);\n" + + "</script></body></html>"; + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "undefined", "[object HTMLTableRowElement]", "abc", "[object HTMLTableRowElement]", "" }, + CHROME = {"cell1", "[object HTMLTableRowElement]", + "ex", "cell1", "[object HTMLTableRowElement]", "ex", "cell1" }, + IE8 = { "cell1", "[object]", "abc", "[object]", "" }, + IE11 = { "cell1", "[object HTMLTableRowElement]", "abc", "[object Text]", "" }) + public void innerText_footer() throws Exception { + final String html + = "<html><body>\n" + + " <table>\n" + + " <tfoot id='tab_row'><tr><td>cell1</td></tr></tfoot>\n" + + " </table>\n" + + "<script>\n" + + " var node = document.getElementById('tab_row');\n" + + " alert(node.innerText);\n" + + " alert(node.firstChild);\n" + + + " try { node.innerText = 'abc'; } catch(e) {alert('ex');}\n" + + " alert(node.innerText);\n" + + " alert(node.firstChild);\n" + + + " try { node.innerText = ''; } catch(e) {alert('ex');}\n" + + " alert(node.innerText);\n" + + "</script></body></html>"; + loadPageWithAlerts2(html); + } } |