From: <rb...@us...> - 2014-02-10 20:18:25
|
Revision: 9120 http://sourceforge.net/p/htmlunit/code/9120 Author: rbri Date: 2014-02-10 20:18:18 +0000 (Mon, 10 Feb 2014) Log Message: ----------- Property contentDocument (Frame/iFrame) is available in IE8 also Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLIFrameElement.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameElement2Test.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLIFrameElement3Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-02-09 20:16:44 UTC (rev 9119) +++ trunk/htmlunit/src/changes/changes.xml 2014-02-10 20:18:18 UTC (rev 9120) @@ -8,6 +8,9 @@ <body> <release version="2.14" date="???" description="FF24, Bugfixes, initial work on IE11"> + <action type="fix" dev="rbri"> + JavaScript: Property contentDocument (Frame/iFrame) is available in IE8 also. + </action> <action type="fix" dev="rbri" issue="1503"> GAEJavaScriptExecutor is public again but marked as part of the internal api. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameElement.java 2014-02-09 20:16:44 UTC (rev 9119) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameElement.java 2014-02-10 20:18:18 UTC (rev 9120) @@ -14,7 +14,6 @@ */ package com.gargoylesoftware.htmlunit.javascript.host.html; -import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; import com.gargoylesoftware.htmlunit.html.BaseFrameElement; @@ -52,7 +51,7 @@ * @return <code>null</code> if no document is contained * @see <a href="http://www.mozilla.org/docs/dom/domref/dom_frame_ref4.html">Gecko DOM Reference</a> */ - @JsxGetter({ @WebBrowser(FF), @WebBrowser(value = IE, minVersion = 11) }) + @JsxGetter public DocumentProxy getContentDocument() { return ((Window) getFrame().getEnclosedWindow().getScriptObject()).getDocument_js(); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLIFrameElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLIFrameElement.java 2014-02-09 20:16:44 UTC (rev 9119) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLIFrameElement.java 2014-02-10 20:18:18 UTC (rev 9120) @@ -14,7 +14,6 @@ */ package com.gargoylesoftware.htmlunit.javascript.host.html; -import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; import com.gargoylesoftware.htmlunit.html.BaseFrameElement; @@ -51,7 +50,7 @@ * @return <code>null</code> if no document is contained * @see <a href="http://www.mozilla.org/docs/dom/domref/dom_frame_ref4.html">Gecko DOM Reference</a> */ - @JsxGetter(@WebBrowser(FF)) + @JsxGetter public DocumentProxy getContentDocument() { return getContentWindow().getDocument_js(); } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameElement2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameElement2Test.java 2014-02-09 20:16:44 UTC (rev 9119) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameElement2Test.java 2014-02-10 20:18:18 UTC (rev 9120) @@ -67,20 +67,25 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = "true", - IE8 = "false") + @Alerts(DEFAULT = { "[object HTMLDocument]", "true" }, + IE8 = { "[object]", "true" }) public void contentDocument() throws Exception { final String html - = "<html><head><title>first</title>\n" - + "<script>\n" - + "function test() {\n" - + " alert(document.getElementById('myFrame').contentDocument == frames.foo.document);\n" - + "}\n" - + "</script></head>\n" - + "<frameset rows='*' onload='test()'>\n" - + "<frame name='foo' id='myFrame' src='about:blank'/>\n" - + "</frameset>\n" - + "</html>"; + = "<!DOCTYPE html>\n" + + "<html>\n" + + "<head>\n" + + " <title>first</title>\n" + + " <script>\n" + + " function test() {\n" + + " alert(document.getElementById('myFrame').contentDocument);\n" + + " alert(document.getElementById('myFrame').contentDocument == frames.foo.document);\n" + + " }\n" + + " </script>\n" + + "</head>\n" + + "<frameset rows='*' onload='test()'>\n" + + " <frame name='foo' id='myFrame' src='about:blank'/>\n" + + "</frameset>\n" + + "</html>"; loadPageWithAlerts2(html); } @@ -664,4 +669,39 @@ assertEquals(getExpectedAlerts()[4], driver.findElement(By.tagName("body")).getText()); } } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "localhost", "localhost", "localhost", "localhost" }) + public void domain() throws Exception { + final String html = "<html>\n" + + "<head>\n" + + " <title>OnloadTest</title>\n" + + " <script>\n" + + " function doTest() {\n" + + " alert(document.domain);\n" + + " alert(document.getElementById('left').contentWindow.document.domain);\n" + + " alert(document.getElementById('center').contentWindow.document.domain);\n" + + " alert(document.getElementById('right').contentWindow.document.domain);\n" + + " }\n" + + " </script>\n" + + "</head>\n" + + "<frameset cols='33%,33%,*' onLoad='doTest()'>\n" + + " <frame name='left' id='left' >\n" + + " <frame name='center' id='center' src='about:blank'>\n" + + " <frame name='right' id='right' src='left.html'>\n" + + "</frameset>\n" + + "</html>"; + + final String left = "<html><head><title>Left</title></head>\n" + + "<body>left</body>\n" + + "</html>"; + + getMockWebConnection().setResponse(new URL(URL_FIRST, "left.html"), left); + + loadPageWithAlerts2(html); + assertEquals(2, getMockWebConnection().getRequestCount()); + } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLIFrameElement3Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLIFrameElement3Test.java 2014-02-09 20:16:44 UTC (rev 9119) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLIFrameElement3Test.java 2014-02-10 20:18:18 UTC (rev 9120) @@ -26,7 +26,6 @@ import com.gargoylesoftware.htmlunit.BrowserRunner; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; -import com.gargoylesoftware.htmlunit.BrowserRunner.Browsers; import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; import com.gargoylesoftware.htmlunit.MockWebConnection; import com.gargoylesoftware.htmlunit.WebDriverTestCase; @@ -51,7 +50,8 @@ @Alerts("false") public void style() throws Exception { final String html - = "<html><head><title>First</title><script>\n" + = "<!DOCTYPE html>\n" + + "<html><head><title>First</title><script>\n" + "function doTest() {\n" + " alert(document.getElementById('myIFrame').style == undefined);\n" + "}\n</script></head>\n" @@ -67,7 +67,8 @@ @Alerts({ "1", "myIFrame" }) public void referenceFromJavaScript() throws Exception { final String html - = "<html><head><title>First</title><script>\n" + = "<!DOCTYPE html>\n" + + "<html><head><title>First</title><script>\n" + "function doTest() {\n" + " alert(window.frames.length);\n" + " alert(window.frames['myIFrame'].name);\n" @@ -85,7 +86,8 @@ @Alerts({ "about:blank", "about:blank" }) public void directAccessPerName() throws Exception { final String html - = "<html><head><title>First</title><script>\n" + = "<!DOCTYPE html>\n" + + "<html><head><title>First</title><script>\n" + "function doTest() {\n" + " alert(myIFrame.location);\n" + " alert(Frame.location);\n" @@ -105,12 +107,14 @@ @Alerts("IFRAME") public void onLoadGetsIFrameElementByIdInParent() throws Exception { final String firstContent - = "<html><head><title>First</title></head>\n" + = "<!DOCTYPE html>\n" + + "<html><head><title>First</title></head>\n" + "<body>\n" + "<iframe id='myIFrame' src='frame.html'></iframe></body></html>"; final String frameContent - = "<html><head><title>Frame</title><script>\n" + = "<!DOCTYPE html>\n" + + "<html><head><title>Frame</title><script>\n" + "function doTest() {\n" + " alert(parent.document.getElementById('myIFrame').tagName);\n" + "}\n</script></head>\n" @@ -129,19 +133,24 @@ * @throws Exception if the test fails */ @Test - @Browsers(FF) - @Alerts(FF = "true") + @Alerts(DEFAULT = { "[object HTMLDocument]", "true" }, + IE8 = { "[object]", "true" }) public void contentDocument() throws Exception { final String html - = "<html><head><title>first</title>\n" - + "<script>\n" - + "function test() {\n" - + " alert(document.getElementById('myFrame').contentDocument == frames.foo.document);\n" - + "}\n" - + "</script></head>\n" - + "<body onload='test()'>\n" - + "<iframe name='foo' id='myFrame' src='about:blank'></iframe>\n" - + "</body></html>"; + = "<!DOCTYPE html>\n" + + "<html>\n" + + "<head>\n" + + " <title>first</title>\n" + + " <script>\n" + + " function test() {\n" + + " alert(document.getElementById('myFrame').contentDocument);\n" + + " alert(document.getElementById('myFrame').contentDocument == frames.foo.document);\n" + + " }\n" + + " </script>\n" + + "</head>\n" + + "<body onload='test()'>\n" + + " <iframe name='foo' id='myFrame' src='about:blank'></iframe>\n" + + "</body></html>"; loadPageWithAlerts2(html); } @@ -152,15 +161,16 @@ @Alerts("true") public void frameElement() throws Exception { final String html - = "<html><head><title>first</title>\n" - + "<script>\n" - + "function test() {\n" - + " alert(document.getElementById('myFrame') == frames.foo.frameElement);\n" - + "}\n" - + "</script></head>\n" - + "<body onload='test()'>\n" - + "<iframe name='foo' id='myFrame' src='about:blank'></iframe>\n" - + "</body></html>"; + = "<!DOCTYPE html>\n" + + "<html><head><title>first</title>\n" + + "<script>\n" + + "function test() {\n" + + " alert(document.getElementById('myFrame') == frames.foo.frameElement);\n" + + "}\n" + + "</script></head>\n" + + "<body onload='test()'>\n" + + "<iframe name='foo' id='myFrame' src='about:blank'></iframe>\n" + + "</body></html>"; loadPageWithAlerts2(html); } @@ -173,8 +183,9 @@ @Test @Alerts({ "false", "false", "true", "true", "true", "object", "object" }) public void writeToIFrame() throws Exception { - final String html = - "<html><body onload='test()'><script>\n" + final String html + = "<!DOCTYPE html>\n" + + "<html><body onload='test()'><script>\n" + " function test() {\n" + " \n" + " var frame = document.createElement('iframe');\n" @@ -212,8 +223,9 @@ @Alerts(DEFAULT = { "123", "undefined" }, IE11 = { "123" }) public void iFrameReinitialized() throws Exception { - final String html = - "<html><body><a id='test' href='2.html' target='theFrame'>page 2 in frame</a>\n" + final String html + = "<!DOCTYPE html>\n" + + "<html><body><a id='test' href='2.html' target='theFrame'>page 2 in frame</a>\n" + "<iframe name='theFrame' src='1.html'></iframe>\n" + "</body></html>"; @@ -241,7 +253,8 @@ @Alerts("about:blank") public void setSrc_JavascriptUrl() throws Exception { final String html - = "<html><head><title>First</title><script>\n" + = "<!DOCTYPE html>\n" + + "<html><head><title>First</title><script>\n" + " function test() {\n" + " document.getElementById('iframe1').src = 'javascript:void(0)';\n" + " alert(window.frames[0].location);\n" @@ -261,7 +274,8 @@ IE = {"", "100", "", "20%", "-5", "30", "error", "400", "100", "-5", "100", "10%", "-12" }) public void width() throws Exception { final String html - = "<html><body>\n" + = "<!DOCTYPE html>\n" + + "<html><body>\n" + "<iframe id='i1'></iframe>\n" + "<iframe id='i2' width='100'></iframe>\n" + "<iframe id='i3' width='foo'></iframe>\n" @@ -313,7 +327,8 @@ IE = {"", "100", "", "20%", "-5", "30", "error", "400", "100", "-5", "100", "10%", "-12" }) public void height() throws Exception { final String html - = "<html><body>\n" + = "<!DOCTYPE html>\n" + + "<html><body>\n" + "<iframe id='i1'></iframe>\n" + "<iframe id='i2' height='100'></iframe>\n" + "<iframe id='i3' height='foo'></iframe>\n" @@ -367,7 +382,9 @@ IE = { "loading", "complete" }) @NotYetImplemented(FF) public void readyState_IFrame() throws Exception { - final String html = "<html><head></head>\n" + final String html + = "<!DOCTYPE html>\n" + + "<html><head></head>\n" + " <body>\n" + " <iframe id='i'></iframe>\n" + " <script>\n" @@ -389,9 +406,10 @@ @Alerts(DEFAULT = { "null", "[object HTMLBodyElement]" }, IE8 = { "null", "[object]" }) public void body() throws Exception { - final String html = - "<html><body>\n" - + "<iframe name='theFrame' src='1.html'></iframe>\n" + final String html + = "<!DOCTYPE html>\n" + + "<html><body>\n" + + " <iframe name='theFrame' src='1.html'></iframe>\n" + "</body></html>"; final String frame = "<html><head><script>alert(document.body);</script></head>\n" @@ -413,7 +431,8 @@ IE = "128") public void width_px() throws Exception { final String html - = "<html><head>" + = "<!DOCTYPE html>\n" + + "<html><head>" + "<script>\n" + " function test() {\n" + " var iframe = document.getElementById('myFrame');\n" @@ -438,7 +457,8 @@ @NotYetImplemented(IE) public void idByName() throws Exception { final String html - = "<html><head>" + = "<!DOCTYPE html>\n" + + "<html><head>" + "<script>\n" + " function test() {\n" + " alert(myFrame);\n" @@ -461,7 +481,8 @@ @Alerts("foo") public void settingInnerHtmlTriggersFrameLoad() throws Exception { final String html - = "<html><body><div id='d' onclick='loadFrame()'>Click me to show frame</div><script>\n" + = "<!DOCTYPE html>\n" + + "<html><body><div id='d' onclick='loadFrame()'>Click me to show frame</div><script>\n" + "function loadFrame() {\n" + " var s = '<iframe id=\"i\" src=\"frame.html\">';\n" + " s += '<p>Your browser does not support frames</p>';\n" @@ -492,7 +513,8 @@ @Alerts("something") public void window() throws Exception { final String html - = "<html><head><title>First</title><script>\n" + = "<!DOCTYPE html>\n" + + "<html><head><title>First</title><script>\n" + "function test() {\n" + " var iframe = document.getElementById('myIFrame');\n" + " iframe.contentWindow.contents = 'something';\n" @@ -515,7 +537,8 @@ @Alerts("something") public void settingSrc() throws Exception { final String html - = "<html><head><title>First</title><script>\n" + = "<!DOCTYPE html>\n" + + "<html><head><title>First</title><script>\n" + "function test() {\n" + " var iframe = document.createElement('iframe');\n" + " var content = 'something';\n" @@ -533,4 +556,84 @@ final String content = driver.findElement(By.xpath("//html/body")).getText(); assertEquals(getExpectedAlerts()[0], content); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "localhost", "localhost", "localhost", "localhost", + "true", "true", "true" }) + public void domain() throws Exception { + final String html + = "<!DOCTYPE html>\n" + + "<html>\n" + + "<head>\n" + + " <title>OnloadTest</title>\n" + + " <script>\n" + + " function doTest() {\n" + + " var docDomain = document.domain;\n" + + " var frame1Domain = document.getElementById('frame1').contentWindow.document.domain;\n" + + " var frame2Domain = document.getElementById('frame2').contentWindow.document.domain;\n" + + " var frame3Domain = document.getElementById('frame3').contentWindow.document.domain;\n" + + " alert(docDomain);\n" + + " alert(frame1Domain);\n" + + " alert(frame2Domain);\n" + + " alert(frame3Domain);\n" + + " alert(docDomain === frame1Domain);\n" + + " alert(docDomain === frame2Domain);\n" + + " alert(docDomain === frame3Domain);\n" + + " }\n" + + " </script>\n" + + "</head>\n" + + "<body onload='doTest()'>\n" + + " <iframe id='frame1' ></iframe>\n" + + " <iframe id='frame2' src='about:blank'></iframe>\n" + + " <iframe id='frame3' src='content.html'></iframe>\n" + + "</body>\n" + + "</html>"; + + final String left = "<html><head><title>Left</title></head>\n" + + "<body>left</body>\n" + + "</html>"; + + getMockWebConnection().setResponse(new URL(URL_FIRST, "content.html"), left); + + loadPageWithAlerts2(html); + assertEquals(2, getMockWebConnection().getRequestCount()); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "localhost", "localhost", "true" }) + public void domainDynamic() throws Exception { + final String html + = "<!DOCTYPE html>\n" + + "<html>\n" + + "<head>\n" + + " <title>OnloadTest</title>\n" + + " <script>\n" + + " function doTest() {\n" + + " var myFrame = document.createElement('iframe');\n" + + " myFrame.id = 'idMyFrame'\n" + + " myFrame.src = 'about:blank'\n" + + " document.body.appendChild(myFrame)\n" + + + " var docDomain = document.domain;\n" + + " var myFrameDomain = myFrame.contentDocument.domain;\n" + + + " alert(docDomain);\n" + + " alert(myFrameDomain);\n" + + " alert(docDomain === myFrameDomain);\n" + + " }\n" + + " </script>\n" + + "</head>\n" + + "<body onload='doTest()'>\n" + + "</body>\n" + + "</html>"; + + loadPageWithAlerts2(html); + assertEquals(1, getMockWebConnection().getRequestCount()); + } } |
From: <rb...@us...> - 2014-02-11 21:43:00
|
Revision: 9123 http://sourceforge.net/p/htmlunit/code/9123 Author: rbri Date: 2014-02-11 21:42:54 +0000 (Tue, 11 Feb 2014) Log Message: ----------- Use the correct url for checking if the origin header has to be added to a XMLHttpRequest. Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestCORSTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-02-11 05:55:55 UTC (rev 9122) +++ trunk/htmlunit/src/changes/changes.xml 2014-02-11 21:42:54 UTC (rev 9123) @@ -8,6 +8,10 @@ <body> <release version="2.14" date="???" description="FF24, Bugfixes, initial work on IE11"> + <action type="fix" dev="rbri" issue="1575"> + JavaScript: Use the correct url for checking if the origin header has to be added + to a XMLHttpRequest. + </action> <action type="fix" dev="rbri"> JavaScript: Property contentDocument (Frame/iFrame) is available in IE8 also. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest.java 2014-02-11 05:55:55 UTC (rev 9122) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest.java 2014-02-11 21:42:54 UTC (rev 9123) @@ -496,7 +496,7 @@ try { final URL fullUrl = containingPage_.getFullyQualifiedUrl(url); - final URL originUrl = containingPage_.getUrl(); + final URL originUrl = containingPage_.getFullyQualifiedUrl(""); if (!isAllowCrossDomainsFor(originUrl, fullUrl)) { throw Context.reportRuntimeError("Access to restricted URI denied"); } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestCORSTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestCORSTest.java 2014-02-11 05:55:55 UTC (rev 9122) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestCORSTest.java 2014-02-11 21:42:54 UTC (rev 9123) @@ -662,7 +662,8 @@ + "}\n" + "</script>\n" + "</head>\n" - + "<body onload='test()'></body></html>"; + + "<body onload='test()'>\n" + + "</body></html>"; WithCredentialsServerServlet.ACCESS_CONTROL_ALLOW_ORIGIN_ = accessControlAllowOrigin; WithCredentialsServerServlet.ACCESS_CONTROL_ALLOW_CREDENTIALS_ = accessControlAllowCredentials; @@ -674,6 +675,58 @@ } /** + * @throws Exception if the test fails. + */ + @Test + @Alerts("done 200") + public void testWithCredentialsIFrame() throws Exception { + final String html = "<html><head>\n" + + "<script>\n" + + + "function load() {\n" + + " try {\n" + + " var myContent = '<!DOCTYPE html><html><head></head><body>" + + "<script src=\"get.js\"><\\/script><p>tttttt</p></body></html>';\n" + + " window.asyncLoadIFrame = document.createElement('iframe');\n" + + " asyncLoadIFrame.id = 'asyncLoadIFrame';\n" + + " asyncLoadIFrame.src = 'about:blank';\n" + + " document.body.appendChild(asyncLoadIFrame);\n" + + + " asyncLoadIFrame.contentWindow.document.open('text/html', 'replace');\n" + + " asyncLoadIFrame.contentWindow.document.write(myContent);\n" + + " asyncLoadIFrame.contentWindow.document.close();\n" + + " } catch(e) { alert(e) }\n" + + "}\n" + + "</script>\n" + + "</head>\n" + + "<body onload='load()'>\n" + + "</body></html>"; + + final String js = "" + + "var xhr = " + XHRInstantiation_ + ";\n" + + " try {\n" + + " var url = '/data';\n" + + " xhr.open('GET', url, true);\n" + + " xhr.withCredentials = true;\n" + + " xhr.onreadystatechange = onReadyStateChange;\n" + + " xhr.send();\n" + + " } catch(e) { alert(e) }\n" + + + " function onReadyStateChange() {\n" + + " if (xhr.readyState == 4) {\n" + + " alert('done ' + xhr.status);\n" + + " }\n" + + " }\n"; + + getMockWebConnection().setDefaultResponse(js, JAVASCRIPT_MIME_TYPE); + final String xml = "<xml><content>blah</content></xml>"; + + getMockWebConnection().setResponse(new URL(URL_FIRST, "/data"), xml, "text/xml"); + + loadPageWithAlerts2(html); + } + + /** * CORS "With Credentials" scenario Servlet. */ public static class WithCredentialsServerServlet extends HttpServlet { |
From: <rb...@us...> - 2014-02-12 16:53:16
|
Revision: 9125 http://sourceforge.net/p/htmlunit/code/9125 Author: rbri Date: 2014-02-12 16:53:13 +0000 (Wed, 12 Feb 2014) Log Message: ----------- Sanitize filenames constructed from URL's Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/XmlSerializer.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/util/DebuggingWebConnection.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/util/StringUtils.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/util/StringUtilsTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-02-12 06:21:31 UTC (rev 9124) +++ trunk/htmlunit/src/changes/changes.xml 2014-02-12 16:53:13 UTC (rev 9125) @@ -8,6 +8,9 @@ <body> <release version="2.14" date="???" description="FF24, Bugfixes, initial work on IE11"> + <action type="fix" dev="rbri" issue="1574"> + Sanitize filenames constructed from URL's. + </action> <action type="fix" dev="rbri" issue="1575"> JavaScript: Use the correct url for checking if the origin header has to be added to a XMLHttpRequest. Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/XmlSerializer.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/XmlSerializer.java 2014-02-12 06:21:31 UTC (rev 9124) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/XmlSerializer.java 2014-02-12 16:53:13 UTC (rev 9125) @@ -273,6 +273,7 @@ name = StringUtils.substringBefore(name, "?"); // remove query name = StringUtils.substringBefore(name, ";"); // remove additional info name = StringUtils.substring(name, 0, 30); // many file systems have a limit at 255, let's limit it + name = com.gargoylesoftware.htmlunit.util.StringUtils.sanitizeForFileName(name); if (!name.endsWith(extension)) { name += extension; } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/util/DebuggingWebConnection.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/util/DebuggingWebConnection.java 2014-02-12 06:21:31 UTC (rev 9124) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/util/DebuggingWebConnection.java 2014-02-12 16:53:13 UTC (rev 9125) @@ -285,6 +285,7 @@ name = StringUtils.substringBefore(name, "?"); // remove query name = StringUtils.substringBefore(name, ";"); // remove additional info name = StringUtils.substring(name, 0, 30); // avoid exceptions due to too long file names + name = com.gargoylesoftware.htmlunit.util.StringUtils.sanitizeForFileName(name); if (!name.endsWith(extension)) { name += extension; } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/util/StringUtils.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/util/StringUtils.java 2014-02-12 06:21:31 UTC (rev 9124) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/util/StringUtils.java 2014-02-12 16:53:13 UTC (rev 9125) @@ -37,6 +37,7 @@ private static final Pattern HEX_COLOR = Pattern.compile("#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})"); private static final Pattern RGB_COLOR = Pattern.compile("rgb\\s*?\\(\\s*?(\\d{1,3})\\s*?,\\s*?(\\d{1,3})\\s*?,\\s*?(\\d{1,3})\\s*?\\)"); + private static final Pattern ILLEGAL_FILE_NAME_CHARS = Pattern.compile("\\\\|/|\\||:|\\?|\\*|\"|<|>|\\p{Cntrl}"); /** * Disallow instantiation of this class. @@ -265,4 +266,15 @@ new String[] {"\\", "$"}, new String[]{"\\\\", "\\$"}); return toReplace; } + + /** + * Sanitizes a string for use as filename. + * Replaces \, /, |, :, ?, *, ", <, >, control chars by _ (underscore). + * + * @param toSanitize the string to sanitize + * @return sanitized version of the given string + */ + public static String sanitizeForFileName(final String toSanitize) { + return ILLEGAL_FILE_NAME_CHARS.matcher(toSanitize).replaceAll("_"); + } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/util/StringUtilsTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/util/StringUtilsTest.java 2014-02-12 06:21:31 UTC (rev 9124) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/util/StringUtilsTest.java 2014-02-12 16:53:13 UTC (rev 9125) @@ -107,4 +107,13 @@ assertEquals("\\\\1", StringUtils.sanitizeForAppendReplacement("\\1")); assertEquals("\\\\1\\$2 \\\\3", StringUtils.sanitizeForAppendReplacement("\\1$2 \\3")); } + + /** + * Test for method {@link StringUtils#sanitizeForFileName(String)}. + */ + @Test + public void sanitizeForFileName() { + assertEquals("HtmlUnit", StringUtils.sanitizeForFileName("HtmlUnit")); + assertEquals("Html_Uni_", StringUtils.sanitizeForFileName("Html:Uni\t")); + } } |
From: <rb...@us...> - 2014-02-17 20:57:14
|
Revision: 9136 http://sourceforge.net/p/htmlunit/code/9136 Author: rbri Date: 2014-02-17 20:57:08 +0000 (Mon, 17 Feb 2014) Log Message: ----------- The javascript inside the href attrib of an anchor executes in the context of the anchors target. Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlAnchor.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLAnchorElement2Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-02-17 12:06:36 UTC (rev 9135) +++ trunk/htmlunit/src/changes/changes.xml 2014-02-17 20:57:08 UTC (rev 9136) @@ -8,6 +8,10 @@ <body> <release version="2.15" date="???" description="Bugfixes"> + <action type="fix" dev="rbri"> + JavaScript: The javascript inside the href attrib of an anchor executes in the context + of the anchors target. + </action> </release> <release version="2.14" date="Feb 17, 2014" description="FF24, Bugfixes, initial work on IE11"> <action type="update" dev="mguillem"> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java 2014-02-17 12:06:36 UTC (rev 9135) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java 2014-02-17 20:57:08 UTC (rev 9136) @@ -817,6 +817,8 @@ } /** + * <span style="color:red">INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.</span><br/> + * * Open the window with the specified name. The name may be a special * target name of _self, _parent, _top, or _blank. An empty or null * name is set to the default. The special target names are relative to @@ -827,7 +829,7 @@ * @param defaultName the default target if no name is given * @return the new window */ - private WebWindow openTargetWindow( + public WebWindow openTargetWindow( final WebWindow opener, final String windowName, final String defaultName) { WebAssert.notNull("opener", opener); Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlAnchor.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlAnchor.java 2014-02-17 12:06:36 UTC (rev 9135) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlAnchor.java 2014-02-17 20:57:08 UTC (rev 9136) @@ -80,7 +80,7 @@ if (ATTRIBUTE_NOT_DEFINED == getHrefAttribute()) { return; } - final HtmlPage page = (HtmlPage) getPage(); + HtmlPage htmlPage = (HtmlPage) getPage(); if (StringUtils.startsWithIgnoreCase(href, JavaScriptURLConnection.JAVASCRIPT_PREFIX)) { final StringBuilder builder = new StringBuilder(href.length()); builder.append(JavaScriptURLConnection.JAVASCRIPT_PREFIX); @@ -98,25 +98,32 @@ } builder.append(ch); } - page.executeJavaScriptIfPossible(builder.toString(), "javascript url", getStartLineNumber()); + + final WebWindow win = htmlPage.getWebClient().openTargetWindow(htmlPage.getEnclosingWindow(), + htmlPage.getResolvedTarget(getTargetAttribute()), "_self"); + final Page page = win.getEnclosedPage(); + if (page != null && page.isHtmlPage()) { + htmlPage = (HtmlPage) page; + htmlPage.executeJavaScriptIfPossible(builder.toString(), "javascript url", getStartLineNumber()); + } return; } - final URL url = getTargetUrl(href, page); + final URL url = getTargetUrl(href, htmlPage); - final BrowserVersion browser = page.getWebClient().getBrowserVersion(); + final BrowserVersion browser = htmlPage.getWebClient().getBrowserVersion(); final WebRequest webRequest = new WebRequest(url, browser.getHtmlAcceptHeader()); - webRequest.setCharset(page.getPageEncoding()); - webRequest.setAdditionalHeader("Referer", page.getUrl().toExternalForm()); + webRequest.setCharset(htmlPage.getPageEncoding()); + webRequest.setAdditionalHeader("Referer", htmlPage.getUrl().toExternalForm()); if (LOG.isDebugEnabled()) { LOG.debug( "Getting page for " + url.toExternalForm() + ", derived from href '" + href + "', using the originating URL " - + page.getUrl()); + + htmlPage.getUrl()); } - page.getWebClient().download(page.getEnclosingWindow(), - page.getResolvedTarget(getTargetAttribute()), + htmlPage.getWebClient().download(htmlPage.getEnclosingWindow(), + htmlPage.getResolvedTarget(getTargetAttribute()), webRequest, href.endsWith("#"), "Link click"); } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLAnchorElement2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLAnchorElement2Test.java 2014-02-17 12:06:36 UTC (rev 9135) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLAnchorElement2Test.java 2014-02-17 20:57:08 UTC (rev 9136) @@ -406,4 +406,53 @@ loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "inner", "self", "main", "top", "main", "parent" }, + IE11 = { "inner", "self", "main", "parent" }) + public void javaScriptTarget() throws Exception { + final String html + = "<html>\n" + + "<head><title>main</title></head>\n" + + "<body>\n" + + " <iframe id='testFrame' src='" + URL_SECOND + "'></iframe>\n" + + "</body></html>"; + + final String script = "javascript: try { alert(document.title); } catch(e) { alert(e); }"; + final String secondHtml + = "<html>\n" + + "<head><title>inner</title></head>\n" + + "<body>\n" + + " <a id='tester' href='javascript:'>no href</a>\n" + + " <a id='selfTester' target='_self' href='" + script + "alert(\"self\")'>self</a>\n" + + " <a id='blankTester' target='_blank' href='" + script + "alert(\"blank\")'>blank</a>\n" + + " <a id='topTester' target='_top' href='" + script + "alert(\"top\")'>top</a>\n" + + " <a id='parentTester' target='_parent' href='" + script + "alert(\"parent\")'>parent</a>\n" + + " <a id='unknownTester' target='unknown' href='" + script + "alert(\"unknown\")'>unknown</a>\n" + + "</body></html>"; + + getMockWebConnection().setResponse(URL_SECOND, secondHtml); + + final WebDriver driver = loadPage2(html); + + driver.switchTo().frame("testFrame"); + assertEquals(1, driver.getWindowHandles().size()); + driver.findElement(By.id("tester")).click(); + assertEquals(1, driver.getWindowHandles().size()); + driver.findElement(By.id("selfTester")).click(); + assertEquals(1, driver.getWindowHandles().size()); + driver.findElement(By.id("blankTester")).click(); + assertEquals(2, driver.getWindowHandles().size()); + driver.findElement(By.id("topTester")).click(); + assertEquals(2, driver.getWindowHandles().size()); + driver.findElement(By.id("parentTester")).click(); + assertEquals(2, driver.getWindowHandles().size()); + driver.findElement(By.id("unknownTester")).click(); + assertEquals(3, driver.getWindowHandles().size()); + + assertEquals(getExpectedAlerts(), getCollectedAlerts(driver)); + } } |
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); + } } |
From: <rb...@us...> - 2014-02-27 19:18:53
|
Revision: 9149 http://sourceforge.net/p/htmlunit/code/9149 Author: rbri Date: 2014-02-27 19:18:46 +0000 (Thu, 27 Feb 2014) Log Message: ----------- Wrong charCode reported by the onKeyPress keyboard event for the space key Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/KeyboardEvent.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/KeyboardEventTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-02-27 18:44:15 UTC (rev 9148) +++ trunk/htmlunit/src/changes/changes.xml 2014-02-27 19:18:46 UTC (rev 9149) @@ -8,6 +8,9 @@ <body> <release version="2.15" date="???" description="Bugfixes"> + <action type="fix" dev="rbri" issue="1578"> + JavaScript: Wrong charCode reported by the onKeyPress keyboard event for the space key. + </action> <action type="fix" dev="rbri" issue="1580"> JavaScript: Fix our implementation of innerText for table elements. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/KeyboardEvent.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/KeyboardEvent.java 2014-02-27 18:44:15 UTC (rev 9148) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/KeyboardEvent.java 2014-02-27 19:18:46 UTC (rev 9149) @@ -538,7 +538,7 @@ } setKeyCode(keyCode); if (getType().equals(Event.TYPE_KEY_PRESS)) { - if ((character >= 33 && character <= 126) + if ((character >= 32 && character <= 126) || !getBrowserVersion().hasFeature(JS_EVENT_DISTINGUISH_PRINTABLE_KEY)) { charCode_ = character; } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/KeyboardEventTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/KeyboardEventTest.java 2014-02-27 18:44:15 UTC (rev 9148) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/KeyboardEventTest.java 2014-02-27 19:18:46 UTC (rev 9149) @@ -134,7 +134,7 @@ */ @Test @Alerts({ "32", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57" }) - public void keyCodes() throws Exception { + public void keyCodes_keyup() throws Exception { final String html = "<html><head>" + "<script>" + "function handleKey(e) {\n" @@ -158,7 +158,7 @@ @Test @Alerts({ "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90" }) - public void keyCodes2() throws Exception { + public void keyCodes2_keyup() throws Exception { final String html = "<html><head>" + "<script>" + "function handleKey(e) {\n" @@ -179,6 +179,104 @@ /** * @throws Exception if the test fails */ + @Test + @Alerts({ "32", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57" }) + public void keyCodes_keydown() throws Exception { + final String html = "<html><head>" + + "<script>" + + "function handleKey(e) {\n" + + " alert(e.keyCode);" + + "}" + + "</script>\n" + + "</head><body>\n" + + "<input id='t' onkeydown='handleKey(event)'/>\n" + + "</body></html>"; + + final WebDriver driver = loadPage2(html); + final WebElement field = driver.findElement(By.id("t")); + + field.sendKeys(" 0123456789"); + assertEquals(getExpectedAlerts(), getCollectedAlerts(driver)); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", + "82", "83", "84", "85", "86", "87", "88", "89", "90" }) + public void keyCodes2_keydown() throws Exception { + final String html = "<html><head>" + + "<script>" + + "function handleKey(e) {\n" + + " alert(e.keyCode);" + + "}" + + "</script>\n" + + "</head><body>\n" + + "<input id='t' onkeydown='handleKey(event)'/>\n" + + "</body></html>"; + + final WebDriver driver = loadPage2(html); + final WebElement field = driver.findElement(By.id("t")); + + field.sendKeys("abcdefghijklmnopqrstuvwxyz"); + assertEquals(getExpectedAlerts(), getCollectedAlerts(driver)); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "32", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57" }, + IE8 = { "undefined", "undefined", "undefined", "undefined", "undefined", + "undefined", "undefined", "undefined", "undefined", "undefined", "undefined" }) + public void keyCodes_keypress() throws Exception { + final String html = "<html><head>" + + "<script>" + + "function handleKey(e) {\n" + + " alert(e.charCode);" + + "}" + + "</script>\n" + + "</head><body>\n" + + "<input id='t' onkeypress='handleKey(event)'/>\n" + + "</body></html>"; + + final WebDriver driver = loadPage2(html); + final WebElement field = driver.findElement(By.id("t")); + + field.sendKeys(" 0123456789"); + assertEquals(getExpectedAlerts(), getCollectedAlerts(driver)); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "97", "98", "99", + "100", "101", "102", "103", "104", "105", "106", "107", "108", "109", + "110", "111", "112", "113", "114", "115", "116", "117", "118", "119", + "120", "121", "122" }) + public void keyCodes2_keypress() throws Exception { + final String html = "<html><head>" + + "<script>" + + "function handleKey(e) {\n" + + " alert(e.charCode);" + + "}" + + "</script>\n" + + "</head><body>\n" + + "<input id='t' onkeypress='handleKey(event)'/>\n" + + "</body></html>"; + + final WebDriver driver = loadPage2(html); + final WebElement field = driver.findElement(By.id("t")); + + field.sendKeys("abcdefghijklmnopqrstuvwxyz"); + assertEquals(getExpectedAlerts(), getCollectedAlerts(driver)); + } + + /** + * @throws Exception if the test fails + */ // FF seem to generate seperate events for the shift key (tested with // real FF17 and 24) @Test |
From: <asa...@us...> - 2014-03-06 01:03:55
|
Revision: 9154 http://sourceforge.net/p/htmlunit/code/9154 Author: asashour Date: 2014-03-06 01:03:48 +0000 (Thu, 06 Mar 2014) Log Message: ----------- JavaScript: fix setting value to toString() function. Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/FunctionWrapper.java Added Paths: ----------- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/FunctionsWrapperTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-03-05 19:10:38 UTC (rev 9153) +++ trunk/htmlunit/src/changes/changes.xml 2014-03-06 01:03:48 UTC (rev 9154) @@ -8,6 +8,9 @@ <body> <release version="2.15" date="???" description="Bugfixes"> + <action type="fix" dev="asashour"> + JavaScript: fix setting value to toString() function. + </action> <action type="update" dev="asashour"> Upgrade Apache commons-lang to 3.3. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/FunctionWrapper.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/FunctionWrapper.java 2014-03-05 19:10:38 UTC (rev 9153) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/FunctionWrapper.java 2014-03-06 01:03:48 UTC (rev 9154) @@ -20,8 +20,10 @@ /** * Wrapper for a {@link Function} delegating all calls to the wrapped instance. + * * @version $Revision$ * @author Marc Guillemot + * @author Ahmed Ashour */ class FunctionWrapper implements Function { private final Function wrapped_; @@ -59,7 +61,7 @@ } public void put(final String name, final Scriptable start, final Object value) { - wrapped_.put(name, start, value); + wrapped_.put(name, wrapped_, value); } public void put(final int index, final Scriptable start, final Object value) { Added: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/FunctionsWrapperTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/FunctionsWrapperTest.java (rev 0) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/FunctionsWrapperTest.java 2014-03-06 01:03:48 UTC (rev 9154) @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2014 Gargoyle Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.gargoylesoftware.htmlunit.javascript; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.gargoylesoftware.htmlunit.BrowserRunner; +import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; +import com.gargoylesoftware.htmlunit.WebDriverTestCase; + +/** + * Tests for {@link FunctionWrapper}. + * + * @version $Revision$ + * @author Ahmed Ashour + */ +@RunWith(BrowserRunner.class) +public class FunctionsWrapperTest extends WebDriverTestCase { + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("1") + public void function_toString() throws Exception { + final String html + = "<html><head><title>foo</title><script>\n" + + "function test() {\n" + + " var x = test.toString;\n" + + " x.guid = 1;\n" + + " alert(x.guid);\n" + + "}\n" + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + loadPageWithAlerts2(html); + } +} Property changes on: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/FunctionsWrapperTest.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Author Date Id Revision \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property |
From: <asa...@us...> - 2014-03-06 01:21:36
|
Revision: 9155 http://sourceforge.net/p/htmlunit/code/9155 Author: asashour Date: 2014-03-06 01:21:31 +0000 (Thu, 06 Mar 2014) Log Message: ----------- JavaScript: fix setting indexed value to toString() function. Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/FunctionWrapper.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/FunctionsWrapperTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/FunctionWrapper.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/FunctionWrapper.java 2014-03-06 01:03:48 UTC (rev 9154) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/FunctionWrapper.java 2014-03-06 01:21:31 UTC (rev 9155) @@ -65,7 +65,7 @@ } public void put(final int index, final Scriptable start, final Object value) { - wrapped_.put(index, start, value); + wrapped_.put(index, wrapped_, value); } public void delete(final String name) { Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/FunctionsWrapperTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/FunctionsWrapperTest.java 2014-03-06 01:03:48 UTC (rev 9154) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/FunctionsWrapperTest.java 2014-03-06 01:21:31 UTC (rev 9155) @@ -41,6 +41,7 @@ + "function test() {\n" + " var x = test.toString;\n" + " x.guid = 1;\n" + + " x[0] = 2;\n" + " alert(x.guid);\n" + "}\n" + "</script></head><body onload='test()'>\n" |
From: <rb...@us...> - 2014-03-06 20:22:32
|
Revision: 9157 http://sourceforge.net/p/htmlunit/code/9157 Author: rbri Date: 2014-03-06 20:22:28 +0000 (Thu, 06 Mar 2014) Log Message: ----------- Fix handling of coordinate parameters when clicking on an image input. Some test cases migrated to webdriver and retested. Fix the javascript configuration for Chrome. Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlImageInput.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlImageInput2Test.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlImageInputTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-03-06 07:24:13 UTC (rev 9156) +++ trunk/htmlunit/src/changes/changes.xml 2014-03-06 20:22:28 UTC (rev 9157) @@ -8,6 +8,9 @@ <body> <release version="2.15" date="???" description="Bugfixes"> + <action type="fix" dev="rbri" issue="1581"> + JavaScript: Fix handling of coordinate parameters when clicking on an image input. + </action> <action type="fix" dev="asashour"> JavaScript: fix setting value to toString() function. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-03-06 07:24:13 UTC (rev 9156) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-03-06 20:22:28 UTC (rev 9157) @@ -547,8 +547,8 @@ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 11) }) HTMLIFRAME_IGNORE_SELFCLOSING, - /** */ - @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME) }) + /** Clicking an image input submits the value as param if defined. */ + @BrowserFeature(@WebBrowser(CHROME)) HTMLIMAGE_NAME_VALUE_PARAMS, /** Setting defaultValue updates the value also. */ Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlImageInput.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlImageInput.java 2014-03-06 07:24:13 UTC (rev 9156) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlImageInput.java 2014-03-06 20:22:28 UTC (rev 9157) @@ -24,6 +24,7 @@ import com.gargoylesoftware.htmlunit.ElementNotFoundException; import com.gargoylesoftware.htmlunit.Page; import com.gargoylesoftware.htmlunit.SgmlPage; +import com.gargoylesoftware.htmlunit.javascript.host.Event; import com.gargoylesoftware.htmlunit.util.NameValuePair; /** @@ -127,15 +128,33 @@ * @exception ElementNotFoundException If a particular XML element could not be found in the DOM model */ @Override - @SuppressWarnings("unchecked") public <P extends Page> P click(final int x, final int y) throws IOException, ElementNotFoundException { wasPositionSpecified_ = true; xPosition_ = x; yPosition_ = y; - return (P) super.click(); + return super.click(); } /** + * <span style="color:red">INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.</span><br/> + * + * Simulates clicking on this element, returning the page in the window that has the focus + * after the element has been clicked. Note that the returned page may or may not be the same + * as the original page, depending on the type of element being clicked, the presence of JavaScript + * action listeners, etc. + * + * @param event the click event used + * @param <P> the page type + * @return the page contained in the current window as returned by {@link WebClient#getCurrentWindow()} + * @exception IOException if an IO error occurs + */ + @Override + public <P extends Page> P click(final Event event) throws IOException { + wasPositionSpecified_ = true; + return super.click(event); + } + + /** * {@inheritDoc} Also sets the value to the new default value, just like IE. * @see SubmittableElement#setDefaultValue(String) */ 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 2014-03-06 07:24:13 UTC (rev 9156) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2014-03-06 20:22:28 UTC (rev 9157) @@ -2120,7 +2120,7 @@ * Click this element. This simulates the action of the user clicking with the mouse. * @throws IOException if this click triggers a page load that encounters problems */ - @JsxFunction({ @WebBrowser(IE), @WebBrowser(value = FF, minVersion = 10) }) + @JsxFunction({ @WebBrowser(IE), @WebBrowser(value = FF, minVersion = 10), @WebBrowser(CHROME) }) public void click() throws IOException { getDomNodeOrDie().click(); } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlImageInput2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlImageInput2Test.java 2014-03-06 07:24:13 UTC (rev 9156) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlImageInput2Test.java 2014-03-06 20:22:28 UTC (rev 9157) @@ -14,17 +14,26 @@ */ package com.gargoylesoftware.htmlunit.html; +import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.CHROME; +import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.IE; + import org.junit.Test; import org.junit.runner.RunWith; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; import com.gargoylesoftware.htmlunit.BrowserRunner; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; +import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; import com.gargoylesoftware.htmlunit.WebDriverTestCase; /** * Tests for {@link HtmlImageInput}. * * @version $Revision$ + * @author <a href="mailto:mb...@Ga...">Mike Bowler</a> + * @author Marc Guillemot + * @author Ahmed Ashour * @author Ronald Brill */ @RunWith(BrowserRunner.class) @@ -34,6 +43,52 @@ * @throws Exception if the test fails */ @Test + @Alerts(DEFAULT = "§§URL§§?button.x=0&button.y=0", + CHROME = "§§URL§§?button.x=10&button.y=10&button=foo", + IE8 = "§§URL§§?button.x=15&button.y=16", + IE11 = "§§URL§§?button.x=14&button.y=15") + @NotYetImplemented({ CHROME, IE }) + public void testClick_NoPosition() throws Exception { + final String html + = "<html><head><title>foo</title></head><body>\n" + + "<form id='form1'>\n" + + "<input type='image' name='aButton' value='foo'/>\n" + + "<input type='image' name='button' value='foo'/>\n" + + "<input type='image' name='anotherButton' value='foo'/>\n" + + "</form></body></html>"; + final WebDriver webDriver = loadPage2(html); + webDriver.findElement(By.name("button")).click(); + + expandExpectedAlertsVariables(URL_FIRST); + assertEquals(getExpectedAlerts()[0], webDriver.getCurrentUrl()); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = "§§URL§§?button.x=0&button.y=0", + CHROME = "§§URL§§?button.x=24&button.y=10", + IE8 = "§§URL§§?button.x=15&button.y=16", + IE11 = "§§URL§§?button.x=14&button.y=15") + @NotYetImplemented({ CHROME, IE }) + public void testClick_NoPosition_NoValue() throws Exception { + final String html + = "<html><head><title>foo</title></head><body>\n" + + "<form id='form1'>\n" + + "<input type='image' name='button'>\n" + + "</form></body></html>"; + final WebDriver webDriver = loadPage2(html); + webDriver.findElement(By.name("button")).click(); + + expandExpectedAlertsVariables(URL_FIRST); + assertEquals(getExpectedAlerts()[0], webDriver.getCurrentUrl()); + } + + /** + * @throws Exception if the test fails + */ + @Test @Alerts({ "-", "-", "-" }) public void defaultValues() throws Exception { final String html = "<html><head><title>foo</title>\n" @@ -201,4 +256,72 @@ loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("§§URL§§?imageInput.x=0&imageInput.y=0") + public void javascriptClick() throws Exception { + final String html = "<html><head><title>foo</title>\n" + + "</head><body>\n" + + "<form>\n" + + " <input type='image' name='imageInput'>\n" + + " <input type='button' id='submit' value='submit' " + + "onclick='document.getElementsByName(\"imageInput\")[0].click()'>\n" + + "</form>\n" + + "</body></html>"; + + final WebDriver webDriver = loadPage2(html); + webDriver.findElement(By.id("submit")).click(); + + expandExpectedAlertsVariables(URL_FIRST); + assertEquals(getExpectedAlerts()[0], webDriver.getCurrentUrl()); + } + + /** + * Test for bug: http://sourceforge.net/p/htmlunit/bugs/646/. + * @throws Exception if an error occurs + */ + @Test + @Alerts("1") + public void testClickFiresOnMouseDown() throws Exception { + final String html = "<html><body><input type='image' src='x.png' id='i' onmousedown='alert(1)'></body></html>"; + + final WebDriver webDriver = loadPage2(html); + webDriver.findElement(By.id("i")).click(); + + assertEquals(getExpectedAlerts(), getCollectedAlerts(webDriver)); + } + + /** + * Test for bug: http://sourceforge.net/p/htmlunit/bugs/646/. + * @throws Exception if an error occurs + */ + @Test + @Alerts("1") + public void testClickFiresOnMouseUp() throws Exception { + final String html = "<html><body><input type='image' src='x.png' id='i' onmouseup='alert(1)'></body></html>"; + final WebDriver webDriver = loadPage2(html); + webDriver.findElement(By.id("i")).click(); + + assertEquals(getExpectedAlerts(), getCollectedAlerts(webDriver)); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("1") + public void testOutsideForm() throws Exception { + final String html = + "<html><head></head>\n" + + "<body>\n" + + "<input id='myInput' type='image' src='test.png' onclick='alert(1)'>\n" + + "</body></html>"; + final WebDriver webDriver = loadPage2(html); + webDriver.findElement(By.id("myInput")).click(); + + assertEquals(getExpectedAlerts(), getCollectedAlerts(webDriver)); + } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlImageInputTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlImageInputTest.java 2014-03-06 07:24:13 UTC (rev 9156) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlImageInputTest.java 2014-03-06 20:22:28 UTC (rev 9157) @@ -43,59 +43,6 @@ * @throws Exception if the test fails */ @Test - public void testClick_NoPosition() throws Exception { - final String htmlContent - = "<html><head><title>foo</title></head><body>\n" - + "<form id='form1' method='post'>\n" - + "<input type='image' name='aButton' value='foo'/>\n" - + "<input type='image' name='button' value='foo'/>\n" - + "<input type='image' name='anotherButton' value='foo'/>\n" - + "</form></body></html>"; - final HtmlPage page = loadPageWithAlerts(htmlContent); - final MockWebConnection webConnection = getMockConnection(page); - - final HtmlForm form = page.getHtmlElementById("form1"); - - final HtmlImageInput imageInput = form.getInputByName("button"); - final HtmlPage secondPage = (HtmlPage) imageInput.click(); - assertNotNull(secondPage); - - final List<NameValuePair> expectedPairs = new ArrayList<NameValuePair>(); - expectedPairs.add(new NameValuePair("button.x", "0")); - expectedPairs.add(new NameValuePair("button.y", "0")); - if (getBrowserVersion().isFirefox()) { - expectedPairs.add(new NameValuePair("button", "foo")); - } - - assertEquals( - expectedPairs, - webConnection.getLastParameters()); - } - - /** - * @throws Exception if the test fails - */ - @Test - public void testClick_NoPosition_NoValue() throws Exception { - final String htmlContent - = "<html><head><title>foo</title></head><body>\n" - + "<form id='form1'>\n" - + "<input type='image' name='button'>\n" - + "</form></body></html>"; - final HtmlPage page = loadPageWithAlerts(htmlContent); - getMockConnection(page).setDefaultResponse(htmlContent); - final HtmlForm form = page.getHtmlElementById("form1"); - - final HtmlImageInput imageInput = form.getInputByName("button"); - final HtmlPage secondPage = (HtmlPage) imageInput.click(); - final String url = secondPage.getUrl().toExternalForm(); - assertTrue(url.endsWith("?button.x=0&button.y=0")); - } - - /** - * @throws Exception if the test fails - */ - @Test public void testClick_WithPosition() throws Exception { final String html = "<html><head><title>foo</title></head><body>\n" @@ -116,9 +63,6 @@ final List<NameValuePair> expectedPairs = new ArrayList<NameValuePair>(); expectedPairs.add(new NameValuePair("button.x", "100")); expectedPairs.add(new NameValuePair("button.y", "200")); - if (getBrowserVersion().isFirefox()) { - expectedPairs.add(new NameValuePair("button", "foo")); - } assertEquals( expectedPairs, @@ -155,52 +99,4 @@ expectedPairs, webConnection.getLastParameters()); } - - /** - * @throws Exception if the test fails - */ - @Test - public void testOutsideForm() throws Exception { - final String html = - "<html><head></head>\n" - + "<body>\n" - + "<input id='myInput' type='image' src='test.png' onclick='alert(1)'>\n" - + "</body></html>"; - - final String[] expectedAlerts = {"1"}; - final List<String> collectedAlerts = new ArrayList<String>(); - final HtmlPage page = loadPage(getBrowserVersion(), html, collectedAlerts); - final HtmlImageInput input = page.getHtmlElementById("myInput"); - input.click(); - - assertEquals(expectedAlerts, collectedAlerts); - } - - /** - * Test for bug: http://sourceforge.net/p/htmlunit/bugs/646/. - * @throws Exception if an error occurs - */ - @Test - public void testClickFiresOnMouseDown() throws Exception { - final String s = "<html><body><input type='image' src='x.png' id='i' onmousedown='alert(1)'></body></html>"; - final String[] expectedAlerts = {"1"}; - final List<String> collectedAlerts = new ArrayList<String>(); - final HtmlPage page = loadPage(getBrowserVersion(), s, collectedAlerts); - page.getHtmlElementById("i").click(); - assertEquals(expectedAlerts, collectedAlerts); - } - - /** - * Test for bug: http://sourceforge.net/p/htmlunit/bugs/646/. - * @throws Exception if an error occurs - */ - @Test - public void testClickFiresOnMouseUp() throws Exception { - final String s = "<html><body><input type='image' src='x.png' id='i' onmouseup='alert(1)'></body></html>"; - final String[] expectedAlerts = {"1"}; - final List<String> collectedAlerts = new ArrayList<String>(); - final HtmlPage page = loadPage(getBrowserVersion(), s, collectedAlerts); - page.getHtmlElementById("i").click(); - assertEquals(expectedAlerts, collectedAlerts); - } } |
From: <rb...@us...> - 2014-03-08 09:47:42
|
Revision: 9160 http://sourceforge.net/p/htmlunit/code/9160 Author: rbri Date: 2014-03-08 09:47:36 +0000 (Sat, 08 Mar 2014) Log Message: ----------- type property now supported by ul and ol tag Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLListElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLOListElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLUListElement.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDirectoryElementTest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLOListElementTest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLUListElementTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-03-07 19:05:20 UTC (rev 9159) +++ trunk/htmlunit/src/changes/changes.xml 2014-03-08 09:47:36 UTC (rev 9160) @@ -8,6 +8,9 @@ <body> <release version="2.15" date="???" description="Bugfixes"> + <action type="add" dev="rbri"> + JavaScript: type property now supported by ul and ol tag. + </action> <action type="fix" dev="rbri" issue="1581"> JavaScript: Fix handling of coordinate parameters when clicking on an image input. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-03-07 19:05:20 UTC (rev 9159) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-03-08 09:47:36 UTC (rev 9160) @@ -1373,6 +1373,10 @@ @BrowserFeature(@WebBrowser(value = IE, minVersion = 11)) JS_TREEWALKER_FILTER_FUNCTION_ONLY, + /** Setting the property align to arbitrary values is allowed. */ + @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME) }) + JS_TYPE_ACCEPTS_ARBITRARY_VALUES, + /** Setting the property width/heigth to arbitrary values is allowed. */ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME) }) JS_WIDTH_HEIGHT_ACCEPTS_ARBITRARY_VALUES, Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLListElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLListElement.java 2014-03-07 19:05:20 UTC (rev 9159) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLListElement.java 2014-03-08 09:47:36 UTC (rev 9160) @@ -15,6 +15,7 @@ package com.gargoylesoftware.htmlunit.javascript.host.html; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HTMLLIST_LIMIT_COMPACT_TO_BOOLEAN; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_TYPE_ACCEPTS_ARBITRARY_VALUES; import net.sourceforge.htmlunit.corejs.javascript.Context; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxClasses; @@ -27,6 +28,7 @@ * @version $Revision$ * @author Daniel Gredler * @author Frank Danek + * @author Ronald Brill */ @JsxClasses( isJSObject = false @@ -67,4 +69,41 @@ return super.getAttribute(attributeName, flags); } + /** + * Returns the value of the "type" property. + * @return the value of the "type" property + */ + protected String getType() { + final boolean acceptArbitraryValues = getBrowserVersion().hasFeature(JS_TYPE_ACCEPTS_ARBITRARY_VALUES); + + final String type = getDomNodeOrDie().getAttribute("type"); + if (acceptArbitraryValues + || "1".equals(type) + || "a".equals(type) + || "A".equals(type) + || "i".equals(type) + || "I".equals(type)) { + return type; + } + return ""; + } + + /** + * Sets the value of the "type" property. + * @param type the value of the "type" property + */ + protected void setType(final String type) { + final boolean acceptArbitraryValues = getBrowserVersion().hasFeature(JS_TYPE_ACCEPTS_ARBITRARY_VALUES); + if (acceptArbitraryValues + || "1".equals(type) + || "a".equals(type) + || "A".equals(type) + || "i".equals(type) + || "I".equals(type)) { + getDomNodeOrDie().setAttribute("type", type); + return; + } + + throw Context.reportRuntimeError("Cannot set the type property to invalid value: '" + type + "'"); + } } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLOListElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLOListElement.java 2014-03-07 19:05:20 UTC (rev 9159) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLOListElement.java 2014-03-08 09:47:36 UTC (rev 9160) @@ -16,14 +16,36 @@ import com.gargoylesoftware.htmlunit.html.HtmlOrderedList; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxClass; +import com.gargoylesoftware.htmlunit.javascript.configuration.JsxGetter; +import com.gargoylesoftware.htmlunit.javascript.configuration.JsxSetter; /** * The JavaScript object "HTMLOListElement". * * @version $Revision$ * @author Ahmed Ashour + * @author Ronald Brill */ @JsxClass(domClass = HtmlOrderedList.class) public class HTMLOListElement extends HTMLListElement { + /** + * Returns the value of the <tt>type</tt> attribute. + * + * @return the value of the <tt>type</tt> attribute + */ + @JsxGetter + public String getType() { + return super.getType(); + } + + /** + * Sets the value of the <tt>type</tt> attribute. + * + * @param type the value of the <tt>type</tt> attribute + */ + @JsxSetter + public void setType(final String type) { + super.setType(type); + } } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLUListElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLUListElement.java 2014-03-07 19:05:20 UTC (rev 9159) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLUListElement.java 2014-03-08 09:47:36 UTC (rev 9160) @@ -21,6 +21,8 @@ import com.gargoylesoftware.htmlunit.html.HtmlUnorderedList; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxClass; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxClasses; +import com.gargoylesoftware.htmlunit.javascript.configuration.JsxGetter; +import com.gargoylesoftware.htmlunit.javascript.configuration.JsxSetter; import com.gargoylesoftware.htmlunit.javascript.configuration.WebBrowser; /** @@ -30,11 +32,27 @@ * @author Ahmed Ashour * @author Ronald Brill */ -@JsxClasses ({ - @JsxClass(domClass = HtmlDirectory.class, browsers = { @WebBrowser(value = IE, maxVersion = 9) }), - @JsxClass(domClass = HtmlUnorderedList.class), - @JsxClass(domClass = HtmlMenu.class, browsers = { @WebBrowser(value = IE, maxVersion = 9) }) -}) +@JsxClasses({ + @JsxClass(domClass = HtmlDirectory.class, browsers = { @WebBrowser(value = IE, maxVersion = 9) }), + @JsxClass(domClass = HtmlUnorderedList.class), + @JsxClass(domClass = HtmlMenu.class, browsers = { @WebBrowser(value = IE, maxVersion = 9) }) }) public class HTMLUListElement extends HTMLListElement { + /** + * Returns the value of the <tt>type</tt> attribute. + * @return the value of the <tt>type</tt> attribute + */ + @JsxGetter + public String getType() { + return super.getType(); + } + + /** + * Sets the value of the <tt>type</tt> attribute. + * @param type the value of the <tt>type</tt> attribute + */ + @JsxSetter + public void setType(final String type) { + super.setType(type); + } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDirectoryElementTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDirectoryElementTest.java 2014-03-07 19:05:20 UTC (rev 9159) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDirectoryElementTest.java 2014-03-08 09:47:36 UTC (rev 9160) @@ -14,6 +14,8 @@ */ package com.gargoylesoftware.htmlunit.javascript.host.html; +import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.FF; + import org.junit.Test; import org.junit.runner.RunWith; import org.openqa.selenium.By; @@ -118,7 +120,7 @@ "null", "", "blah", "A", "1", "a", "A", "i", "I", "u" }, IE8 = { "", "", "", "A", "", "", "blah", "A", "1", "a", "A", "i", "I", "exception", "I" }, IE11 = { "", "", "", "A", "null", "", "blah", "A", "1", "a", "A", "i", "I", "exception", "I" }) - @NotYetImplemented + @NotYetImplemented(FF) public void type() throws Exception { final String html = "<html>\n" Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLOListElementTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLOListElementTest.java 2014-03-07 19:05:20 UTC (rev 9159) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLOListElementTest.java 2014-03-08 09:47:36 UTC (rev 9160) @@ -23,7 +23,6 @@ import com.gargoylesoftware.htmlunit.BrowserRunner; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; -import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; import com.gargoylesoftware.htmlunit.WebDriverTestCase; import com.gargoylesoftware.htmlunit.html.HtmlOrderedList; @@ -117,7 +116,6 @@ @Alerts(DEFAULT = { "", "", "blah", "A", "null", "", "blah", "A", "1", "a", "A", "i", "I", "u" }, IE8 = { "", "", "", "A", "", "", "blah", "A", "1", "a", "A", "i", "I", "exception", "I" }, IE11 = { "", "", "", "A", "null", "", "blah", "A", "1", "a", "A", "i", "I", "exception", "I" }) - @NotYetImplemented public void type() throws Exception { final String html = "<html>\n" Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLUListElementTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLUListElementTest.java 2014-03-07 19:05:20 UTC (rev 9159) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLUListElementTest.java 2014-03-08 09:47:36 UTC (rev 9160) @@ -23,7 +23,6 @@ import com.gargoylesoftware.htmlunit.BrowserRunner; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; -import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; import com.gargoylesoftware.htmlunit.WebDriverTestCase; import com.gargoylesoftware.htmlunit.html.HtmlUnorderedList; @@ -118,7 +117,6 @@ @Alerts(DEFAULT = { "", "", "blah", "A", "null", "", "blah", "A", "1", "a", "A", "i", "I", "u" }, IE8 = { "", "", "", "A", "", "", "blah", "A", "1", "a", "A", "i", "I", "exception", "I" }, IE11 = { "", "", "", "A", "null", "", "blah", "A", "1", "a", "A", "i", "I", "exception", "I" }) - @NotYetImplemented public void type() throws Exception { final String html = "<html>\n" |
From: <rb...@us...> - 2014-03-11 17:37:59
|
Revision: 9173 http://sourceforge.net/p/htmlunit/code/9173 Author: rbri Date: 2014-03-11 17:37:56 +0000 (Tue, 11 Mar 2014) Log Message: ----------- refactoring: cleanup our cookie handling, now the manager takes care of its own state. This solves some problems introduced by the use of the new HttpClient api (background: the httpContext is not thread save but we share the context between our threads) Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/CookieManager.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CookieManagerTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-03-11 14:34:03 UTC (rev 9172) +++ trunk/htmlunit/src/changes/changes.xml 2014-03-11 17:37:56 UTC (rev 9173) @@ -8,6 +8,11 @@ <body> <release version="2.15" date="???" description="Bugfixes"> + <action type="update" dev="rbri"> + INCOMPATIBLE CHANGE: All public methods of CookieManager are taking care of the isCookiesEnabled() + state. Subclasses have to do the same. This was done as part of the migration to the new HttpClient + api. + </action> <action type="fix" dev="mguillem" issue="1562"> HTML parsing: unknown closing tags can't close any other unknown tags. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/CookieManager.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/CookieManager.java 2014-03-11 14:34:03 UTC (rev 9172) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/CookieManager.java 2014-03-11 17:37:56 UTC (rev 9173) @@ -36,11 +36,15 @@ /** * Manages cookies for a {@link WebClient}. This class is thread-safe. + * You can disable Cookies by calling setCookiesEnabled(false). The + * CookieManager itself takes care of this and ignores all cookie request if + * disabled. If you override this your methods have to do the same. * * @version $Revision$ * @author Daniel Gredler * @author Ahmed Ashour * @author Nicolas Belisle + * @author Ronald Brill */ public class CookieManager implements Serializable { @@ -85,19 +89,29 @@ /** * Returns the currently configured cookies, in an unmodifiable set. + * If disabled, this returns an empty set. * @return the currently configured cookies, in an unmodifiable set */ public synchronized Set<Cookie> getCookies() { + if (!isCookiesEnabled()) { + return Collections.<Cookie>emptySet(); + } + final Set<Cookie> copy = new HashSet<Cookie>(cookies_); return Collections.unmodifiableSet(copy); } /** * Returns the currently configured cookies applicable to the specified URL, in an unmodifiable set. + * If disabled, this returns an empty set. * @param url the URL on which to filter the returned cookies * @return the currently configured cookies applicable to the specified URL, in an unmodifiable set */ public synchronized Set<Cookie> getCookies(final URL url) { + if (!isCookiesEnabled()) { + return Collections.<Cookie>emptySet(); + } + final String host = url.getHost(); final String path = url.getPath(); final String protocol = url.getProtocol(); @@ -130,10 +144,15 @@ /** * Clears all cookies that have expired before supplied date. + * If disabled, this returns false. * @param date the date to use for comparison when clearing expired cookies * @return whether any cookies were found expired, and were cleared */ public synchronized boolean clearExpired(final Date date) { + if (!isCookiesEnabled()) { + return false; + } + if (date == null) { return false; } @@ -166,10 +185,15 @@ /** * Returns the currently configured cookie with the specified name, or <tt>null</tt> if one does not exist. + * If disabled, this returns null. * @param name the name of the cookie to return * @return the currently configured cookie with the specified name, or <tt>null</tt> if one does not exist */ public synchronized Cookie getCookie(final String name) { + if (!isCookiesEnabled()) { + return null; + } + for (Cookie cookie : cookies_) { if (StringUtils.equals(cookie.getName(), name)) { return cookie; @@ -180,9 +204,14 @@ /** * Adds the specified cookie. + * If disabled, this does nothing. * @param cookie the cookie to add */ public synchronized void addCookie(final Cookie cookie) { + if (!isCookiesEnabled()) { + return; + } + cookies_.remove(cookie); // don't add expired cookie @@ -193,16 +222,26 @@ /** * Removes the specified cookie. + * If disabled, this does nothing. * @param cookie the cookie to remove */ public synchronized void removeCookie(final Cookie cookie) { + if (!isCookiesEnabled()) { + return; + } + cookies_.remove(cookie); } /** * Removes all cookies. + * If disabled, this does nothing. */ public synchronized void clearCookies() { + if (!isCookiesEnabled()) { + return; + } + cookies_.clear(); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2014-03-11 14:34:03 UTC (rev 9172) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2014-03-11 17:37:56 UTC (rev 9173) @@ -391,26 +391,6 @@ httpClient.setDefaultCredentialsProvider(credentialsProvider); httpContext_.removeAttribute(HttpClientContext.CREDS_PROVIDER); - if (webClient_.getCookieManager().isCookiesEnabled()) { - // Cookies are enabled. Note that it's important that we enable single cookie headers, - // for compatibility purposes. - httpClient.setDefaultCookieStore(new HtmlUnitCookieStore(webClient_.getCookieManager())); - } - else { - // Cookies are disabled. - httpClient.setDefaultCookieStore(new CookieStore() { - public void addCookie(final Cookie cookie) { /* empty */ } - public void clear() { /* empty */ } - public boolean clearExpired(final Date date) { - return false; - } - public List<Cookie> getCookies() { - return Collections.<Cookie>emptyList(); - } - }); - } - httpContext_.removeAttribute(HttpClientContext.COOKIE_STORE); - return httpMethod; } @@ -557,6 +537,8 @@ registeryBuilder.register(HACKED_COOKIE_POLICY, htmlUnitCookieSpecProvider_); httpClientBuilder_.setDefaultCookieSpecRegistry(registeryBuilder.build()); + + httpClientBuilder_.setDefaultCookieStore(new HtmlUnitCookieStore(webClient_.getCookieManager())); } return httpClientBuilder_; Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CookieManagerTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CookieManagerTest.java 2014-03-11 14:34:03 UTC (rev 9172) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CookieManagerTest.java 2014-03-11 17:37:56 UTC (rev 9173) @@ -82,22 +82,32 @@ mgr.clearCookies(); assertTrue(mgr.getCookies().isEmpty()); + // Add a cookie before disabling cookies. + mgr.addCookie(cookie); + assertEquals(1, mgr.getCookies().size()); + // Disable cookies. mgr.setCookiesEnabled(false); assertFalse(mgr.isCookiesEnabled()); + assertEquals(0, mgr.getCookies().size()); + // Add a cookie after disabling cookies. final Cookie cookie2 = new Cookie("a", "b", "c", "d", new Date(System.currentTimeMillis() + 5000), false); - - // Add a cookie after disabling cookies. - mgr.addCookie(cookie); mgr.addCookie(cookie2); - assertEquals(2, mgr.getCookies().size()); + assertEquals(0, mgr.getCookies().size()); + assertFalse(mgr.clearExpired(new Date(System.currentTimeMillis() + 10000))); // Enable cookies again. mgr.setCookiesEnabled(true); assertTrue(mgr.isCookiesEnabled()); + assertEquals(1, mgr.getCookies().size()); // Clear expired cookies + assertFalse(mgr.clearExpired(new Date(System.currentTimeMillis() + 10000))); + assertEquals(1, mgr.getCookies().size()); + + mgr.addCookie(cookie2); + assertEquals(2, mgr.getCookies().size()); assertTrue(mgr.clearExpired(new Date(System.currentTimeMillis() + 10000))); assertEquals(1, mgr.getCookies().size()); } |
From: <rb...@us...> - 2014-03-12 19:46:50
|
Revision: 9175 http://sourceforge.net/p/htmlunit/code/9175 Author: rbri Date: 2014-03-12 19:46:46 +0000 (Wed, 12 Mar 2014) Log Message: ----------- more GC friendly finalizer for the ImageInputStream Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlImage.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-03-11 22:19:27 UTC (rev 9174) +++ trunk/htmlunit/src/changes/changes.xml 2014-03-12 19:46:46 UTC (rev 9175) @@ -8,6 +8,10 @@ <body> <release version="2.15" date="???" description="Bugfixes"> + <action type="fix" dev="rbri" issue="1583" due-to="Carsten"> + Optimized image data handling; the finalizer needed for the ImageInputStream + no longer stops the image node itself from being gc'ed. + </action> <action type="update" dev="rbri"> INCOMPATIBLE CHANGE: All public methods of CookieManager are taking care of the isCookiesEnabled() state. Subclasses have to do the same. This was done as part of the migration to the new HttpClient Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlImage.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlImage.java 2014-03-11 22:19:27 UTC (rev 9174) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlImage.java 2014-03-12 19:46:46 UTC (rev 9175) @@ -61,7 +61,7 @@ private int lastClickX_; private int lastClickY_; private WebResponse imageWebResponse_; - private ImageReader imageReader_; + private ImageData imageData_; private boolean downloaded_; private boolean onloadInvoked_; @@ -332,8 +332,7 @@ * @throws IOException if an error occurs while downloading or reading the image */ public int getHeight() throws IOException { - readImageIfNeeded(); - return imageReader_.getHeight(0); + return getImageReader().getHeight(0); } /** @@ -345,8 +344,7 @@ * @throws IOException if an error occurs while downloading or reading the image */ public int getWidth() throws IOException { - readImageIfNeeded(); - return imageReader_.getWidth(0); + return getImageReader().getWidth(0); } /** @@ -359,7 +357,7 @@ */ public ImageReader getImageReader() throws IOException { readImageIfNeeded(); - return imageReader_; + return imageData_.getImageReader(); } /** @@ -397,22 +395,23 @@ final WebRequest request = new WebRequest(url, accept); request.setAdditionalHeader("Referer", page.getUrl().toExternalForm()); imageWebResponse_ = webclient.loadWebResponse(request); - imageReader_ = null; + imageData_ = null; downloaded_ = true; } } private void readImageIfNeeded() throws IOException { downloadImageIfNeeded(); - if (imageReader_ == null) { + if (imageData_ == null) { final ImageInputStream iis = ImageIO.createImageInputStream(imageWebResponse_.getContentAsStream()); final Iterator<ImageReader> iter = ImageIO.getImageReaders(iis); if (!iter.hasNext()) { iis.close(); throw new IOException("No image detected in response"); } - imageReader_ = iter.next(); - imageReader_.setInput(iis); + final ImageReader imageReader = iter.next(); + imageReader.setInput(iis); + imageData_ = new ImageData(imageReader); } } @@ -493,26 +492,6 @@ } /** - * {@inheritDoc} - */ - @Override - protected void finalize() { - if (imageReader_ != null) { - try { - final ImageInputStream stream = (ImageInputStream) imageReader_.getInput(); - if (stream != null) { - stream.close(); - } - imageReader_.setInput(null); - imageReader_.dispose(); - } - catch (final IOException e) { - LOG.error(e.getMessage() , e); - } - } - } - - /** * <span style="color:red">INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.</span><br/> * * Returns the default display style. @@ -523,4 +502,46 @@ public DisplayStyle getDefaultStyleDisplay() { return DisplayStyle.INLINE; } + + /** + * Wraps the ImageReader for an HtmlImage. This is necessary because an object with a finalize() + * method is only garbage collected after the method has been run. Which causes all referenced + * objects to also not be garbage collected until this happens. Because a HtmlImage references a lot + * of objects which could all be garbage collected without impacting the ImageReader it is better to + * wrap it in another class. + */ + private static final class ImageData { + + private final ImageReader imageReader_; + + public ImageData(final ImageReader imageReader) { + imageReader_ = imageReader; + } + + public ImageReader getImageReader() { + return imageReader_; + } + + /** + * {@inheritDoc} + */ + @Override + protected void finalize() { + if (imageReader_ != null) { + try { + final ImageInputStream stream = (ImageInputStream) imageReader_.getInput(); + if (stream != null) { + stream.close(); + } + } + catch (final IOException e) { + LOG.error(e.getMessage(), e); + } + finally { + imageReader_.setInput(null); + imageReader_.dispose(); + } + } + } + } } |
From: <rb...@us...> - 2014-03-14 18:29:49
|
Revision: 9178 http://sourceforge.net/p/htmlunit/code/9178 Author: rbri Date: 2014-03-14 18:29:43 +0000 (Fri, 14 Mar 2014) Log Message: ----------- window.navigate(url) for IE browsers added Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window3Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-03-13 20:29:17 UTC (rev 9177) +++ trunk/htmlunit/src/changes/changes.xml 2014-03-14 18:29:43 UTC (rev 9178) @@ -8,6 +8,9 @@ <body> <release version="2.15" date="???" description="Bugfixes"> + <action type="add" dev="rbri"> + JavaScript: window.navigate(url) for IE browsers added. + </action> <action type="fix" dev="rbri" issue="1583" due-to="Carsten Steul"> Optimized image data handling; the finalizer needed for the ImageInputStream no longer stops the image node itself from being gc'ed. Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java 2014-03-13 20:29:17 UTC (rev 9177) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java 2014-03-14 18:29:43 UTC (rev 9178) @@ -958,6 +958,17 @@ } /** + * Loads the new HTML document corresponding to the specified URL. + * @param url the location of the new HTML document to load + * @throws IOException if loading the specified location fails + * @see <a href="http://msdn.microsoft.com/en-us/library/ms536638%28VS.85%29.aspx">MSDN Documentation</a> + */ + @JsxFunction(@WebBrowser(IE)) + public void navigate(final String url) throws IOException { + getLocation().assign(url); + } + + /** * Does nothing. * @param width the width offset * @param height the height offset Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window3Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window3Test.java 2014-03-13 20:29:17 UTC (rev 9177) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window3Test.java 2014-03-14 18:29:43 UTC (rev 9178) @@ -52,6 +52,7 @@ * @author Ahmed Ashour * @author Daniel Gredler * @author Frank Danek + * @author Ronald Brill */ @RunWith(BrowserRunner.class) public class Window3Test extends WebDriverTestCase { @@ -1450,4 +1451,28 @@ driver.findElement(By.id("clickme")).click(); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = "First", IE = "Second") + public void navigate() throws Exception { + final String firstContent + = "<html><head><title>First</title><script>\n" + + " function test() {\n" + + " if (window.navigate) {\n" + + " window.navigate('" + URL_SECOND + "');\n" + + " }\n" + + " }\n" + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + final String secondContent = "<html><head><title>Second</title></head><body></body></html>"; + + getMockWebConnection().setResponse(URL_SECOND, secondContent); + + final WebDriver driver = loadPage2(firstContent, URL_FIRST); + assertEquals(getExpectedAlerts()[0], driver.getTitle()); + } } |
From: <rb...@us...> - 2014-03-15 19:40:48
|
Revision: 9181 http://sourceforge.net/p/htmlunit/code/9181 Author: rbri Date: 2014-03-15 19:40:42 +0000 (Sat, 15 Mar 2014) Log Message: ----------- fix table row group initialization (no preset of valign); source element configuration fix Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/TableRowGroup.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLSourceElement.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElementTest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableSectionElementTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/TableRowGroup.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/TableRowGroup.java 2014-03-15 16:42:16 UTC (rev 9180) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/TableRowGroup.java 2014-03-15 19:40:42 UTC (rev 9181) @@ -14,8 +14,6 @@ */ package com.gargoylesoftware.htmlunit.html; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HTMLELEMENT_ALIGN_INVALID; - import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -46,10 +44,6 @@ protected TableRowGroup(final String qualifiedName, final SgmlPage page, final Map<String, DomAttr> attributes) { super(qualifiedName, page, attributes); - final boolean invalidAlign = hasFeature(HTMLELEMENT_ALIGN_INVALID); - if (invalidAlign && !hasAttribute("align")) { - setAttribute("align", "left"); - } } /** Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLSourceElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLSourceElement.java 2014-03-15 16:42:16 UTC (rev 9180) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLSourceElement.java 2014-03-15 19:40:42 UTC (rev 9181) @@ -33,5 +33,13 @@ @JsxClass(domClass = HtmlSource.class, browsers = { @WebBrowser(FF), @WebBrowser(value = IE, minVersion = 11), @WebBrowser(CHROME) }) public class HTMLSourceElement extends HTMLElement { - // nothing so far + + /** + * Returns whether the end tag is forbidden or not. + * @see <a href="http://www.w3.org/TR/html4/index/elements.html">HTML 4 specs</a> + * @return whether the end tag is forbidden or not + */ + protected boolean isEndTagForbidden() { + return true; + } } 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 2014-03-15 16:42:16 UTC (rev 9180) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElementTest.java 2014-03-15 19:40:42 UTC (rev 9181) @@ -4219,7 +4219,6 @@ @Test @Alerts(DEFAULT = "<source>", IE8 = "<source></source>") - @NotYetImplemented({ FF17, FF24 }) public void outerHTML_source() throws Exception { loadPageWithAlerts2(outerHTML("source")); } @@ -4309,7 +4308,6 @@ @Test @Alerts(DEFAULT = "<tbody></tbody>", IE8 = "<TBODY></TBODY>") - @NotYetImplemented({ FF17, FF24 }) public void outerHTML_tbody() throws Exception { loadPageWithAlerts2(outerHTML("tbody")); } @@ -4360,7 +4358,6 @@ @Test @Alerts(DEFAULT = "<tfoot></tfoot>", IE8 = "<TFOOT></TFOOT>") - @NotYetImplemented({ FF17, FF24 }) public void outerHTML_tfoot() throws Exception { loadPageWithAlerts2(outerHTML("tfoot")); } @@ -4371,7 +4368,6 @@ @Test @Alerts(DEFAULT = "<thead></thead>", IE8 = "<THEAD></THEAD>") - @NotYetImplemented({ FF17, FF24 }) public void outerHTML_thead() throws Exception { loadPageWithAlerts2(outerHTML("thead")); } 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-03-15 16:42:16 UTC (rev 9180) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableSectionElementTest.java 2014-03-15 19:40:42 UTC (rev 9181) @@ -41,7 +41,6 @@ @Test @Alerts(DEFAULT = {"", "hello", "left", "hi", "right" }, IE = {"", "error", "", "left", "error", "left", "right" }) - @NotYetImplemented({ FF17, FF24 }) public void align_thead() throws Exception { align("th"); } @@ -52,7 +51,6 @@ @Test @Alerts(DEFAULT = {"", "hello", "left", "hi", "right" }, IE = {"", "error", "", "left", "error", "left", "right" }) - @NotYetImplemented({ FF17, FF24 }) public void align_tbody() throws Exception { align("tb"); } @@ -63,7 +61,6 @@ @Test @Alerts(DEFAULT = {"", "hello", "left", "hi", "right" }, IE = {"", "error", "", "left", "error", "left", "right" }) - @NotYetImplemented({ FF17, FF24 }) public void align_tfoot() throws Exception { align("tf"); } |
From: <rb...@us...> - 2014-03-16 12:07:14
|
Revision: 9187 http://sourceforge.net/p/htmlunit/code/9187 Author: rbri Date: 2014-03-16 12:07:10 +0000 (Sun, 16 Mar 2014) Log Message: ----------- outer html for wbr fixed Modified Paths: -------------- 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/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2014-03-16 12:06:45 UTC (rev 9186) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2014-03-16 12:07:10 UTC (rev 9187) @@ -377,6 +377,8 @@ */ private String chOff_ = ""; + private boolean endTagForbidden_ = false; + /** * Returns the value of the "all" property. * @return the value of the "all" property @@ -414,6 +416,9 @@ createEventHandler(eventName, attr.getValue()); } } + if ("wbr".equalsIgnoreCase(domNode.getLocalName())) { + endTagForbidden_ = true; + } } /** @@ -2870,7 +2875,7 @@ * @return whether the end tag is forbidden or not */ protected boolean isEndTagForbidden() { - return false; + return endTagForbidden_; } /** 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 2014-03-16 12:06:45 UTC (rev 9186) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElementTest.java 2014-03-16 12:07:10 UTC (rev 9187) @@ -4446,7 +4446,6 @@ @Test @Alerts(DEFAULT = "<wbr>", IE8 = "<WBR>") - @NotYetImplemented({ FF17, FF24 }) public void outerHTML_wbr() throws Exception { loadPageWithAlerts2(outerHTML("wbr")); } |
From: <rb...@us...> - 2014-03-20 18:44:30
|
Revision: 9192 http://sourceforge.net/p/htmlunit/code/9192 Author: rbri Date: 2014-03-20 18:44:27 +0000 (Thu, 20 Mar 2014) Log Message: ----------- improve outerHTML parameter processing for null, undefined and empty string Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLBodyElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameSetElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLHeadElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLHtmlElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableCaptionElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableCellElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableColElement.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/HTMLElementTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-03-19 19:13:17 UTC (rev 9191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-03-20 18:44:27 UTC (rev 9192) @@ -1168,11 +1168,15 @@ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_OUTER_HTML_BODY_HEAD_READONLY, + /** element.outerHTML handles null value as string "null" (IE). */ + @BrowserFeature(@WebBrowser(value = IE)) + JS_OUTER_HTML_NULL_AS_STRING, + /** element.outerHTML throws an exception, if the new tag will close * the outer one when parsing the html source (IE). */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) - JS_OUTER_THROW_EXCEPTION_WHEN_CLOSES, + JS_OUTER_HTML_THROW_EXCEPTION_WHEN_CLOSES, /** If <tt>true</tt>, then treat <tt>__parent__</tt> and <tt>__proto__</tt> as special properties. */ @BrowserFeature(@WebBrowser(IE)) Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLBodyElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLBodyElement.java 2014-03-19 19:13:17 UTC (rev 9191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLBodyElement.java 2014-03-20 18:44:27 UTC (rev 9192) @@ -206,7 +206,7 @@ */ @JsxSetter @Override - public void setOuterHTML(final String value) { + public void setOuterHTML(final Object value) { if (getBrowserVersion().hasFeature(JS_OUTER_HTML_BODY_HEAD_READONLY)) { throw Context.reportRuntimeError("outerHTML is read-only for tag 'body'"); } 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 2014-03-19 19:13:17 UTC (rev 9191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2014-03-20 18:44:27 UTC (rev 9192) @@ -34,7 +34,8 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_INNER_HTML_REDUCE_WHITESPACES; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_NATIVE_FUNCTION_TOSTRING_NEW_LINE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_OFFSET_PARENT_THROWS_NOT_ATTACHED; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_OUTER_THROW_EXCEPTION_WHEN_CLOSES; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_OUTER_HTML_THROW_EXCEPTION_WHEN_CLOSES; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_OUTER_HTML_NULL_AS_STRING; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_PREFIX_RETURNS_EMPTY_WHEN_UNDEFINED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_SET_ATTRIBUTE_SUPPORTS_EVENT_HANDLERS; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WIDTH_HEIGHT_ACCEPTS_ARBITRARY_VALUES; @@ -1036,11 +1037,22 @@ * @param value the new value for replacing this element */ @JsxSetter - public void setOuterHTML(final String value) { + public void setOuterHTML(final Object value) { final DomNode domNode = getDomNodeOrDie(); + + if (value == null && !getBrowserVersion().hasFeature(JS_OUTER_HTML_NULL_AS_STRING)) { + domNode.remove(); + return; + } + final String valueStr = Context.toString(value); + if (valueStr.isEmpty()) { + domNode.remove(); + return; + } + final DomNode parent = domNode.getParentNode(); + final DomNode nextSibling = domNode.getNextSibling(); - domNode.remove(); final DomNode target; @@ -1057,14 +1069,14 @@ final DomNode proxyDomNode = new ProxyDomNode(target.getPage(), target, append) { @Override public DomNode appendChild(final org.w3c.dom.Node node) { - if (getBrowserVersion().hasFeature(JS_OUTER_THROW_EXCEPTION_WHEN_CLOSES) + if (getBrowserVersion().hasFeature(JS_OUTER_HTML_THROW_EXCEPTION_WHEN_CLOSES) && node instanceof DomElement) { final String parentName = parent.getNodeName().toUpperCase(Locale.ENGLISH); final short[] closes = HTMLElements.getElement(node.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 + throw Context.reportRuntimeError("outerHTML can not set '" + valueStr + "' while its parent is " + domNode.getParentNode()); } } @@ -1074,7 +1086,7 @@ return super.appendChild(node); } }; - parseHtmlSnippet(proxyDomNode, value); + parseHtmlSnippet(proxyDomNode, valueStr); } /** Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameSetElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameSetElement.java 2014-03-19 19:13:17 UTC (rev 9191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameSetElement.java 2014-03-20 18:44:27 UTC (rev 9192) @@ -109,7 +109,7 @@ */ @JsxSetter @Override - public void setOuterHTML(final String value) { + public void setOuterHTML(final Object value) { throw Context.reportRuntimeError("outerHTML is read-only for tag 'frameset'"); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLHeadElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLHeadElement.java 2014-03-19 19:13:17 UTC (rev 9191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLHeadElement.java 2014-03-20 18:44:27 UTC (rev 9192) @@ -38,7 +38,7 @@ */ @JsxSetter @Override - public void setOuterHTML(final String value) { + public void setOuterHTML(final Object value) { if (getBrowserVersion().hasFeature(JS_OUTER_HTML_BODY_HEAD_READONLY)) { throw Context.reportRuntimeError("outerHTML is read-only for tag 'html'"); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLHtmlElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLHtmlElement.java 2014-03-19 19:13:17 UTC (rev 9191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLHtmlElement.java 2014-03-20 18:44:27 UTC (rev 9192) @@ -81,7 +81,7 @@ */ @JsxSetter @Override - public void setOuterHTML(final String value) { + public void setOuterHTML(final Object value) { throw Context.reportRuntimeError("outerHTML is read-only for tag 'html'"); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableCaptionElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableCaptionElement.java 2014-03-19 19:13:17 UTC (rev 9191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableCaptionElement.java 2014-03-20 18:44:27 UTC (rev 9192) @@ -99,7 +99,7 @@ */ @JsxSetter @Override - public void setOuterHTML(final String value) { + public void setOuterHTML(final Object value) { throw Context.reportRuntimeError("outerHTML is read-only for tag 'caption'"); } } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableCellElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableCellElement.java 2014-03-19 19:13:17 UTC (rev 9191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableCellElement.java 2014-03-20 18:44:27 UTC (rev 9192) @@ -343,7 +343,7 @@ */ @JsxSetter @Override - public void setOuterHTML(final String value) { + public void setOuterHTML(final Object value) { throw Context.reportRuntimeError("outerHTML is read-only for tag '" + getDomNodeOrDie().getTagName() + "'"); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableColElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableColElement.java 2014-03-19 19:13:17 UTC (rev 9191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableColElement.java 2014-03-20 18:44:27 UTC (rev 9192) @@ -115,7 +115,7 @@ */ @JsxSetter @Override - public void setOuterHTML(final String value) { + public void setOuterHTML(final Object value) { throw Context.reportRuntimeError("outerHTML is read-only for tag '" + getDomNodeOrDie().getNodeName() + "'"); } 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-03-19 19:13:17 UTC (rev 9191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableRowElement.java 2014-03-20 18:44:27 UTC (rev 9192) @@ -199,7 +199,7 @@ */ @JsxSetter @Override - public void setOuterHTML(final String value) { + public void setOuterHTML(final Object value) { throw Context.reportRuntimeError("outerHTML is read-only for tag 'tr'"); } 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-03-19 19:13:17 UTC (rev 9191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTableSectionElement.java 2014-03-20 18:44:27 UTC (rev 9192) @@ -129,7 +129,7 @@ */ @JsxSetter @Override - public void setOuterHTML(final String value) { + public void setOuterHTML(final Object value) { throw Context.reportRuntimeError("outerHTML is read-only for tag '" + getDomNodeOrDie().getNodeName() + "'"); } 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 2014-03-19 19:13:17 UTC (rev 9191) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElementTest.java 2014-03-20 18:44:27 UTC (rev 9192) @@ -1092,12 +1092,61 @@ } /** + * Test setting outerHTML to null. + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = ", "Childs: 0" }, + IE11 = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = null", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = null", "Childs: 1" }) + public void setOuterHTMLNull() throws Exception { + final String html = createPageForSetOuterHTML("div", null); + loadPageWithAlerts2(html); + } + + /** + * Test setting outerHTML to null. + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = undefined", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = undefined", "Childs: 1" }) + public void setOuterHTMLUndefined() throws Exception { + final String html = createPageForSetOuterHTML("div", "undefined"); + loadPageWithAlerts2(html); + } + + /** + * Test setting outerHTML to ''. + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = ", "Childs: 0" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = ", "Childs: 0" }) + public void setOuterHTMLEmpty() throws Exception { + final String html = createPageForSetOuterHTML("div", ""); + loadPageWithAlerts2(html); + } + + /** + * Test setting outerHTML to ''. + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = ", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = ", "Childs: 0" }) + public void setOuterHTMLBlank() throws Exception { + final String html = createPageForSetOuterHTML("div", " "); + loadPageWithAlerts2(html); + } + + /** * Test setting <code>outerHTML</code> of a <code>div</code> (block) to a text. * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = New cell value" }, - IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = New cell value" }) + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = New cell value", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = New cell value", "Childs: 1" }) public void setOuterHTMLAddTextToBlock() throws Exception { final String html = createPageForSetOuterHTML("div", "New cell value"); loadPageWithAlerts2(html); @@ -1108,8 +1157,8 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = New cell value" }, - IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = New cell value" }) + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = New cell value", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = New cell value", "Childs: 1" }) public void setOuterHTMLAddTextToInline() throws Exception { final String html = createPageForSetOuterHTML("span", "New cell value"); loadPageWithAlerts2(html); @@ -1120,8 +1169,8 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <div>test</div>" }, - IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <DIV>test</DIV>" }) + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <div>test</div>", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <DIV>test</DIV>", "Childs: 1" }) public void setOuterHTMLAddBlockToBlock() throws Exception { final String html = createPageForSetOuterHTML("div", "<div>test</div>"); loadPageWithAlerts2(html); @@ -1132,8 +1181,8 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <div>test</div>" }, - IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <DIV>test</DIV>" }) + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <div>test</div>", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <DIV>test</DIV>", "Childs: 1" }) public void setOuterHTMLAddBlockToInline() throws Exception { final String html = createPageForSetOuterHTML("span", "<div>test</div>"); loadPageWithAlerts2(html); @@ -1144,8 +1193,8 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <span>test</span>" }, - IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <SPAN>test</SPAN>" }) + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <span>test</span>", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <SPAN>test</SPAN>", "Childs: 1" }) public void setOuterHTMLAddInlineToInline() throws Exception { final String html = createPageForSetOuterHTML("span", "<span>test</span>"); loadPageWithAlerts2(html); @@ -1156,8 +1205,8 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <span>test</span>" }, - IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <SPAN>test</SPAN>" }) + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <span>test</span>", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <SPAN>test</SPAN>", "Childs: 1" }) public void setOuterHTMLAddInlineToBlock() throws Exception { final String html = createPageForSetOuterHTML("div", "<span>test</span>"); loadPageWithAlerts2(html); @@ -1168,8 +1217,8 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <br>" }, - IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <BR>" }) + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <br>", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <BR>", "Childs: 1" }) public void setOuterHTMLAddEmpty() throws Exception { final String html = createPageForSetOuterHTML("div", "<br>"); loadPageWithAlerts2(html); @@ -1222,9 +1271,9 @@ */ @Test @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", - "New = <div>test</div>" }, + "New = <div>test</div>", "Childs: 1" }, CHROME = { "Old = <span id=\"innerNode\">Old outerHTML</span>", - "New = <span id=\"innerNode\">Old outerHTML</span>" }, + "New = <span id=\"innerNode\">Old outerHTML</span>", "Childs: 1" }, IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "exception" }) public void setOuterHTMLAddBlockToParagraph() throws Exception { final String html = createPageForSetOuterHTML("p", "<div>test</div>"); @@ -1238,9 +1287,9 @@ */ @Test @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", - "New = <p>test</p>" }, + "New = <p>test</p>", "Childs: 1" }, CHROME = { "Old = <span id=\"innerNode\">Old outerHTML</span>", - "New = <span id=\"innerNode\">Old outerHTML</span>" }, + "New = <span id=\"innerNode\">Old outerHTML</span>", "Childs: 1" }, IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "exception" }) public void setOuterHTMLAddParagraphToParagraph() throws Exception { final String html = createPageForSetOuterHTML("p", "<p>test</p>"); @@ -1253,8 +1302,8 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <p>test</p>" }, - IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <P>test</P>" }) + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <p>test</p>", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <P>test</P>", "Childs: 1" }) public void setOuterHTMLAddUnclosedParagraph() throws Exception { final String html = createPageForSetOuterHTML("div", "<p>test"); loadPageWithAlerts2(html); @@ -1267,9 +1316,9 @@ */ @Test @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", - "New = <a>test</a>" }, + "New = <a>test</a>", "Childs: 1" }, CHROME = { "Old = <span id=\"innerNode\">Old outerHTML</span>", - "New = <span id=\"innerNode\">Old outerHTML</span>" }, + "New = <span id=\"innerNode\">Old outerHTML</span>", "Childs: 1" }, IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "exception" }) public void setOuterHTMLAddAnchorToAnchor() throws Exception { final String html = createPageForSetOuterHTML("a", "<a>test</a>"); @@ -1281,8 +1330,8 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <div></div>" }, - IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <DIV></DIV>" }) + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <div></div>", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <DIV></DIV>", "Childs: 1" }) public void setOuterHTMLAddSelfClosingBlock() throws Exception { final String html = createPageForSetOuterHTML("div", "<div/>"); loadPageWithAlerts2(html); @@ -1294,10 +1343,11 @@ */ @Test @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", - "New = <div><div></div></div>" }, - CHROME = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <div></div><div></div>" }, - IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <DIV></DIV><DIV></DIV>" }) - @NotYetImplemented({ FF17, FF24 }) + "New = <div><div></div></div>", "Childs: 1" }, + CHROME = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <div></div><div></div>", + "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <DIV></DIV><DIV></DIV>", "Childs: 1" }) + @NotYetImplemented({ FF17, FF24, IE8 }) public void setOuterHTMLAddMultipleSelfClosingBlock() throws Exception { final String html = createPageForSetOuterHTML("div", "<div/><div>"); loadPageWithAlerts2(html); @@ -1308,8 +1358,8 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <span></span>" }, - IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <SPAN></SPAN>" }) + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <span></span>", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <SPAN></SPAN>", "Childs: 1" }) public void setOuterHTMLAddSelfClosingInline() throws Exception { final String html = createPageForSetOuterHTML("div", "<span/>"); loadPageWithAlerts2(html); @@ -1320,14 +1370,21 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <br>" }, - IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <BR>" }) + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = <br>", "Childs: 1" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = <BR>", "Childs: 1" }) public void setOuterHTMLAddSelfClosingEmpty() throws Exception { final String html = createPageForSetOuterHTML("div", "<br/>"); loadPageWithAlerts2(html); } private String createPageForSetOuterHTML(final String nodeTag, final String newValue) { + String newVal = "null"; + if ("undefined".equals(newValue)) { + newVal = "undefined"; + } + else if (newValue != null) { + newVal = "'" + newValue + "'"; + } return "<html>\n" + "<head>\n" + " <title>test</title>\n" @@ -1337,8 +1394,9 @@ + " var innerNode = document.getElementById('innerNode');\n" + " alert('Old = ' + myNode.innerHTML);\n" + " try {\n" - + " innerNode.outerHTML = '" + newValue + "';\n" + + " innerNode.outerHTML = " + newVal + ";\n" + " alert('New = ' + myNode.innerHTML);\n" + + " alert('Childs: ' + myNode.childNodes.length);\n" + " } catch(e) {alert('exception'); }\n" + " }\n" + " </script>\n" |
From: <rb...@us...> - 2014-03-20 20:20:55
|
Revision: 9194 http://sourceforge.net/p/htmlunit/code/9194 Author: rbri Date: 2014-03-20 20:20:52 +0000 (Thu, 20 Mar 2014) Log Message: ----------- setting outerHTML now works also for detached elements Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.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 2014-03-20 18:51:04 UTC (rev 9193) +++ trunk/htmlunit/src/changes/changes.xml 2014-03-20 20:20:52 UTC (rev 9194) @@ -8,6 +8,9 @@ <body> <release version="2.15" date="???" description="Bugfixes"> + <action type="add" dev="rbri" issue="1584" > + JavaScript: setting outerHTML now works also for detached elements. + </action> <action type="add" dev="rbri"> JavaScript: window.navigate(url) for IE browsers added. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-03-20 18:51:04 UTC (rev 9193) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-03-20 20:20:52 UTC (rev 9194) @@ -1172,6 +1172,10 @@ @BrowserFeature(@WebBrowser(value = IE)) JS_OUTER_HTML_NULL_AS_STRING, + /** element.outerHTML removes all children from detached node (IE). */ + @BrowserFeature(@WebBrowser(value = IE)) + JS_OUTER_HTML_REMOVES_CHILDS_FOR_DETACHED, + /** element.outerHTML throws an exception, if the new tag will close * the outer one when parsing the html source (IE). */ 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 2014-03-20 18:51:04 UTC (rev 9193) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2014-03-20 20:20:52 UTC (rev 9194) @@ -34,8 +34,9 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_INNER_HTML_REDUCE_WHITESPACES; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_NATIVE_FUNCTION_TOSTRING_NEW_LINE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_OFFSET_PARENT_THROWS_NOT_ATTACHED; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_OUTER_HTML_NULL_AS_STRING; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_OUTER_HTML_REMOVES_CHILDS_FOR_DETACHED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_OUTER_HTML_THROW_EXCEPTION_WHEN_CLOSES; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_OUTER_HTML_NULL_AS_STRING; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_PREFIX_RETURNS_EMPTY_WHEN_UNDEFINED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_SET_ATTRIBUTE_SUPPORTS_EVENT_HANDLERS; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WIDTH_HEIGHT_ACCEPTS_ARBITRARY_VALUES; @@ -1039,6 +1040,13 @@ @JsxSetter public void setOuterHTML(final Object value) { final DomNode domNode = getDomNodeOrDie(); + final DomNode parent = domNode.getParentNode(); + if (null == parent) { + if (getBrowserVersion().hasFeature(JS_OUTER_HTML_REMOVES_CHILDS_FOR_DETACHED)) { + domNode.removeAllChildren(); + } + return; + } if (value == null && !getBrowserVersion().hasFeature(JS_OUTER_HTML_NULL_AS_STRING)) { domNode.remove(); @@ -1050,8 +1058,6 @@ return; } - final DomNode parent = domNode.getParentNode(); - final DomNode nextSibling = domNode.getNextSibling(); 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 2014-03-20 18:51:04 UTC (rev 9193) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElementTest.java 2014-03-20 20:20:52 UTC (rev 9194) @@ -1408,9 +1408,179 @@ } /** + * Test setting <code>outerHTML</code> to two XHTML self-closing <code>div</code> (block). * @throws Exception if the test fails */ @Test + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", + "New = <span id=\"innerNode\">Old outerHTML</span>", "Childs: 1" }, + CHROME = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "exception" }, + IE11 = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = ", "Childs: 0" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = ", "Childs: 0" }) + public void setOuterHTMLDetachedElementNull() throws Exception { + final String html = "<html>\n" + + "<head>\n" + + " <title>test</title>\n" + + " <script>\n" + + " function doTest(){\n" + + " var myNode = document.getElementById('myNode');\n" + + " document.body.removeChild(myNode);\n" + + " alert('Old = ' + myNode.innerHTML);\n" + + " try {\n" + + " myNode.outerHTML = null;\n" + + " alert('New = ' + myNode.innerHTML);\n" + + " alert('Childs: ' + myNode.childNodes.length);\n" + + " } catch(e) {alert('exception'); }\n" + + " }\n" + + " </script>\n" + + "</head>\n" + + "<body onload='doTest()'>\n" + + " <div id='myNode'><span id='innerNode'>Old outerHTML</span></div>\n" + + "</body>\n" + + "</html>"; + loadPageWithAlerts2(html); + } + + /** + * Test setting <code>outerHTML</code> to two XHTML self-closing <code>div</code> (block). + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", + "New = <span id=\"innerNode\">Old outerHTML</span>", "Childs: 1" }, + CHROME = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "exception" }, + IE11 = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = ", "Childs: 0" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = ", "Childs: 0" }) + public void setOuterHTMLDetachedElementUndefined() throws Exception { + final String html = "<html>\n" + + "<head>\n" + + " <title>test</title>\n" + + " <script>\n" + + " function doTest(){\n" + + " var myNode = document.getElementById('myNode');\n" + + " document.body.removeChild(myNode);\n" + + " alert('Old = ' + myNode.innerHTML);\n" + + " try {\n" + + " myNode.outerHTML = undefined;\n" + + " alert('New = ' + myNode.innerHTML);\n" + + " alert('Childs: ' + myNode.childNodes.length);\n" + + " } catch(e) {alert('exception'); }\n" + + " }\n" + + " </script>\n" + + "</head>\n" + + "<body onload='doTest()'>\n" + + " <div id='myNode'><span id='innerNode'>Old outerHTML</span></div>\n" + + "</body>\n" + + "</html>"; + loadPageWithAlerts2(html); + } + + /** + * Test setting <code>outerHTML</code> to two XHTML self-closing <code>div</code> (block). + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", + "New = <span id=\"innerNode\">Old outerHTML</span>", "Childs: 1" }, + CHROME = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "exception" }, + IE11 = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = ", "Childs: 0" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = ", "Childs: 0" }) + public void setOuterHTMLDetachedElementEmpty() throws Exception { + final String html = "<html>\n" + + "<head>\n" + + " <title>test</title>\n" + + " <script>\n" + + " function doTest(){\n" + + " var myNode = document.getElementById('myNode');\n" + + " document.body.removeChild(myNode);\n" + + " alert('Old = ' + myNode.innerHTML);\n" + + " try {\n" + + " myNode.outerHTML = '';\n" + + " alert('New = ' + myNode.innerHTML);\n" + + " alert('Childs: ' + myNode.childNodes.length);\n" + + " } catch(e) {alert('exception'); }\n" + + " }\n" + + " </script>\n" + + "</head>\n" + + "<body onload='doTest()'>\n" + + " <div id='myNode'><span id='innerNode'>Old outerHTML</span></div>\n" + + "</body>\n" + + "</html>"; + loadPageWithAlerts2(html); + } + + /** + * Test setting <code>outerHTML</code> to two XHTML self-closing <code>div</code> (block). + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", + "New = <span id=\"innerNode\">Old outerHTML</span>", "Childs: 1" }, + CHROME = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "exception" }, + IE11 = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = ", "Childs: 0" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = ", "Childs: 0" }) + public void setOuterHTMLDetachedElementBlank() throws Exception { + final String html = "<html>\n" + + "<head>\n" + + " <title>test</title>\n" + + " <script>\n" + + " function doTest(){\n" + + " var myNode = document.getElementById('myNode');\n" + + " document.body.removeChild(myNode);\n" + + " alert('Old = ' + myNode.innerHTML);\n" + + " try {\n" + + " myNode.outerHTML = '';\n" + + " alert('New = ' + myNode.innerHTML);\n" + + " alert('Childs: ' + myNode.childNodes.length);\n" + + " } catch(e) {alert('exception'); }\n" + + " }\n" + + " </script>\n" + + "</head>\n" + + "<body onload='doTest()'>\n" + + " <div id='myNode'><span id='innerNode'>Old outerHTML</span></div>\n" + + "</body>\n" + + "</html>"; + loadPageWithAlerts2(html); + } + + /** + * Test setting <code>outerHTML</code> to two XHTML self-closing <code>div</code> (block). + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "Old = <span id=\"innerNode\">Old outerHTML</span>", + "New = <span id=\"innerNode\">Old outerHTML</span>", "Childs: 1" }, + CHROME = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "exception" }, + IE = { "Old = <span id=\"innerNode\">Old outerHTML</span>", "New = ", "Childs: 0" }, + IE8 = { "Old = <SPAN id=innerNode>Old outerHTML</SPAN>", "New = ", "Childs: 0" }) + public void setOuterHTMLDetachedElement() throws Exception { + final String html = "<html>\n" + + "<head>\n" + + " <title>test</title>\n" + + " <script>\n" + + " function doTest(){\n" + + " var myNode = document.getElementById('myNode');\n" + + " document.body.removeChild(myNode);\n" + + " alert('Old = ' + myNode.innerHTML);\n" + + " try {\n" + + " myNode.outerHTML = '<p>test</p>';\n" + + " alert('New = ' + myNode.innerHTML);\n" + + " alert('Childs: ' + myNode.childNodes.length);\n" + + " } catch(e) {alert('exception'); }\n" + + " }\n" + + " </script>\n" + + "</head>\n" + + "<body onload='doTest()'>\n" + + " <div id='myNode'><span id='innerNode'>Old outerHTML</span></div>\n" + + "</body>\n" + + "</html>"; + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test public void setOuterHTMLExecuteJavaScript() throws Exception { final String html = HtmlPageTest.STANDARDS_MODE_PREFIX_ + "<html><head><title>foo</title><script>\n" |
From: <rb...@us...> - 2014-03-20 21:05:17
|
Revision: 9195 http://sourceforge.net/p/htmlunit/code/9195 Author: rbri Date: 2014-03-20 21:05:13 +0000 (Thu, 20 Mar 2014) Log Message: ----------- File upload content type shouldn't contain charset Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFileInput2Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-03-20 20:20:52 UTC (rev 9194) +++ trunk/htmlunit/src/changes/changes.xml 2014-03-20 21:05:13 UTC (rev 9195) @@ -8,7 +8,10 @@ <body> <release version="2.15" date="???" description="Bugfixes"> - <action type="add" dev="rbri" issue="1584" > + <action type="fix" dev="rbri" issue="1585" due-to="Jakub Kotasek"> + File upload content type shouldn't contain charset. + </action> + <action type="fix" dev="rbri" issue="1584" > JavaScript: setting outerHTML now works also for detached elements. </action> <action type="add" dev="rbri"> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2014-03-20 20:20:52 UTC (rev 9194) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2014-03-20 21:05:13 UTC (rev 9195) @@ -425,7 +425,7 @@ mimeType = "application/octet-stream"; } - final ContentType contentType = ContentType.create(mimeType, pairWithFile.getCharset()); + final ContentType contentType = ContentType.create(mimeType); final File file = pairWithFile.getFile(); if (pairWithFile.getData() != null) { Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFileInput2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFileInput2Test.java 2014-03-20 20:20:52 UTC (rev 9194) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFileInput2Test.java 2014-03-20 21:05:13 UTC (rev 9195) @@ -74,7 +74,10 @@ } driver.findElement(By.name("myInput")).sendKeys(path); driver.findElement(By.id("mySubmit")).click(); - assertTrue(driver.getPageSource().contains("CONTENT_TYPE:application/octet-stream")); + + final String pageSource = driver.getPageSource(); + assertTrue(pageSource.contains("CONTENT_TYPE:application/octet-stream")); + assertFalse(pageSource.contains("charset")); } /** |
From: <mgu...@us...> - 2014-03-21 15:44:56
|
Revision: 9197 http://sourceforge.net/p/htmlunit/code/9197 Author: mguillem Date: 2014-03-21 15:44:52 +0000 (Fri, 21 Mar 2014) Log Message: ----------- JavaScript: allow use of "in" operator with indexes for StaticNodeList and Attr. This makes Angular.js happy [#1559] Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/NamedNodeMap.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/StaticNodeList.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/NamedNodeMap2Test.java Added Paths: ----------- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/StaticNodeListTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-03-21 07:52:31 UTC (rev 9196) +++ trunk/htmlunit/src/changes/changes.xml 2014-03-21 15:44:52 UTC (rev 9197) @@ -8,6 +8,9 @@ <body> <release version="2.15" date="???" description="Bugfixes"> + <action type="fix" dev="mguillem" issue="1559"> + JavaScript: allow use of "in" operator with indexes for StaticNodeList and Attr. + </action> <action type="fix" dev="rbri" issue="1585" due-to="Jakub Kotasek"> File upload content type shouldn't contain charset. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/NamedNodeMap.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/NamedNodeMap.java 2014-03-21 07:52:31 UTC (rev 9196) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/NamedNodeMap.java 2014-03-21 15:44:52 UTC (rev 9197) @@ -252,4 +252,12 @@ } return null; } + + /** + * {@inheritDoc} + */ + @Override + public boolean has(final int index, final Scriptable start) { + return index >= 0 && index < getLength(); + } } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/StaticNodeList.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/StaticNodeList.java 2014-03-21 07:52:31 UTC (rev 9196) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/StaticNodeList.java 2014-03-21 15:44:52 UTC (rev 9197) @@ -86,4 +86,11 @@ return elements_.size(); } + /** + * {@inheritDoc} + */ + @Override + public boolean has(final int index, final Scriptable start) { + return index >= 0 && index < getLength(); + } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/NamedNodeMap2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/NamedNodeMap2Test.java 2014-03-21 07:52:31 UTC (rev 9196) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/NamedNodeMap2Test.java 2014-03-21 15:44:52 UTC (rev 9197) @@ -20,6 +20,7 @@ import com.gargoylesoftware.htmlunit.BrowserRunner; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; import com.gargoylesoftware.htmlunit.WebDriverTestCase; +import com.gargoylesoftware.htmlunit.html.HtmlPageTest; import com.gargoylesoftware.htmlunit.javascript.host.xml.XMLDocumentTest; /** @@ -28,6 +29,7 @@ * @version $Revision$ * @author Ahmed Ashour * @author Frank Danek + * @author Marc Guillemot */ @RunWith(BrowserRunner.class) public class NamedNodeMap2Test extends WebDriverTestCase { @@ -58,4 +60,23 @@ getMockWebConnection().setResponse(URL_SECOND, xml, "text/xml"); loadPageWithAlerts2(html); } + + /** + * @throws Exception on test failure + */ + @Test + @Alerts({ "true", "[object Attr]", "true", "[object Attr]" }) + public void has() throws Exception { + final String html = HtmlPageTest.STANDARDS_MODE_PREFIX_ + "<html ng-app><body>\n" + + "<script>\n" + + "var attributes = document.documentElement.attributes;\n" + + "alert(0 in attributes);\n" + + "alert(attributes[0]);\n" + + "alert('0' in attributes);\n" + + "alert(attributes['0']);\n" + + "</script>\n" + + "</body></html>"; + + loadPageWithAlerts2(html); + } } Added: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/StaticNodeListTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/StaticNodeListTest.java (rev 0) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/StaticNodeListTest.java 2014-03-21 15:44:52 UTC (rev 9197) @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2014 Gargoyle Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.gargoylesoftware.htmlunit.javascript.host; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.gargoylesoftware.htmlunit.BrowserRunner; +import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; +import com.gargoylesoftware.htmlunit.WebDriverTestCase; +import com.gargoylesoftware.htmlunit.html.HtmlPageTest; + +/** + * Tests for {@link StaticNodeList}. + * + * @version $Revision: 8931 $ + * @author Marc Guillemot + */ +@RunWith(BrowserRunner.class) +public class StaticNodeListTest extends WebDriverTestCase { + + /** + * @throws Exception on test failure + */ + @Test + @Alerts({ "true", "[object HTMLHtmlElement]", "true", "[object HTMLHtmlElement]" }) + public void has() throws Exception { + final String html = HtmlPageTest.STANDARDS_MODE_PREFIX_ + "<html><body>\n" + + "<script>\n" + + "var list = document.querySelectorAll('html');\n" + + "alert(0 in list);\n" + + "alert(list[0]);\n" + + "alert('0' in list);\n" + + "alert(list['0']);\n" + + "</script>\n" + + "</body></html>"; + + loadPageWithAlerts2(html); + } +} |
From: <asa...@us...> - 2014-03-22 05:00:20
|
Revision: 9201 http://sourceforge.net/p/htmlunit/code/9201 Author: asashour Date: 2014-03-22 05:00:14 +0000 (Sat, 22 Mar 2014) Log Message: ----------- HttpWebConnection: socket reuse (regression in 2.14). Issue 1577 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/HttpWebConnectionTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-03-22 04:54:54 UTC (rev 9200) +++ trunk/htmlunit/src/changes/changes.xml 2014-03-22 05:00:14 UTC (rev 9201) @@ -8,6 +8,9 @@ <body> <release version="2.15" date="???" description="Bugfixes"> + <action type="fix" dev="asashour" issue="1577"> + HttpWebConnection: socket reuse (regression in 2.14). + </action> <action type="fix" dev="mguillem" issue="1559"> JavaScript: allow use of "in" operator with indexes for StaticNodeList and Attr. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2014-03-22 04:54:54 UTC (rev 9200) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2014-03-22 05:00:14 UTC (rev 9201) @@ -910,6 +910,7 @@ */ final class HtmlUnitHttpClientBuilder { + private static PoolingHttpClientConnectionManager poolingmgr; private HtmlUnitHttpClientBuilder() { } @@ -918,6 +919,10 @@ * <code>socketFactory</code>. */ public static void configureConnectionManager(final HttpClientBuilder builder) { + if (poolingmgr != null) { + builder.setConnectionManager(poolingmgr); + return; + } final ConnectionSocketFactory socketFactory = new SocksConnectionSocketFactory(); LayeredConnectionSocketFactory sslSocketFactory = @@ -957,7 +962,7 @@ } } - final PoolingHttpClientConnectionManager poolingmgr = new PoolingHttpClientConnectionManager( + poolingmgr = new PoolingHttpClientConnectionManager( RegistryBuilder.<ConnectionSocketFactory>create() .register("http", socketFactory) .register("https", sslSocketFactory) Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/HttpWebConnectionTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/HttpWebConnectionTest.java 2014-03-22 04:54:54 UTC (rev 9200) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/HttpWebConnectionTest.java 2014-03-22 05:00:14 UTC (rev 9201) @@ -53,7 +53,6 @@ import org.junit.runner.RunWith; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; -import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider2Test.InMemoryAppender; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.util.KeyDataPair; @@ -444,7 +443,6 @@ * @throws Exception if the test fails */ @Test - @NotYetImplemented public void remotePort() throws Exception { final Map<String, Class<? extends Servlet>> servlets = new HashMap<String, Class<? extends Servlet>>(); servlets.put("/test", RemotePortServlet.class); |
From: <rb...@us...> - 2014-03-25 19:41:48
|
Revision: 9205 http://sourceforge.net/p/htmlunit/code/9205 Author: rbri Date: 2014-03-25 19:41:44 +0000 (Tue, 25 Mar 2014) Log Message: ----------- Cookies: Some fixes for the parsing of the expires date in IE11. Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-03-25 19:28:46 UTC (rev 9204) +++ trunk/htmlunit/src/changes/changes.xml 2014-03-25 19:41:44 UTC (rev 9205) @@ -8,6 +8,9 @@ <body> <release version="2.15" date="???" description="Bugfixes"> + <action type="fix" dev="rbri"> + Cookies: Some fixes for the parsing of the expires date in IE11. + </action> <action type="fix" dev="asashour" issue="1577"> HttpWebConnection: socket reuse (regression in 2.14). </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-03-25 19:28:46 UTC (rev 9204) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-03-25 19:41:44 UTC (rev 9205) @@ -634,6 +634,13 @@ @BrowserFeature(@WebBrowser(IE)) HTML_OBJECT_CLASSID, + /** Indicates that the start date for two digits cookies is 1970 + * instead of 2000 (Two digits years are interpreted as 20xx + * if before 1970 and as 19xx otherwise). + */ + @BrowserFeature({ @WebBrowser(FF), @WebBrowser(value = IE, maxVersion = 10) }) + HTTP_COOKIE_START_DATE_1970, + /** Indicates that "host" HTTP header should be the first. */ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME) }) HTTP_HEADER_HOST_FIRST, Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2014-03-25 19:28:46 UTC (rev 9204) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2014-03-25 19:41:44 UTC (rev 9205) @@ -15,6 +15,7 @@ package com.gargoylesoftware.htmlunit; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HEADER_CONTENT_DISPOSITION_ABSOLUTE_PATH; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HTTP_COOKIE_START_DATE_1970; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HTTP_HEADER_HOST_FIRST; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.URL_AUTH_CREDENTIALS; @@ -148,7 +149,8 @@ htmlUnitCookieSpecProvider_ = new CookieSpecProvider() { @Override public CookieSpec create(final HttpContext context) { - return new HtmlUnitBrowserCompatCookieSpec(webClient_.getIncorrectnessListener()); + return new HtmlUnitBrowserCompatCookieSpec(webClient.getBrowserVersion(), + webClient_.getIncorrectnessListener()); } }; httpContext_ = new HttpClientContext(); @@ -792,7 +794,8 @@ "d/M/yyyy", }; - HtmlUnitBrowserCompatCookieSpec(final IncorrectnessListener incorrectnessListener) { + HtmlUnitBrowserCompatCookieSpec(final BrowserVersion browserVersion, + final IncorrectnessListener incorrectnessListener) { super(); final BasicPathHandler pathHandler = new BasicPathHandler() { @Override @@ -814,7 +817,12 @@ value = value.substring(1, value.length() - 1); } value = value.replaceAll("[ ,:-]+", " "); - cookie.setExpiryDate(DateUtils.parseDate(value, DEFAULT_DATE_PATTERNS, DATE_1_1_1970)); + + Date startDate = null; + if (browserVersion.hasFeature(HTTP_COOKIE_START_DATE_1970)) { + startDate = DATE_1_1_1970; + } + cookie.setExpiryDate(DateUtils.parseDate(value, DEFAULT_DATE_PATTERNS, startDate)); } public boolean match(final Cookie cookie, final CookieOrigin origin) { |
From: <rb...@us...> - 2014-03-25 19:45:53
|
Revision: 9206 http://sourceforge.net/p/htmlunit/code/9206 Author: rbri Date: 2014-03-25 19:45:49 +0000 (Tue, 25 Mar 2014) Log Message: ----------- HashMap corruption (leads to an endless loop) because of concurrent access Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-03-25 19:41:44 UTC (rev 9205) +++ trunk/htmlunit/src/changes/changes.xml 2014-03-25 19:45:49 UTC (rev 9206) @@ -9,6 +9,9 @@ <body> <release version="2.15" date="???" description="Bugfixes"> <action type="fix" dev="rbri"> + HashMap corruption (leads to an endless loop) because of concurrent access. + </action> + <action type="fix" dev="rbri"> Cookies: Some fixes for the parsing of the expires date in IE11. </action> <action type="fix" dev="asashour" issue="1577"> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2014-03-25 19:41:44 UTC (rev 9205) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2014-03-25 19:45:49 UTC (rev 9206) @@ -34,6 +34,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; @@ -144,8 +145,11 @@ private HtmlUnitDOMBuilder builder_; private String originalCharset_; - private Map<String, SortedSet<DomElement>> idMap_ = new HashMap<String, SortedSet<DomElement>>(); - private Map<String, SortedSet<DomElement>> nameMap_ = new HashMap<String, SortedSet<DomElement>>(); + + // use Hashtable instead of HashMap to avoid corruption during concurrent access + private Map<String, SortedSet<DomElement>> idMap_ = new Hashtable<String, SortedSet<DomElement>>(); + private Map<String, SortedSet<DomElement>> nameMap_ = new Hashtable<String, SortedSet<DomElement>>(); + private SortedSet<BaseFrameElement> frameElements_ = new TreeSet<BaseFrameElement>(documentPositionComparator); private HtmlElement elementWithFocus_; private int parserCount_; |
From: <rb...@us...> - 2014-03-25 19:49:07
|
Revision: 9207 http://sourceforge.net/p/htmlunit/code/9207 Author: rbri Date: 2014-03-25 19:48:55 +0000 (Tue, 25 Mar 2014) Log Message: ----------- JavaScript: Some event definitions ignored when simulating IE11. 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/html/HtmlButtonInput2Test.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlButtonInputTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-03-25 19:45:49 UTC (rev 9206) +++ trunk/htmlunit/src/changes/changes.xml 2014-03-25 19:48:55 UTC (rev 9207) @@ -9,6 +9,9 @@ <body> <release version="2.15" date="???" description="Bugfixes"> <action type="fix" dev="rbri"> + JavaScript: Some event definitions ignored when simulating IE11. + </action> + <action type="fix" dev="rbri"> HashMap corruption (leads to an endless loop) because of concurrent access. </action> <action type="fix" dev="rbri"> 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 2014-03-25 19:45:49 UTC (rev 9206) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2014-03-25 19:48:55 UTC (rev 9207) @@ -415,10 +415,11 @@ final HtmlElement htmlElt = (HtmlElement) domNode; for (final DomAttr attr : htmlElt.getAttributesMap().values()) { final String eventName = attr.getName(); - if (eventName.startsWith("on")) { + if (eventName.toLowerCase(Locale.ENGLISH).startsWith("on")) { createEventHandler(eventName, attr.getValue()); } } + if ("wbr".equalsIgnoreCase(domNode.getLocalName())) { endTagForbidden_ = true; } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlButtonInput2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlButtonInput2Test.java 2014-03-25 19:45:49 UTC (rev 9206) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlButtonInput2Test.java 2014-03-25 19:48:55 UTC (rev 9207) @@ -16,6 +16,8 @@ import org.junit.Test; import org.junit.runner.RunWith; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; import com.gargoylesoftware.htmlunit.BrowserRunner; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; @@ -208,4 +210,39 @@ loadPageWithAlerts2(html); } + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("foo") + public void click_onClick() throws Exception { + final String html + = "<html><head><title>foo</title></head><body>\n" + + "<form id='form1' onSubmit='alert(\"bar\")'>\n" + + " <input type='button' name='button' id='button' " + + "onClick='alert(\"foo\")'>Push me</button>\n" + + "</form></body></html>"; + + final WebDriver driver = loadPage2(html); + driver.findElement(By.id("button")).click(); + assertEquals(getExpectedAlerts(), getCollectedAlerts(driver)); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("foo") + public void click_onClickIgnoreCase() throws Exception { + final String html + = "<html><head><title>foo</title></head><body>\n" + + "<form id='form1'>\n" + + " <input type='button' name='button' id='button' " + + "oNclICK='alert(\"foo\")'>Push me</button>\n" + + "</form></body></html>"; + + final WebDriver driver = loadPage2(html); + driver.findElement(By.id("button")).click(); + assertEquals(getExpectedAlerts(), getCollectedAlerts(driver)); + } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlButtonInputTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlButtonInputTest.java 2014-03-25 19:45:49 UTC (rev 9206) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlButtonInputTest.java 2014-03-25 19:48:55 UTC (rev 9207) @@ -54,8 +54,7 @@ final HtmlPage secondPage = button.click(); - final String[] expectedAlerts = {"foo"}; - assertEquals(expectedAlerts, collectedAlerts); + assertEquals(getExpectedAlerts(), collectedAlerts); assertSame(page, secondPage); } |
From: <rb...@us...> - 2014-03-29 13:04:58
|
Revision: 9212 http://sourceforge.net/p/htmlunit/code/9212 Author: rbri Date: 2014-03-29 13:04:54 +0000 (Sat, 29 Mar 2014) Log Message: ----------- Cookies: another fix for IE11. Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CookieManagerTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-03-28 16:08:56 UTC (rev 9211) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-03-29 13:04:54 UTC (rev 9212) @@ -634,6 +634,10 @@ @BrowserFeature(@WebBrowser(IE)) HTML_OBJECT_CLASSID, + /** Additionally support dates in format "d/M/yyyy". */ + @BrowserFeature({ @WebBrowser(FF), @WebBrowser(value = IE, maxVersion = 10) }) + HTTP_COOKIE_EXTENDED_DATE_PATTERNS, + /** Indicates that the start date for two digits cookies is 1970 * instead of 2000 (Two digits years are interpreted as 20xx * if before 1970 and as 19xx otherwise). Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2014-03-28 16:08:56 UTC (rev 9211) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2014-03-29 13:04:54 UTC (rev 9212) @@ -15,6 +15,7 @@ package com.gargoylesoftware.htmlunit; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HEADER_CONTENT_DISPOSITION_ABSOLUTE_PATH; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HTTP_COOKIE_EXTENDED_DATE_PATTERNS; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HTTP_COOKIE_START_DATE_1970; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HTTP_HEADER_HOST_FIRST; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.URL_AUTH_CREDENTIALS; @@ -791,6 +792,15 @@ "EEE dd MMM yyyy HH mm ss z ", "EEE dd MM yy HH mm ss z ", "EEE dd MM yyyy HH mm ss z ", + }; + private static final String[] EXTENDED_DATE_PATTERNS = new String[] { + "EEE dd MMM yy HH mm ss zzz", + "EEE dd MMM yyyy HH mm ss zzz", + "EEE MMM d HH mm ss yyyy", + "EEE dd MMM yy HH mm ss z ", + "EEE dd MMM yyyy HH mm ss z ", + "EEE dd MM yy HH mm ss z ", + "EEE dd MM yyyy HH mm ss z ", "d/M/yyyy", }; @@ -822,7 +832,13 @@ if (browserVersion.hasFeature(HTTP_COOKIE_START_DATE_1970)) { startDate = DATE_1_1_1970; } - cookie.setExpiryDate(DateUtils.parseDate(value, DEFAULT_DATE_PATTERNS, startDate)); + + String[] datePatterns = DEFAULT_DATE_PATTERNS; + if (browserVersion.hasFeature(HTTP_COOKIE_EXTENDED_DATE_PATTERNS)) { + datePatterns = EXTENDED_DATE_PATTERNS; + } + + cookie.setExpiryDate(DateUtils.parseDate(value, datePatterns, startDate)); } public boolean match(final Cookie cookie, final CookieOrigin origin) { Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CookieManagerTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CookieManagerTest.java 2014-03-28 16:08:56 UTC (rev 9211) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CookieManagerTest.java 2014-03-29 13:04:54 UTC (rev 9212) @@ -46,6 +46,7 @@ * @author Ahmed Ashour * @author Marc Guillemot * @author Frank Danek + * @author Ronald Brill */ @RunWith(BrowserRunner.class) public class CookieManagerTest extends WebDriverTestCase { @@ -447,12 +448,13 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = "first=1", - IE11 = "") + @Alerts(DEFAULT = "first=1; second=2", + IE11 = "first=1") public void setCookieSubPath() throws Exception { final List<NameValuePair> responseHeader1 = new ArrayList<NameValuePair>(); - responseHeader1.add(new NameValuePair("Set-Cookie", "first=1; path=/foo/blah")); - responseHeader1.add(new NameValuePair("Location", "/foo/blah")); + responseHeader1.add(new NameValuePair("Set-Cookie", "first=1;path=/foo/blah")); + responseHeader1.add(new NameValuePair("Set-Cookie", "second=2;path=/foo/blah/test")); + responseHeader1.add(new NameValuePair("Location", "/foo/blah/test")); getMockWebConnection().setDefaultResponse(HTML_ALERT_COOKIE); getMockWebConnection().setResponse(getDefaultUrl(), "", 302, "Moved", "text/html", responseHeader1); @@ -465,13 +467,15 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = "first=1", - IE11 = "") + @Alerts(DEFAULT = "first=1; second=2", + IE11 = "first=1") public void setCookieDifferentPath() throws Exception { final List<NameValuePair> responseHeader1 = new ArrayList<NameValuePair>(); responseHeader1.add(new NameValuePair("Set-Cookie", "first=1; path=/foo/blah")); - responseHeader1.add(new NameValuePair("Set-Cookie", "second=2; path=/other/path")); - responseHeader1.add(new NameValuePair("Location", "/foo/blah")); + responseHeader1.add(new NameValuePair("Set-Cookie", "second=2; path=/foo/blah/test")); + responseHeader1.add(new NameValuePair("Set-Cookie", "third=3; path=/foo/other")); + responseHeader1.add(new NameValuePair("Set-Cookie", "fourth=4; path=/other/path")); + responseHeader1.add(new NameValuePair("Location", "/foo/blah/test")); getMockWebConnection().setDefaultResponse(HTML_ALERT_COOKIE); final URL firstUrl = new URL(getDefaultUrl(), "/a/b"); |
From: <rb...@us...> - 2014-03-29 17:53:27
|
Revision: 9213 http://sourceforge.net/p/htmlunit/code/9213 Author: rbri Date: 2014-03-29 17:53:22 +0000 (Sat, 29 Mar 2014) Log Message: ----------- cleanup and one more test Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/CookieManager.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CookieManagerTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/CookieManager.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/CookieManager.java 2014-03-29 13:04:54 UTC (rev 9212) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/CookieManager.java 2014-03-29 17:53:22 UTC (rev 9213) @@ -27,7 +27,6 @@ import org.apache.commons.collections.set.ListOrderedSet; import org.apache.commons.lang3.StringUtils; -import org.apache.http.client.config.CookieSpecs; import org.apache.http.cookie.CookieOrigin; import org.apache.http.cookie.CookieSpec; import org.apache.http.impl.cookie.BrowserCompatSpecFactory; @@ -48,13 +47,6 @@ */ public class CookieManager implements Serializable { - /** - * HtmlUnit's cookie policy is to be browser-compatible. Code which requires access to - * HtmlUnit's cookie policy should use this constant, rather than making assumptions and using - * one of the HttpClient {@link CookieSpecs} constants directly. - */ - public static final String HTMLUNIT_COOKIE_POLICY = CookieSpecs.BROWSER_COMPATIBILITY; - /** Whether or not cookies are enabled. */ private boolean cookiesEnabled_; @@ -113,16 +105,16 @@ } final String host = url.getHost(); - final String path = url.getPath(); - final String protocol = url.getProtocol(); - final boolean secure = "https".equals(protocol); - // URLs like "about:blank" don't have cookies and we need to catch these // cases here before HttpClient complains if (host.isEmpty()) { return Collections.emptySet(); } + final String path = url.getPath(); + final String protocol = url.getProtocol(); + final boolean secure = "https".equals(protocol); + final int port = getPort(url); // discard expired cookies Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CookieManagerTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CookieManagerTest.java 2014-03-29 13:04:54 UTC (rev 9212) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CookieManagerTest.java 2014-03-29 17:53:22 UTC (rev 9213) @@ -23,6 +23,7 @@ import java.util.Map; import org.apache.http.Header; +import org.apache.http.client.utils.DateUtils; import org.apache.http.cookie.CookieOrigin; import org.apache.http.impl.cookie.BrowserCompatSpec; import org.apache.http.message.BasicHeader; @@ -51,7 +52,7 @@ @RunWith(BrowserRunner.class) public class CookieManagerTest extends WebDriverTestCase { /** HTML code with JS code <code>alert(document.cookie)</code>. */ - public static final String HTML_ALERT_COOKIE = "<html><head><script>\nalert(document.cookie);\n</script>" + public static final String HTML_ALERT_COOKIE = "<html><head><script>\nalert(document.cookie);\n</script></head>" + "<body></body></html>"; /** @@ -483,7 +484,41 @@ loadPageWithAlerts2(firstUrl); } + /** + * Test for document.cookie for cookies expiered after the page was loaded. + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = {"cookies: first=1", "cookies: " }) + public void setCookieTimeout() throws Exception { + final List<NameValuePair> responseHeader1 = new ArrayList<NameValuePair>(); + final String expires = DateUtils.formatDate(new Date(System.currentTimeMillis() + 10000)); + responseHeader1.add(new NameValuePair("Set-Cookie", "first=1; expires=" + expires + "; path=/foo")); + responseHeader1.add(new NameValuePair("Location", "/foo/content.html")); + final String html = "<html>\n" + + "<head>\n" + + "<script>\n" + + " function alertCookies() {\n" + + " alert('cookies: ' + document.cookie);\n" + + " }\n" + + "</script>" + + "</head>\n" + + "<body>\n" + + "<script>\n" + + " alertCookies();\n" + + " window.setTimeout(alertCookies, 11000);\n" + + "</script>" + + "</body>\n" + + "</html>"; + + getMockWebConnection().setDefaultResponse(html); + final URL firstUrl = new URL(getDefaultUrl(), "/foo/test.html"); + getMockWebConnection().setResponse(firstUrl, "", 302, "Moved", "text/html", responseHeader1); + + loadPageWithAlerts2(firstUrl, 25000); + } + /** * HttpOnly cookies should not be available from JS. * @throws Exception if the test fails |