From: <rb...@us...> - 2013-11-09 19:29:02
|
Revision: 8762 http://sourceforge.net/p/htmlunit/code/8762 Author: rbri Date: 2013-11-09 19:28:58 +0000 (Sat, 09 Nov 2013) Log Message: ----------- more FF24 hacking Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/DocumentFragmentTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-09 19:28:35 UTC (rev 8761) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-09 19:28:58 UTC (rev 8762) @@ -954,7 +954,7 @@ JS_GET_ELEMENTS_BY_NAME_EMPTY_RETURNS_NOTHING, /** Javascript function getElementsByName returns an empty collection if called with null. */ - @BrowserFeature(@WebBrowser(IE)) + @BrowserFeature({ @WebBrowser(IE), @WebBrowser(value = FF, minVersion = 24) }) JS_GET_ELEMENTS_BY_NAME_NULL_RETURNS_NOTHING, /** Javascript function getElementsByTagName does not support namespaces. */ Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/DocumentFragmentTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/DocumentFragmentTest.java 2013-11-09 19:28:35 UTC (rev 8761) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/DocumentFragmentTest.java 2013-11-09 19:28:58 UTC (rev 8762) @@ -15,6 +15,7 @@ package com.gargoylesoftware.htmlunit.javascript.host; import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.FF17; +import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.FF24; import org.junit.Test; import org.junit.runner.RunWith; @@ -45,7 +46,7 @@ @Alerts(DEFAULT = "[object CSSStyleDeclaration]", FF = "[object CSS2Properties]", IE8 = "exception") - @NotYetImplemented(FF17) + @NotYetImplemented({ FF17, FF24 }) public void getComputedStyleOnChild() throws Exception { final String html = "<html><head><style>\n" + " body > div { background-color: green#FF0000; }\n" |
From: <rb...@us...> - 2013-11-11 21:05:21
|
Revision: 8768 http://sourceforge.net/p/htmlunit/code/8768 Author: rbri Date: 2013-11-11 21:05:16 +0000 (Mon, 11 Nov 2013) Log Message: ----------- start fixing our XMLHttpRequest CORS implementation Modified Paths: -------------- 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 trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/libraries/JQuery182Test.java 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 2013-11-11 20:11:58 UTC (rev 8767) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest.java 2013-11-11 21:05:16 UTC (rev 8768) @@ -844,7 +844,7 @@ * Returns the "withCredentials" property. * @return the "withCredentials" property */ - @JsxGetter + @JsxGetter({ @WebBrowser(value = IE, minVersion = 9), @WebBrowser(FF) }) public boolean getWithCredentials() { return withCredentials_; } 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 2013-11-11 20:11:58 UTC (rev 8767) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestCORSTest.java 2013-11-11 21:05:16 UTC (rev 8768) @@ -375,7 +375,6 @@ */ @Test @Alerts(DEFAULT = "false", IE8 = "undefined") - @NotYetImplemented(IE8) public void withCredentials_defaultValue() throws Exception { expandExpectedAlertsVariables(new URL("http://localhost:" + PORT)); @@ -404,7 +403,7 @@ FF17 = { "false", "false", "false" }, IE8 = { "undefined", "false", "true" }, IE10 = { "false", "false", "true" }) - @NotYetImplemented({ FF17, IE8 }) + @NotYetImplemented(FF17) public void withCredentials_notSetableInSyncMode() throws Exception { expandExpectedAlertsVariables(new URL("http://localhost:" + PORT)); Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/libraries/JQuery182Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/libraries/JQuery182Test.java 2013-11-11 20:11:58 UTC (rev 8767) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/libraries/JQuery182Test.java 2013-11-11 21:05:16 UTC (rev 8768) @@ -5007,7 +5007,6 @@ */ @Test @Alerts("0, 2, 2") - @NotYetImplemented(IE8) public void ajax__jQuery_ajax___failing_cross_domain() throws Exception { runTest("ajax: jQuery ajax - failing cross-domain"); } |
From: <asa...@us...> - 2013-11-12 10:56:34
|
Revision: 8769 http://sourceforge.net/p/htmlunit/code/8769 Author: asashour Date: 2013-11-12 10:56:31 +0000 (Tue, 12 Nov 2013) Log Message: ----------- JavaScript: element.setAttributeNode() applies to XML as well. Issue 1553 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Element.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/ElementTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-11-11 21:05:16 UTC (rev 8768) +++ trunk/htmlunit/src/changes/changes.xml 2013-11-12 10:56:31 UTC (rev 8769) @@ -8,6 +8,9 @@ <body> <release version="2.14" date="???" description="Bugfixes"> + <action type="fix" dev="asashour" issue="1553"> + JavaScript: element.setAttributeNode() applies to XML as well. + </action> <action type="fix" dev="rbri"> JavaScript: HTMLElement.insertAdjacentHTML() is available in FF since version 8. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Element.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Element.java 2013-11-11 21:05:16 UTC (rev 8768) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Element.java 2013-11-12 10:56:31 UTC (rev 8769) @@ -16,6 +16,7 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.GENERATED_37; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_GET_ATTRIBUTE_SUPPORTS_FLAGS_IN_QUIRKS_MODE; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_SET_ATTRIBUTE_CONSIDERS_ATTR_FOR_CLASS_AS_REAL; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.CHROME; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; @@ -556,4 +557,33 @@ public String getDefaultStyleDisplay() { return "block"; } + + /** + * Sets the attribute node for the specified attribute. + * @param newAtt the attribute to set + * @return the replaced attribute node, if any + */ + @JsxFunction + public Attr setAttributeNode(final Attr newAtt) { + final String name = newAtt.getName(); + + final Attr replacedAtt; + final boolean undefForClass = getBrowserVersion(). + hasFeature(JS_SET_ATTRIBUTE_CONSIDERS_ATTR_FOR_CLASS_AS_REAL); + if (undefForClass) { + replacedAtt = (Attr) getAttributeNode(name); + } + else { + final NamedNodeMap nodes = (NamedNodeMap) getAttributes(); + replacedAtt = (Attr) nodes.getNamedItemWithoutSytheticClassAttr(name); + } + if (replacedAtt != null) { + replacedAtt.detachFromParent(); + } + + final DomAttr newDomAttr = newAtt.getDomNodeOrDie(); + getDomNodeOrDie().setAttributeNode(newDomAttr); + return replacedAtt; + } + } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2013-11-11 21:05:16 UTC (rev 8768) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2013-11-12 10:56:31 UTC (rev 8769) @@ -42,7 +42,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_OUTER_HTML_BODY_HEAD_READONLY; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_OUTER_THROW_EXCEPTION_WHEN_CLOSES; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_PREFIX_RETURNS_EMPTY_WHEN_UNDEFINED; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_SET_ATTRIBUTE_CONSIDERS_ATTR_FOR_CLASS_AS_REAL; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_SET_ATTRIBUTE_SUPPORTS_EVENT_HANDLERS; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WIDTH_HEIGHT_ACCEPTS_ARBITRARY_VALUES; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.QUERYSELECTORALL_NOT_IN_QUIRKS; @@ -774,34 +773,6 @@ } /** - * Sets the attribute node for the specified attribute. - * @param newAtt the attribute to set - * @return the replaced attribute node, if any - */ - @JsxFunction - public Attr setAttributeNode(final Attr newAtt) { - final String name = newAtt.getName(); - - final Attr replacedAtt; - final boolean undefForClass = getBrowserVersion(). - hasFeature(JS_SET_ATTRIBUTE_CONSIDERS_ATTR_FOR_CLASS_AS_REAL); - if (undefForClass) { - replacedAtt = (Attr) getAttributeNode(name); - } - else { - final NamedNodeMap nodes = (NamedNodeMap) getAttributes(); - replacedAtt = (Attr) nodes.getNamedItemWithoutSytheticClassAttr(name); - } - if (replacedAtt != null) { - replacedAtt.detachFromParent(); - } - - final DomAttr newDomAttr = newAtt.getDomNodeOrDie(); - getDomNodeOrDie().setAttributeNode(newDomAttr); - return replacedAtt; - } - - /** * Returns all the descendant elements with the specified class. * @param className the name to search for * @return all the descendant elements with the specified class name Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/ElementTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/ElementTest.java 2013-11-11 21:05:16 UTC (rev 8768) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/ElementTest.java 2013-11-12 10:56:31 UTC (rev 8769) @@ -1076,4 +1076,32 @@ getMockWebConnection().setDefaultResponse(xml, "text/xml"); loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("test") + public void setAttributeNode() throws Exception { + final String html = "<html>\n" + + " <head>\n" + + " <script>\n" + + " function test() {\n" + + " var doc = " + XMLDocumentTest.callCreateXMLDocument() + ";\n" + + " var element = doc.createElement('something');\n" + + " var attr = doc.createAttribute('name');\n" + + " attr.value = 'test';\n" + + " element.setAttributeNode(attr);\n" + + " alert(element.getAttributeNode('name').value)\n" + + " }\n" + + XMLDocumentTest.CREATE_XML_DOCUMENT_FUNCTION + + " </script>\n" + + " </head>\n" + + " <body onload='test()'>\n" + + " </body>\n" + + "</html>"; + + loadPageWithAlerts2(html); + } + } |
From: <rb...@us...> - 2013-11-13 16:56:43
|
Revision: 8773 http://sourceforge.net/p/htmlunit/code/8773 Author: rbri Date: 2013-11-13 16:56:39 +0000 (Wed, 13 Nov 2013) Log Message: ----------- next fix on our XMLHttpRequest implementation Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest3Test.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestCORSTest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-13 07:50:35 UTC (rev 8772) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-13 16:56:39 UTC (rev 8773) @@ -1505,6 +1505,11 @@ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME) }) XHR_ORIGIN_HEADER, + /** Indicates that the impl throws an exception when accessing the status/statusText + * property in unset state. */ + @BrowserFeature(@WebBrowser(value = IE, maxVersion = 8)) + XHR_STATUS_THROWS_EXCEPTION_WHEN_UNSET, + /** Indicates that the onload handler is not triggered if completed (FF). */ @BrowserFeature(@WebBrowser(FF)) XHR_TRIGGER_ONLOAD_ON_COMPLETED, 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 2013-11-13 07:50:35 UTC (rev 8772) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest.java 2013-11-13 16:56:39 UTC (rev 8773) @@ -24,6 +24,7 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_ONREADYSTATECHANGE_WITH_EVENT_PARAM; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_OPEN_ALLOW_EMTPY_URL; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_ORIGIN_HEADER; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_STATUS_THROWS_EXCEPTION_WHEN_UNSET; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_TRIGGER_ONLOAD_ON_COMPLETED; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.CHROME; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; @@ -199,16 +200,6 @@ final Scriptable scope = stateChangeHandler_.getParentScope(); final JavaScriptEngine jsEngine = containingPage_.getWebClient().getJavaScriptEngine(); - final int nbExecutions; - if (async_ && STATE_OPENED == state) { - // quite strange but IE and FF seem both to fire state loading twice - // in async mode (at least with HTML of the unit tests) - nbExecutions = 2; - } - else { - nbExecutions = 1; - } - final Scriptable thisValue; if (browser.hasFeature(XHR_HANDLER_THIS_IS_FUNCTION)) { thisValue = stateChangeHandler_; @@ -216,25 +207,23 @@ else { thisValue = this; } - for (int i = 0; i < nbExecutions; i++) { - if (LOG.isDebugEnabled()) { - LOG.debug("Calling onreadystatechange handler for state " + state); - } - Object[] params = ArrayUtils.EMPTY_OBJECT_ARRAY; - if (browser.hasFeature(XHR_ONREADYSTATECHANGE_WITH_EVENT_PARAM)) { - params = new Object[1]; - final Event event = new Event(this, Event.TYPE_READY_STATE_CHANGE); - params[0] = event; - } + if (LOG.isDebugEnabled()) { + LOG.debug("Calling onreadystatechange handler for state " + state); + } + Object[] params = ArrayUtils.EMPTY_OBJECT_ARRAY; + if (browser.hasFeature(XHR_ONREADYSTATECHANGE_WITH_EVENT_PARAM)) { + params = new Object[1]; + final Event event = new Event(this, Event.TYPE_READY_STATE_CHANGE); + params[0] = event; + } - jsEngine.callFunction(containingPage_, stateChangeHandler_, scope, thisValue, params); - if (LOG.isDebugEnabled()) { - if (context == null) { - context = Context.getCurrentContext(); - } - LOG.debug("onreadystatechange handler: " + context.decompileFunction(stateChangeHandler_, 4)); - LOG.debug("Calling onreadystatechange handler for state " + state + ". Done."); + jsEngine.callFunction(containingPage_, stateChangeHandler_, scope, thisValue, params); + if (LOG.isDebugEnabled()) { + if (context == null) { + context = Context.getCurrentContext(); } + LOG.debug("onreadystatechange handler: " + context.decompileFunction(stateChangeHandler_, 4)); + LOG.debug("Calling onreadystatechange handler for state " + state + ". Done."); } } @@ -390,6 +379,9 @@ @JsxGetter public int getStatus() { if (state_ == STATE_UNSENT || state_ == STATE_OPENED) { + if (getBrowserVersion().hasFeature(XHR_STATUS_THROWS_EXCEPTION_WHEN_UNSET)) { + throw Context.reportRuntimeError("status not set"); + } return 0; } if (webResponse_ != null) { @@ -408,6 +400,9 @@ @JsxGetter public String getStatusText() { if (state_ == STATE_UNSENT || state_ == STATE_OPENED) { + if (getBrowserVersion().hasFeature(XHR_STATUS_THROWS_EXCEPTION_WHEN_UNSET)) { + throw Context.reportRuntimeError("statusText not set"); + } return ""; } if (webResponse_ != null) { @@ -584,6 +579,10 @@ doSend(Context.getCurrentContext()); } else { + // quite strange but IE and FF seem both to fire state loading twice + // in async mode (at least with HTML of the unit tests) + setState(STATE_OPENED, Context.getCurrentContext()); + // Create and start a thread in which to execute the request. final Scriptable startingScope = getWindow(); final ContextFactory cf = client.getJavaScriptEngine().getContextFactory(); Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest3Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest3Test.java 2013-11-13 07:50:35 UTC (rev 8772) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest3Test.java 2013-11-13 16:56:39 UTC (rev 8773) @@ -37,7 +37,6 @@ import com.gargoylesoftware.htmlunit.CollectingAlertHandler; import com.gargoylesoftware.htmlunit.HttpMethod; import com.gargoylesoftware.htmlunit.MockWebConnection; -import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.WebRequest; import com.gargoylesoftware.htmlunit.WebResponse; @@ -450,44 +449,4 @@ assertEquals(0, client.waitForBackgroundJavaScriptStartingBefore(1000)); assertEquals(getExpectedAlerts(), collectedAlerts); } - - /** - * @throws Exception if the test fails - */ - @Test - @Browsers(FF) - @Alerts({ "orsc1", "orsc1", "orsc2", "orsc3", "orsc4", "4", "<a>b</a>", "[object XMLHttpRequest]" }) - public void onload() throws Exception { - final String html = - "<html>\n" - + " <head>\n" - + " <script>\n" - + " function test() {\n" - + " var xhr;\n" - + " if (window.XMLHttpRequest) xhr = new XMLHttpRequest();\n" - + " else xhr = new ActiveXObject('Microsoft.XMLHTTP');\n" - + " xhr.onreadystatechange = function() { alert('orsc' + xhr.readyState); };\n" - + " xhr.onload = function() { alert(xhr.readyState); alert(xhr.responseText); alert(this); }\n" - + " xhr.open('GET', '" + URL_SECOND + "', true);\n" - + " xhr.send('');\n" - + " }\n" - + " </script>\n" - + " </head>\n" - + " <body onload='test()'></body>\n" - + "</html>"; - - final String xml = "<a>b</a>"; - - final WebClient client = getWebClient(); - client.setAjaxController(new NicelyResynchronizingAjaxController()); - final List<String> collectedAlerts = new ArrayList<String>(); - client.setAlertHandler(new CollectingAlertHandler(collectedAlerts)); - final MockWebConnection conn = new MockWebConnection(); - conn.setResponse(URL_FIRST, html); - conn.setResponse(URL_SECOND, xml, "text/xml"); - client.setWebConnection(conn); - client.getPage(URL_FIRST); - - assertEquals(getExpectedAlerts(), collectedAlerts); - } } 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 2013-11-13 07:50:35 UTC (rev 8772) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestCORSTest.java 2013-11-13 16:56:39 UTC (rev 8773) @@ -440,7 +440,7 @@ @Alerts(DEFAULT = { "1", "0", "4", "0" }, IE8 = { "1", "ex: status not available", "4", "200" }, IE10 = { "1", "0", "4", "200" }) - @NotYetImplemented({ FF17, IE8 }) + @NotYetImplemented(FF17) public void withCredentials() throws Exception { testWithCredentials("*", "true"); } @@ -451,7 +451,6 @@ @Test @Alerts(DEFAULT = { "1", "0", "4", "200" }, IE8 = { "1", "ex: status not available", "4", "200" }) - @NotYetImplemented(IE8) public void withCredentialsServer() throws Exception { testWithCredentials("http://localhost:" + PORT, "true"); } @@ -463,7 +462,7 @@ @Alerts(DEFAULT = { "1", "0", "4", "0" }, IE8 = { "1", "ex: status not available", "4", "200" }, IE10 = { "1", "0", "4", "200" }) - @NotYetImplemented({ FF17, IE8 }) + @NotYetImplemented(FF17) public void withCredentialsServerSlashAtEnd() throws Exception { testWithCredentials("http://localhost:" + PORT + "/", "true"); } @@ -475,7 +474,7 @@ @Alerts(DEFAULT = { "1", "0", "4", "0" }, IE8 = { "1", "ex: status not available", "4", "200" }, IE10 = { "1", "0", "4", "200" }) - @NotYetImplemented({ FF17, IE8 }) + @NotYetImplemented(FF17) public void withCredentials_no_header() throws Exception { testWithCredentials("*", null); } @@ -487,7 +486,7 @@ @Alerts(DEFAULT = { "1", "0", "4", "0" }, IE8 = { "1", "ex: status not available", "4", "200" }, IE10 = { "1", "0", "4", "200" }) - @NotYetImplemented({ FF17, IE8 }) + @NotYetImplemented(FF17) public void withCredentials_no_header_Server() throws Exception { testWithCredentials("http://localhost:" + PORT, null); } @@ -499,7 +498,7 @@ @Alerts(DEFAULT = { "1", "0", "4", "0" }, IE8 = { "1", "ex: status not available", "4", "200" }, IE10 = { "1", "0", "4", "200" }) - @NotYetImplemented({ FF17, IE8 }) + @NotYetImplemented(FF17) public void withCredentials_no_header_ServerSlashAtEnd() throws Exception { testWithCredentials("http://localhost:" + PORT + "/", null); } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestTest.java 2013-11-13 07:50:35 UTC (rev 8772) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestTest.java 2013-11-13 16:56:39 UTC (rev 8773) @@ -135,26 +135,142 @@ * @throws Exception if the test fails */ @Test - @Alerts({"0-", "0-" }) - public void statusBeforeSend() throws Exception { + @Alerts(DEFAULT = { "1: 0-", "2: ", "3: 200-OK" }, + IE8 = {"1: ex: status-ex: statusText, 2: , 3: 200-OK" }) + public void statusSync() throws Exception { final String html = "<html>\n" + " <head>\n" + " <title>XMLHttpRequest Test</title>\n" + + "<script>\n" + + " var xhr;\n" + + " if (window.XMLHttpRequest)\n" + + " xhr = new XMLHttpRequest();\n" + + " else if (window.ActiveXObject)\n" + + " xhr = new ActiveXObject('Microsoft.XMLHTTP');\n" + + + " alertStatus('1: ');\n" + + " xhr.open('GET', '/foo.xml', false);\n" + + " alert('2: ');\n" + + + " xhr.send();\n" + + " alertStatus('3: ');\n" + + + " function alertStatus(prefix) {\n" + + " var msg = prefix;" + + " try {\n" + + " msg = msg + xhr.status + '-';\n" + + " } catch(e) { msg = msg + 'ex: status' + '-' }\n" + + " try {\n" + + " msg = msg + xhr.statusText;;\n" + + " } catch(e) { msg = msg + 'ex: statusText' }\n" + + " alert(msg);\n" + + " }\n" + + "</script>\n" + + " </head>\n" + + " <body></body>\n" + + "</html>"; + + getMockWebConnection().setDefaultResponse("<res></res>", "text/xml"); + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "1: 0-", "2: 0-", "#1: 0-", "3: 0-", "#1: 0-", "4: 0-", + "#2: 200-OK", "#3: 200-OK", "#4: 200-OK" }, + FF24 = { "1: 0-", "2: 0-", "#1: 0-", "3: 0-", "4: 0-", "#2: 200-OK", "#3: 200-OK", "#4: 200-OK" }, + IE8 = { "1: ex: status-ex: statusText", "2: ex: status-ex: statusText", "#1: ex: status-ex: statusText", + "3: ex: status-ex: statusText", "#1: ex: status-ex: statusText", "4: ex: status-ex: statusText", + "#2: 200-OK", "#3: 200-OK", "#4: 200-OK" }) + public void statusAsync() throws Exception { + final String html = + "<html>\n" + + " <head>\n" + + " <title>XMLHttpRequest Test</title>\n" + + "<script>\n" + + " var xhr;\n" + + " if (window.XMLHttpRequest)\n" + + " xhr = new XMLHttpRequest();\n" + + " else if (window.ActiveXObject)\n" + + " xhr = new ActiveXObject('Microsoft.XMLHTTP');\n" + + + " function test() {\n" + + " try {\n" + + " alertStatus('1: ');\n" + + + " xhr.onreadystatechange = onReadyStateChange;\n" + + " alertStatus('2: ');\n" + + + " xhr.open('GET', '/foo.xml', true);\n" + + " alertStatus('3: ');\n" + + + " xhr.send();\n" + + " alertStatus('4: ');\n" + + " } catch(e) { alert(e) }\n" + + " }\n" + + + " function onReadyStateChange() {\n" + + " alertStatus('#' + xhr.readyState + ': ');" + + " }\n" + + + " function alertStatus(prefix) {\n" + + " var msg = prefix;" + + " try {\n" + + " msg = msg + xhr.status + '-';\n" + + " } catch(e) { msg = msg + 'ex: status' + '-' }\n" + + " try {\n" + + " msg = msg + xhr.statusText;;\n" + + " } catch(e) { msg = msg + 'ex: statusText' }\n" + + " alert(msg);\n" + + " }\n" + + "</script>\n" + + " </head>\n" + + " <body onload='test()'></body>\n" + + "</html>"; + + getMockWebConnection().setDefaultResponse("<res></res>", "text/xml"); + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "orsc1", "open-done", "orsc1", "send-done", + "orsc2", "orsc3", "orsc4", "4", "<a>b</a>", "[object XMLHttpRequest]" }, + FF24 = { "orsc1", "open-done", "send-done", + "orsc2", "orsc3", "orsc4", "4", "<a>b</a>", "[object XMLHttpRequest]" }, + IE8 = { "orsc1", "open-done", "orsc1", "send-done", "orsc2", "orsc3", "orsc4" }) + public void onload() throws Exception { + final String html = + "<html>\n" + + " <head>\n" + " <script>\n" - + " var request;\n" - + " if (window.XMLHttpRequest)\n" - + " request = new XMLHttpRequest();\n" - + " else if (window.ActiveXObject)\n" - + " request = new ActiveXObject('Microsoft.XMLHTTP');\n" + + " function test() {\n" + + " var xhr;\n" + + " if (window.XMLHttpRequest) xhr = new XMLHttpRequest();\n" + + " else xhr = new ActiveXObject('Microsoft.XMLHTTP');\n" - + " alert(request.status + '-' + request.statusText);\n" - + " request.open('GET', '/foo.xml', false);\n" - + " alert(request.status + '-' + request.statusText);\n" + + " xhr.onreadystatechange = function() { alert('orsc' + xhr.readyState); };\n" + + " xhr.onload = function() { alert(xhr.readyState); alert(xhr.responseText); alert(this); }\n" + + + " xhr.open('GET', '" + URL_SECOND + "', true);\n" + + " alert('open-done');\n" + + + " xhr.send('');\n" + + " alert('send-done');\n" + + " }\n" + " </script>\n" + " </head>\n" - + " <body></body>\n" + + " <body onload='test()'></body>\n" + "</html>"; + + final String xml = "<a>b</a>"; + + getMockWebConnection().setDefaultResponse(xml, "text/xml"); loadPageWithAlerts2(html); } |
From: <rb...@us...> - 2013-11-13 19:50:37
|
Revision: 8775 http://sourceforge.net/p/htmlunit/code/8775 Author: rbri Date: 2013-11-13 19:50:32 +0000 (Wed, 13 Nov 2013) Log Message: ----------- the rest of the XMLHttpRequest fixes; all NYI annotations are gone, FF24 and IE10 are manly done also 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/xml/XMLHttpRequest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebDriverTestCase.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestCORSTest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-11-13 17:17:39 UTC (rev 8774) +++ trunk/htmlunit/src/changes/changes.xml 2013-11-13 19:50:32 UTC (rev 8775) @@ -8,6 +8,22 @@ <body> <release version="2.14" date="???" description="Bugfixes"> + <action type="fix" dev="rbri"> + JavaScript: XMLHttpRequest CORS handling fixed, some new tests added and implementation fixed. + </action> + <action type="fix" dev="rbri"> + JavaScript: Siplified/fixed implementation of the onReadyStateChange handler call. + </action> + <action type="fix" dev="rbri"> + JavaScript: XMLHttpRequest status and statusText throws an exception in IE8 depending + on the state of the request. + </action> + <action type="fix" dev="rbri"> + JavaScript: XMLHttpRequest property 'withCredentials' is not setable in sync mode (browsers specific). + </action> + <action type="fix" dev="rbri"> + JavaScript: XMLHttpRequest property 'withCredentials' is not available in IE8. + </action> <action type="fix" dev="asashour" issue="1553"> JavaScript: element.setAttributeNode() applies to XML as well. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-13 17:17:39 UTC (rev 8774) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-13 19:50:32 UTC (rev 8775) @@ -1514,6 +1514,19 @@ @BrowserFeature(@WebBrowser(FF)) XHR_TRIGGER_ONLOAD_ON_COMPLETED, + /** Indicates that the "*" pattern is allowed when withCredential is enabled. */ + @BrowserFeature(@WebBrowser(IE)) + XHR_WITHCREDENTIALS_ALLOW_ORIGIN_ALL, + + /** Indicates that the propery 'withCredentials is not writable for sync requests. */ + @BrowserFeature(@WebBrowser(value = FF, maxVersion = 23)) + XHR_WITHCREDENTIALS_SYNC_NOT_WRITEABLE, + + /** Indicates that the propery 'withCredentials is not writable for sync requests. + * Setting the property throws an exception. */ + @BrowserFeature(@WebBrowser(value = FF, minVersion = 24)) + XHR_WITHCREDENTIALS_SYNC_NOT_WRITEABLE_EXCEPTION, + /** Indicates that the 'SelectionNamespaces' property is supported by XPath expressions. */ @BrowserFeature({ @WebBrowser(IE), @WebBrowser(CHROME) }) XPATH_SELECTION_NAMESPACES, 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 2013-11-13 17:17:39 UTC (rev 8774) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest.java 2013-11-13 19:50:32 UTC (rev 8775) @@ -26,6 +26,9 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_ORIGIN_HEADER; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_STATUS_THROWS_EXCEPTION_WHEN_UNSET; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_TRIGGER_ONLOAD_ON_COMPLETED; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_WITHCREDENTIALS_SYNC_NOT_WRITEABLE; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_WITHCREDENTIALS_SYNC_NOT_WRITEABLE_EXCEPTION; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_WITHCREDENTIALS_ALLOW_ORIGIN_ALL; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.CHROME; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; @@ -113,6 +116,7 @@ private static final String HEADER_ACCESS_CONTROL_REQUEST_METHOD = "Access-Control-Request-Method"; private static final String HEADER_ACCESS_CONTROL_REQUEST_HEADERS = "Access-Control-Request-Headers"; private static final String HEADER_ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin"; + private static final String HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS = "Access-Control-Allow-Credentials"; private static final String HEADER_ACCESS_CONTROL_ALLOW_HEADERS = "Access-Control-Allow-Headers"; private static final String ALLOW_ORIGIN_ALL = "*"; @@ -480,6 +484,11 @@ throw Context.reportRuntimeError("URL for XHR.open can't be empty!"); } + if (!async && getWithCredentials()) { + throw Context.reportRuntimeError( + "open() in sync mode is not possible because 'withCredentials' is set to true"); + } + final String url = Context.toString(urlParam); // (URL + Method + User + Password) become a WebRequest instance. @@ -690,8 +699,20 @@ } boolean allowOriginResponse = true; if (crossOriginResourceSharing) { - final String value = webResponse.getResponseHeaderValue(HEADER_ACCESS_CONTROL_ALLOW_ORIGIN); - allowOriginResponse = ALLOW_ORIGIN_ALL.equals(value) || originHeaderValue.equals(value); + String value = webResponse.getResponseHeaderValue(HEADER_ACCESS_CONTROL_ALLOW_ORIGIN); + allowOriginResponse = originHeaderValue.equals(value); + if (getWithCredentials()) { + allowOriginResponse = allowOriginResponse + || (getBrowserVersion().hasFeature(XHR_WITHCREDENTIALS_ALLOW_ORIGIN_ALL) + && ALLOW_ORIGIN_ALL.equals(value)); + + // second step: check the allow-credentials header for true + value = webResponse.getResponseHeaderValue(HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS); + allowOriginResponse = allowOriginResponse && Boolean.parseBoolean(value); + } + else { + allowOriginResponse = allowOriginResponse || ALLOW_ORIGIN_ALL.equals(value); + } } if (allowOriginResponse) { if (overriddenMimeType_ == null) { @@ -706,10 +727,12 @@ }; } } - setState(STATE_HEADERS_RECEIVED, context); - setState(STATE_LOADING, context); - setState(STATE_DONE, context); - if (!allowOriginResponse) { + if (allowOriginResponse) { + setState(STATE_HEADERS_RECEIVED, context); + setState(STATE_LOADING, context); + setState(STATE_DONE, context); + } + else { if (LOG.isDebugEnabled()) { LOG.debug("No permitted \"Access-Control-Allow-Origin\" header for URL " + webRequest_.getUrl()); } @@ -857,6 +880,14 @@ */ @JsxSetter public void setWithCredentials(final boolean withCredentials) { + if (!async_ && state_ != STATE_UNSENT) { + if (getBrowserVersion().hasFeature(XHR_WITHCREDENTIALS_SYNC_NOT_WRITEABLE_EXCEPTION)) { + throw Context.reportRuntimeError("Property 'withCredentials' not writable in sync mode."); + } + if (getBrowserVersion().hasFeature(XHR_WITHCREDENTIALS_SYNC_NOT_WRITEABLE)) { + return; + } + } withCredentials_ = withCredentials; } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebDriverTestCase.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebDriverTestCase.java 2013-11-13 17:17:39 UTC (rev 8774) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebDriverTestCase.java 2013-11-13 19:50:32 UTC (rev 8775) @@ -605,7 +605,7 @@ * @throws Exception if something goes wrong */ protected final WebDriver loadPageWithAlerts2(final String html, final URL url) throws Exception { - return loadPageWithAlerts2(html, url, DEFAULT_WAIT_TIME); + return loadPageWithAlerts2(html, url, DEFAULT_WAIT_TIME * 1000); } /** 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 2013-11-13 17:17:39 UTC (rev 8774) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestCORSTest.java 2013-11-13 19:50:32 UTC (rev 8775) @@ -14,9 +14,6 @@ */ package com.gargoylesoftware.htmlunit.javascript.host.xml; -import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.FF17; -import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.IE8; - import java.io.IOException; import java.io.Writer; import java.net.URL; @@ -33,7 +30,6 @@ import com.gargoylesoftware.htmlunit.BrowserRunner; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; -import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; import com.gargoylesoftware.htmlunit.WebDriverTestCase; /** @@ -399,22 +395,53 @@ * @throws Exception if the test fails. */ @Test - @Alerts(DEFAULT = { "false", "ex: withCredentials=false", "ex: withCredentials=true" }, - FF17 = { "false", "false", "false" }, - IE8 = { "undefined", "false", "true" }, - IE10 = { "false", "false", "true" }) - @NotYetImplemented(FF17) + @Alerts(DEFAULT = { "false", "false", "ex: withCredentials=true", "ex: withCredentials=false" }, + FF17 = { "false", "false", "false", "false" }, + IE8 = { "undefined", "undefined", "true", "false" }, + IE10 = { "false", "false", "true", "false" }) public void withCredentials_notSetableInSyncMode() throws Exception { - expandExpectedAlertsVariables(new URL("http://localhost:" + PORT)); + final String html = "<html><head>\n" + + "<script>\n" + + "var xhr = " + XHRInstantiation_ + ";\n" + + "function test() {\n" + + " try {\n" + + " alert(xhr.withCredentials);\n" + + " xhr.open('GET', '/foo.xml', false);\n" + + " alert(xhr.withCredentials);\n" + + " try {\n" + + " xhr.withCredentials = true;\n" + + " alert(xhr.withCredentials);\n" + + " } catch(e) { alert('ex: withCredentials=true') }\n" + + + " try {\n" + + " xhr.withCredentials = false;\n" + + " alert(xhr.withCredentials);\n" + + " } catch(e) { alert('ex: withCredentials=false') }\n" + + " } catch(ex) { alert(ex) }\n" + + "}\n" + + "</script>\n" + + "</head>\n" + + "<body onload='test()'></body></html>"; + + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails. + */ + @Test + @Alerts(DEFAULT = { "false", "false", "true", "ex: open" }, + IE8 = { "undefined", "false", "true", "open true" }, + IE10 = { "false", "ex: withCredentials=false", "ex: withCredentials=true", "open false" }) + public void withCredentials_openFailesInSyncMode() throws Exception { final String html = "<html><head>\n" + "<script>\n" + "var xhr = " + XHRInstantiation_ + ";\n" + "function test() {\n" + " try {\n" - + " var url = 'http://' + window.location.hostname + ':" + PORT2 + "/withCredentials2';\n" - + " xhr.open('GET', url, false);\n" + " alert(xhr.withCredentials);\n" + + " try {\n" + " xhr.withCredentials = false;\n" + " alert(xhr.withCredentials);\n" @@ -424,13 +451,18 @@ + " xhr.withCredentials = true;\n" + " alert(xhr.withCredentials);\n" + " } catch(e) { alert('ex: withCredentials=true') }\n" + + + " try {\n" + + " xhr.open('GET', '/foo.xml', false);\n" + + " alert('open ' + xhr.withCredentials);\n" + + " } catch(e) { alert('ex: open') }\n" + " } catch(ex) { alert(ex) }\n" + "}\n" + "</script>\n" + "</head>\n" + "<body onload='test()'></body></html>"; - loadPageWithAlerts2(html, new URL(getDefaultUrl(), "/withCredentials1")); + loadPageWithAlerts2(html); } /** @@ -440,7 +472,6 @@ @Alerts(DEFAULT = { "1", "0", "4", "0" }, IE8 = { "1", "ex: status not available", "4", "200" }, IE10 = { "1", "0", "4", "200" }) - @NotYetImplemented(FF17) public void withCredentials() throws Exception { testWithCredentials("*", "true"); } @@ -462,7 +493,6 @@ @Alerts(DEFAULT = { "1", "0", "4", "0" }, IE8 = { "1", "ex: status not available", "4", "200" }, IE10 = { "1", "0", "4", "200" }) - @NotYetImplemented(FF17) public void withCredentialsServerSlashAtEnd() throws Exception { testWithCredentials("http://localhost:" + PORT + "/", "true"); } @@ -474,7 +504,6 @@ @Alerts(DEFAULT = { "1", "0", "4", "0" }, IE8 = { "1", "ex: status not available", "4", "200" }, IE10 = { "1", "0", "4", "200" }) - @NotYetImplemented(FF17) public void withCredentials_no_header() throws Exception { testWithCredentials("*", null); } @@ -486,7 +515,6 @@ @Alerts(DEFAULT = { "1", "0", "4", "0" }, IE8 = { "1", "ex: status not available", "4", "200" }, IE10 = { "1", "0", "4", "200" }) - @NotYetImplemented(FF17) public void withCredentials_no_header_Server() throws Exception { testWithCredentials("http://localhost:" + PORT, null); } @@ -498,7 +526,6 @@ @Alerts(DEFAULT = { "1", "0", "4", "0" }, IE8 = { "1", "ex: status not available", "4", "200" }, IE10 = { "1", "0", "4", "200" }) - @NotYetImplemented(FF17) public void withCredentials_no_header_ServerSlashAtEnd() throws Exception { testWithCredentials("http://localhost:" + PORT + "/", null); } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestTest.java 2013-11-13 17:17:39 UTC (rev 8774) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequestTest.java 2013-11-13 19:50:32 UTC (rev 8775) @@ -257,7 +257,7 @@ + " xhr.onreadystatechange = function() { alert('orsc' + xhr.readyState); };\n" + " xhr.onload = function() { alert(xhr.readyState); alert(xhr.responseText); alert(this); }\n" - + " xhr.open('GET', '" + URL_SECOND + "', true);\n" + + " xhr.open('GET', '/foo.xml', true);\n" + " alert('open-done');\n" + " xhr.send('');\n" |
From: <rb...@us...> - 2013-11-13 21:48:55
|
Revision: 8779 http://sourceforge.net/p/htmlunit/code/8779 Author: rbri Date: 2013-11-13 21:48:50 +0000 (Wed, 13 Nov 2013) Log Message: ----------- remove all BrowserFeatures no longer in use Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebWindowImpl.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlForm.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlOption.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlScript.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/JavaScriptEngine.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Document.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/DocumentType.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Element.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/HashChangeEvent.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Storage.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclaration.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/ComputedCSSStyleDeclaration.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLButtonElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDocument.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLSelectElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTextAreaElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLSerializer.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/BrowserVersionFeaturesTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -42,9 +42,6 @@ @BrowserFeature(@WebBrowser(IE)) ANCHOR_EMPTY_HREF_NO_FILENAME, - /** Indicates that a blur event should be triggered before an onchange event. */ - BLUR_BEFORE_ONCHANGE, - /** If the "type" attribute of HtmlButton should be evaluated to 'button' if not specified. */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) BUTTON_EMPTY_TYPE_BUTTON, @@ -115,13 +112,6 @@ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(value = IE, minVersion = 10) }) CSS_TEXT_SHADOW_DEFAULT_NONE, - /** Default is 'normal'. */ - CSS_WORD_SPACING_DEFAULT_NORMAL, - - /** Values for the zIndex are rounded to integer. */ - @BrowserFeature(@WebBrowser(value = IE, maxVersion = 7)) - CSS_ZINDEX_ROUNDED, - /** IE uses the type Number for the zIndex Values (instead of String). */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) CSS_ZINDEX_TYPE_NUMBER, @@ -142,10 +132,6 @@ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME) }) DISPLAYED_COLLAPSE, - /** FF 3.6 has a much lager menu bar. */ - @BrowserFeature({ @WebBrowser(value = FF, minVersion = 3.6f, maxVersion = 3.6f) }) - DISPLAY_LARGE_MENU_BAR, - /** */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) DOCTYPE_4_0_TRANSITIONAL_STANDARDS, @@ -223,10 +209,6 @@ EVENT_ONMOUSEDOWN_FOR_SELECT_OPTION_TRIGGERS_ADDITIONAL_DOWN_FOR_SELECT, /** Does not trigger "onmousedown" event handler for the select options. */ - @BrowserFeature({ }) - EVENT_ONMOUSEDOWN_FOR_SELECT_OPTION_TRIGGERS_ADDITIONAL_UP_FOR_SELECT, - - /** Does not trigger "onmousedown" event handler for the select options. */ @BrowserFeature({ @WebBrowser(IE), @WebBrowser(CHROME), @WebBrowser(value = FF, maxVersion = 3.6f) }) EVENT_ONMOUSEDOWN_NOT_FOR_SELECT_OPTION, @@ -274,13 +256,6 @@ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME) }) FORMFIELD_REACHABLE_BY_NEW_NAMES, - /** - * Special behavior of IE6; the URL submitted by a form with method type 'GET' has - * a question mark at the end if there are no parameters. - */ - @BrowserFeature(@WebBrowser(value = IE, maxVersion = 6)) - FORM_SUBMISSION_URL_END_WITH_QUESTIONMARK, - /** Form submit is done without the hash part of the form action url. */ @BrowserFeature(@WebBrowser(IE)) FORM_SUBMISSION_URL_WITHOUT_HASH, @@ -501,10 +476,6 @@ @BrowserFeature(@WebBrowser(IE)) HTMLBGSOUND, - /** Set this checked state back to default when added to page (IE6). */ - @BrowserFeature(@WebBrowser(value = IE, maxVersion = 7)) - HTMLCHECKEDINPUT_SET_CHECKED_TO_DEFAULT_WHEN_ADDED, - /** Set this checked state to false when added to page (IE). */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) HTMLCHECKEDINPUT_SET_CHECKED_TO_FALSE_WHEN_CLONE, @@ -565,9 +536,6 @@ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 10) }) HTMLELEMENT_OUTER_INNER_HTML_QUOTE_ATTRIBUTES, - /** */ - HTMLELEMENT_TRIM_CLASS_ATTRIBUTE, - /** * Indicates if a self-closing <iframe/> tag should be considered as an opening tag. **/ @@ -620,10 +588,6 @@ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME) }) HTMLSCRIPT_APPLICATION_JAVASCRIPT, - /** Runs <script src="javascript:'[code]'">. */ - @BrowserFeature(@WebBrowser(value = IE, maxVersion = 6)) - HTMLSCRIPT_SRC_JAVASCRIPT, - /** Trims the value of the type attribute before to verify it. */ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME) }) HTMLSCRIPT_TRIM_TYPE, @@ -739,10 +703,6 @@ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_BUTTON_SET_TYPE_THROWS_EXCEPTION, - /** IE uses the content of a button tag as value instead of the attribute. */ - @BrowserFeature(@WebBrowser(value = IE, maxVersion = 7)) - JS_BUTTON_USE_CONTENT_AS_VALUE, - /** Indicates that the browser emulates the char attribute. */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_CHAR_EMULATED, @@ -751,15 +711,6 @@ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_CHAR_OFF_EMULATED, - /** Indicates that the browser tries to convert the char attribute values - * to integer. */ - @BrowserFeature(@WebBrowser(value = FF, maxVersion = 3.6f)) - JS_CHAR_OFF_INTEGER, - - /** Indicates that the browser returns a dot if the char attribute is not defined. */ - @BrowserFeature(@WebBrowser(value = FF, maxVersion = 3.6f)) - JS_CHAR_UNDEFINED_DOT, - /** Indicates that the click method call does not trigger the onchange * event handlers for checkboxes. */ @BrowserFeature(@WebBrowser(IE)) @@ -807,9 +758,6 @@ @BrowserFeature({@WebBrowser(value = FF, maxVersion = 3.6f), @WebBrowser(value = IE, minVersion = 10) }) JS_DOCTYPE_ENTITIES_NULL, - /** Javascript doctyp.internalSubset returns an empty string (IE). */ - JS_DOCTYPE_INTERNALSUBSET_EMPTY_STRING, - /** Javascript doctyp.notations returns an empty string (IE). */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_DOCTYPE_NOTATIONS_EMPTY_STRING, @@ -936,10 +884,6 @@ @BrowserFeature(@WebBrowser(IE)) JS_FUNCTION_DECLARED_FORWARD_IN_BLOCK, - /** Indicates if the method isXmlName exists in the window scope. */ - @BrowserFeature(@WebBrowser(value = FF, maxVersion = 10)) - JS_FUNCTION_ISXMLNAME, - /** * Indicates that function can be defined as * <code>function object.property() {}</code> instead of <code>object.property = function() {}</code>. @@ -971,10 +915,6 @@ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_GET_ELEMENTS_BY_TAG_NAME_NOT_SUPPORTS_NAMESPACES, - /** Javascript function getElementById calls getElementByName if nothing found by id. */ - @BrowserFeature(@WebBrowser(value = IE, maxVersion = 6)) - JS_GET_ELEMENT_BY_ID_ALSO_BY_NAME, - /** Javascript function getElementById calls getElementByName if nothing found by id, only in quirks mode. */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_GET_ELEMENT_BY_ID_ALSO_BY_NAME_IN_QUICKS_MODE, @@ -983,10 +923,6 @@ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 10) }) JS_GET_ELEMENT_BY_ID_CASE_SENSITIVE, - /** Indicates that not defined function handler should be 'undefined', or 'null'. */ - @BrowserFeature(@WebBrowser(value = FF, maxVersion = 3.6f)) - JS_HANDLER_UNDEFINED, - /** Indicates that objects with prototype property available in window scope; Firefox does this. */ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 10) }) JS_HAS_OBJECT_WITH_PROTOTYPE_PROPERTY_IN_WINDOW_SCOPE, @@ -1104,10 +1040,6 @@ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_PREFIX_RETURNS_EMPTY_WHEN_UNDEFINED, - /** Indicates that document.queryCommandSupported(..) is only available in design mode. */ - @BrowserFeature(@WebBrowser(value = FF, maxVersion = 3.6f)) - JS_QUERYCOMMAND_SUPPORTED_ONLY_DESIGNMODE, - /** Javascript script.text(...) reexecutes the script (IE). */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_SCRIPT_ALWAYS_REEXECUTE_ON_SET_TEXT, @@ -1151,12 +1083,6 @@ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_SELECT_ADD_SECOND_PARAM_IS_INDEX, - /** Indicates if calling HTMLSelectElement.add without second parameter - * throws an exception. - */ - @BrowserFeature(@WebBrowser(value = FF, maxVersion = 3.6f)) - JS_SELECT_ADD_SECOND_PARAM_IS_REQUIRED, - /** Indicates if calling HTMLSelectElement.item with a negative value should throw. */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_SELECT_ITEM_THROWS_IF_NEGATIVE, @@ -1165,14 +1091,6 @@ @BrowserFeature(@WebBrowser(IE)) JS_SELECT_OPTIONS_HAS_CHILDNODES_PROPERTY, - /** Indicates if setting an out of bound value for HTMLSelectElement.selectedIndex should throw. */ - JS_SELECT_SELECTED_INDEX_THROWS_IF_BAD, - - /** Indicates that the set attribute method treads the synthetic - * empty attr for 'class' (IE6/7) as a normal one. */ - @BrowserFeature(@WebBrowser(value = IE, maxVersion = 7)) - JS_SET_ATTRIBUTE_CONSIDERS_ATTR_FOR_CLASS_AS_REAL, - /** Indicates that the set attribute method is able to update the event handlers also. * e.g. element.setAttribute("onclick", "test(1);"); */ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 10) }) @@ -1222,18 +1140,6 @@ @BrowserFeature(@WebBrowser(IE)) JS_TABLE_VALIGN_SUPPORTS_IE_VALUES, - /** Getting the property cols returns 20, if the defined value is not convertible into an integer (IE). - * FF returns -1 in this case. - */ - @BrowserFeature(@WebBrowser(value = FF, maxVersion = 3.6f)) - JS_TEXT_AREA_COLS_RETURNS_MINUS1, - - /** Getting the property rows returns 2, if the defined value is not convertible into an integer (IE). - * FF returns -1 in this case. - */ - @BrowserFeature(@WebBrowser(value = FF, maxVersion = 3.6f)) - JS_TEXT_AREA_ROWS_RETURNS_MINUS1, - /** Setting the property cols throws an exception, if the provided value is less * than 0 (IE). * FF ignores the provided value in this case. @@ -1308,9 +1214,6 @@ @BrowserFeature(@WebBrowser(IE)) JS_XML_SERIALIZER_APPENDS_CRLF, - /** Indicates that new XMLSerializer().serializeToString(..) transforms the node name to upper case. */ - JS_XML_SERIALIZER_NODE_AS_UPPERCASE, - /** Indicates that new XMLSerializer().serializeToString(..) respects the XHTML definition for non empty tags. */ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME) }) JS_XML_SERIALIZER_NON_EMPTY_TAGS, @@ -1382,10 +1285,6 @@ @BrowserFeature(@WebBrowser(FF)) SET_READONLY_PROPERTIES, - /** Indicates [object StorageObsolete] instead of [object Storage]. */ - @BrowserFeature({ @WebBrowser(value = FF, maxVersion = 10) }) - STORAGE_OBSOLETE, - /** Indicates that string.trim() is supported. */ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 10) }) STRING_TRIM, @@ -1474,9 +1373,6 @@ @BrowserFeature(@WebBrowser(IE)) XHR_ERRORHANDLER_NOT_SUPPORTED, - /** Indicates that 'this' corresponds to the handler function when a XMLHttpRequest handler is executed. */ - XHR_HANDLER_THIS_IS_FUNCTION, - /** Indicates if a same origin check should be skipped. */ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 8) }) XHR_IGNORE_SAME_ORIGIN, @@ -1530,8 +1426,4 @@ /** Indicates that the 'SelectionNamespaces' property is supported by XPath expressions. */ @BrowserFeature({ @WebBrowser(IE), @WebBrowser(CHROME) }) XPATH_SELECTION_NAMESPACES, - - /** Indicates if XUL is supported (FF only). */ - @BrowserFeature(@WebBrowser(value = FF, maxVersion = 3.6f)) - XUL_SUPPORT; } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebWindowImpl.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebWindowImpl.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebWindowImpl.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -14,8 +14,6 @@ */ package com.gargoylesoftware.htmlunit; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.DISPLAY_LARGE_MENU_BAR; - import java.util.ArrayList; import java.util.List; import java.util.ListIterator; @@ -77,11 +75,6 @@ WebAssert.notNull("webClient", webClient); webClient_ = webClient; jobManager_ = BackgroundJavaScriptFactory.theFactory().createJavaScriptJobManager(this); - - // adjust inner height for ff 3.6 - if (webClient.getBrowserVersion().hasFeature(DISPLAY_LARGE_MENU_BAR)) { - outerHeight_ = innerHeight_ + 166; - } } /** Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlElement.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlElement.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -17,7 +17,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.BUTTON_EMPTY_TYPE_BUTTON; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_INPUT; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_PROPERTY_CHANGE; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HTMLELEMENT_TRIM_CLASS_ATTRIBUTE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.KEYBOARD_EVENT_SPECIAL_KEYPRESS; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.WINDOW_ACTIVE_ELEMENT_FOCUSED; @@ -110,12 +109,6 @@ final Map<String, DomAttr> attributes) { super(namespaceURI, qualifiedName, page, attributes); attributeListeners_ = new ArrayList<HtmlAttributeChangeListener>(); - if (page != null && hasFeature(HTMLELEMENT_TRIM_CLASS_ATTRIBUTE)) { - final String value = getAttribute("class"); - if (value != ATTRIBUTE_NOT_DEFINED) { - getAttributeNode("class").setValue(value.trim()); - } - } } /** Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlForm.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlForm.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlForm.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -14,7 +14,6 @@ */ package com.gargoylesoftware.htmlunit.html; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.FORM_SUBMISSION_URL_END_WITH_QUESTIONMARK; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.FORM_SUBMISSION_URL_WITHOUT_HASH; import java.net.MalformedURLException; @@ -175,8 +174,7 @@ // action may already contain some query parameters: they have to be removed actionUrl = StringUtils.substringBefore(actionUrl, "#"); actionUrl = StringUtils.substringBefore(actionUrl, "?"); - if (browser.hasFeature(FORM_SUBMISSION_URL_END_WITH_QUESTIONMARK) - || queryFromFields.length() > 0) { + if (queryFromFields.length() > 0) { actionUrl += "?" + queryFromFields; } if (anchor.length() > 0 Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlOption.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlOption.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlOption.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -18,8 +18,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_ONCLICK_FOR_SELECT_OPTION_ALSO; import static com.gargoylesoftware.htmlunit. BrowserVersionFeatures.EVENT_ONMOUSEDOWN_FOR_SELECT_OPTION_TRIGGERS_ADDITIONAL_DOWN_FOR_SELECT; -import static com.gargoylesoftware.htmlunit. - BrowserVersionFeatures.EVENT_ONMOUSEDOWN_FOR_SELECT_OPTION_TRIGGERS_ADDITIONAL_UP_FOR_SELECT; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_ONMOUSEDOWN_NOT_FOR_SELECT_OPTION; import static com.gargoylesoftware.htmlunit. BrowserVersionFeatures.EVENT_ONMOUSEUP_FOR_SELECT_OPTION_TRIGGERS_ADDITIONAL_UP_FOR_SELECT; @@ -253,10 +251,6 @@ if (hasFeature(EVENT_ONMOUSEDOWN_FOR_SELECT_OPTION_TRIGGERS_ADDITIONAL_DOWN_FOR_SELECT)) { page = getEnclosingSelect().mouseDown(shiftKey, ctrlKey, altKey, button); } - if (hasFeature(EVENT_ONMOUSEDOWN_FOR_SELECT_OPTION_TRIGGERS_ADDITIONAL_UP_FOR_SELECT)) { - page = getEnclosingSelect().mouseUp(shiftKey, ctrlKey, altKey, button); - } - if (hasFeature(EVENT_ONMOUSEDOWN_NOT_FOR_SELECT_OPTION)) { return page; } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -14,7 +14,6 @@ */ package com.gargoylesoftware.htmlunit.html; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.BLUR_BEFORE_ONCHANGE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_DOM_CONTENT_LOADED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_ONLOAD_FRAMESET_FIRST; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_ONLOAD_IFRAME_CREATED_BY_JAVASCRIPT; @@ -1947,14 +1946,8 @@ } if (oldFocusedElement != null) { - if (hasFeature(BLUR_BEFORE_ONCHANGE)) { - oldFocusedElement.fireEvent(Event.TYPE_BLUR); - oldFocusedElement.removeFocus(); - } - else { // IE, FF3 - oldFocusedElement.removeFocus(); - oldFocusedElement.fireEvent(Event.TYPE_BLUR); - } + oldFocusedElement.removeFocus(); + oldFocusedElement.fireEvent(Event.TYPE_BLUR); } } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlScript.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlScript.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlScript.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -18,7 +18,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_ONLOAD_EXTERNAL_JAVASCRIPT; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_ONREADY_STATE_CHANGE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HTMLSCRIPT_APPLICATION_JAVASCRIPT; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HTMLSCRIPT_SRC_JAVASCRIPT; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HTMLSCRIPT_TRIM_TYPE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_SCRIPT_ALWAYS_REEXECUTE_ON_SRC_CHANGE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_SCRIPT_SUPPORTS_FOR_AND_EVENT; @@ -374,7 +373,6 @@ } final HtmlPage page = (HtmlPage) getPage(); - final BrowserVersion browser = page.getWebClient().getBrowserVersion(); final String src = getSrcAttribute(); if (src.equals(SLASH_SLASH_COLON)) { @@ -382,24 +380,7 @@ } if (src != ATTRIBUTE_NOT_DEFINED) { - if (src.startsWith(JavaScriptURLConnection.JAVASCRIPT_PREFIX)) { - // <script src="javascript:'[code]'"></script> - if (browser.hasFeature(HTMLSCRIPT_SRC_JAVASCRIPT)) { - String code = StringUtils.removeStart(src, JavaScriptURLConnection.JAVASCRIPT_PREFIX).trim(); - final int len = code.length(); - if (len > 2) { - if ((code.charAt(0) == '\'' && code.charAt(len - 1) == '\'') - || (code.charAt(0) == '"' && code.charAt(len - 1) == '"')) { - code = code.substring(1, len - 1); - if (LOG.isDebugEnabled()) { - LOG.debug("Executing JavaScript: " + code); - } - page.executeJavaScriptIfPossible(code, code, getStartLineNumber()); - } - } - } - } - else { + if (!src.startsWith(JavaScriptURLConnection.JAVASCRIPT_PREFIX)) { // <script src="[url]"></script> if (LOG.isDebugEnabled()) { LOG.debug("Loading external JavaScript: " + src); Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/JavaScriptEngine.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/JavaScriptEngine.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/JavaScriptEngine.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -21,7 +21,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DONT_ENUM_FUNCTIONS; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_ECMA5_FUNCTIONS; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_FUNCTION_BIND; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_FUNCTION_ISXMLNAME; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_FUNCTION_TOSOURCE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_HAS_OBJECT_WITH_PROTOTYPE_PROPERTY_IN_WINDOW_SCOPE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_XML; @@ -319,9 +318,7 @@ removePrototypeProperties(window, "Number", "toSource"); removePrototypeProperties(window, "String", "toSource"); } - if (!browserVersion.hasFeature(JS_FUNCTION_ISXMLNAME)) { - deleteProperties(window, "isXMLName"); - } + deleteProperties(window, "isXMLName"); NativeFunctionToStringFunction.installFix(window, webClient.getBrowserVersion()); Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Document.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Document.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Document.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -17,7 +17,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOCUMENT_CREATE_ELEMENT_EXTENDED_SYNTAX; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOCUMENT_DESIGN_MODE_INHERIT; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_GET_ELEMENTS_BY_TAG_NAME_NOT_SUPPORTS_NAMESPACES; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XUL_SUPPORT; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.CHROME; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; @@ -45,7 +44,6 @@ import com.gargoylesoftware.htmlunit.html.DomText; import com.gargoylesoftware.htmlunit.html.FrameWindow; import com.gargoylesoftware.htmlunit.html.HTMLParser; -import com.gargoylesoftware.htmlunit.html.HtmlDivision; import com.gargoylesoftware.htmlunit.html.HtmlInput; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.impl.SimpleRange; @@ -480,15 +478,11 @@ @JsxFunction({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 10) }) public Object createElementNS(final String namespaceURI, final String qualifiedName) { final org.w3c.dom.Element element; - final BrowserVersion browserVersion = getBrowserVersion(); if ("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul".equals(namespaceURI)) { - if (!browserVersion.hasFeature(XUL_SUPPORT)) { - throw Context.reportRuntimeError("XUL not available"); - } - // simple hack, no need to implement the XUL objects (at least in a first time) - element = new HtmlDivision(namespaceURI, qualifiedName, getPage(), null); + throw Context.reportRuntimeError("XUL not available"); } - else if (HTMLParser.XHTML_NAMESPACE.equals(namespaceURI) + + if (HTMLParser.XHTML_NAMESPACE.equals(namespaceURI) || HTMLParser.SVG_NAMESPACE.equals(namespaceURI)) { element = getPage().createElementNS(namespaceURI, qualifiedName); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/DocumentType.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/DocumentType.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/DocumentType.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -16,7 +16,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOCTYPE_ENTITIES_EMPTY_STRING; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOCTYPE_ENTITIES_NULL; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOCTYPE_INTERNALSUBSET_EMPTY_STRING; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOCTYPE_NOTATIONS_EMPTY_STRING; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOCTYPE_NOTATIONS_NULL; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; @@ -89,9 +88,6 @@ return subset; } - if (getBrowserVersion().hasFeature(JS_DOCTYPE_INTERNALSUBSET_EMPTY_STRING)) { - return ""; - } return null; } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Element.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Element.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Element.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -16,7 +16,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.GENERATED_37; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_GET_ATTRIBUTE_SUPPORTS_FLAGS_IN_QUIRKS_MODE; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_SET_ATTRIBUTE_CONSIDERS_ATTR_FOR_CLASS_AS_REAL; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.CHROME; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; @@ -567,16 +566,8 @@ public Attr setAttributeNode(final Attr newAtt) { final String name = newAtt.getName(); - final Attr replacedAtt; - final boolean undefForClass = getBrowserVersion(). - hasFeature(JS_SET_ATTRIBUTE_CONSIDERS_ATTR_FOR_CLASS_AS_REAL); - if (undefForClass) { - replacedAtt = (Attr) getAttributeNode(name); - } - else { - final NamedNodeMap nodes = (NamedNodeMap) getAttributes(); - replacedAtt = (Attr) nodes.getNamedItemWithoutSytheticClassAttr(name); - } + final NamedNodeMap nodes = (NamedNodeMap) getAttributes(); + final Attr replacedAtt = (Attr) nodes.getNamedItemWithoutSytheticClassAttr(name); if (replacedAtt != null) { replacedAtt.detachFromParent(); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/HashChangeEvent.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/HashChangeEvent.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/HashChangeEvent.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -16,7 +16,6 @@ import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.CHROME; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; -import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; import com.gargoylesoftware.htmlunit.javascript.SimpleScriptable; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxClass; Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Storage.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Storage.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Storage.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -14,11 +14,6 @@ */ package com.gargoylesoftware.htmlunit.javascript.host; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.STORAGE_OBSOLETE; -import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.CHROME; -import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; -import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; - import java.util.Arrays; import java.util.List; import java.util.Map; @@ -30,7 +25,6 @@ import com.gargoylesoftware.htmlunit.javascript.configuration.JsxClass; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxFunction; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxGetter; -import com.gargoylesoftware.htmlunit.javascript.configuration.WebBrowser; /** * The JavaScript object that represents a Storage. @@ -154,17 +148,4 @@ public void clear() { getMap().clear(); } - - /** - * {@inheritDoc} - */ - @Override - public String getClassName() { - if (getWindow().getWebWindow() != null) { - if (getBrowserVersion().hasFeature(STORAGE_OBSOLETE)) { - return "StorageObsolete"; - } - } - return super.getClassName(); - } } 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 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -16,7 +16,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.GENERATED_133; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_EVENT_HANDLER_AS_PROPERTY_DONT_RECEIVE_EVENT; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_HANDLER_UNDEFINED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_CHANGE_OPENER_NOT_ALLOWED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_FRAMES_ACCESSIBLE_BY_ID; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_IS_A_FUNCTION; @@ -1249,11 +1248,7 @@ } private Object getHandlerForJavaScript(final String eventName) { - Object handler = getEventListenersContainer().getEventHandlerProp(eventName); - if (handler == null && getBrowserVersion().hasFeature(JS_HANDLER_UNDEFINED)) { - handler = Scriptable.NOT_FOUND; - } - return handler; + return getEventListenersContainer().getEventHandlerProp(eventName); } private void setHandlerForJavaScript(final String eventName, final Object handler) { Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclaration.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclaration.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclaration.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -17,7 +17,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_IMAGE_URL_QUOTED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_PIXEL_VALUES_INT_ONLY; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_SUPPORTS_BEHAVIOR_PROPERTY; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_ZINDEX_ROUNDED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_ZINDEX_TYPE_NUMBER; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_ZINDEX_UNDEFINED_FORCES_RESET; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_ZINDEX_UNDEFINED_OR_NULL_THROWS_ERROR; @@ -3892,12 +3891,7 @@ throw new WrappedException(e); } } - if (getBrowserVersion().hasFeature(CSS_ZINDEX_ROUNDED)) { - setStyleAttribute(Z_INDEX, Integer.toString(Math.round(d.floatValue() - 0.00001f))); - } - else { - setStyleAttribute(Z_INDEX, Integer.toString(d.intValue())); - } + setStyleAttribute(Z_INDEX, Integer.toString(d.intValue())); return; } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/ComputedCSSStyleDeclaration.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/ComputedCSSStyleDeclaration.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/ComputedCSSStyleDeclaration.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -20,7 +20,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_DEFAULT_WIDTH_AUTO; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_FONT_STRECH_DEFAULT_NORMAL; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_TEXT_SHADOW_DEFAULT_NONE; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_WORD_SPACING_DEFAULT_NORMAL; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_GET_BACKGROUND_COLOR_FOR_COMPUTED_STYLE_AS_RGB; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_LENGTH_WITHOUT_PX; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.TREATS_POSITION_FIXED_LIKE_POSITION_STATIC; @@ -1745,12 +1744,7 @@ */ @Override public String getWordSpacing() { - String wordSpacing = "0px"; - if (getBrowserVersion().hasFeature(CSS_WORD_SPACING_DEFAULT_NORMAL)) { - wordSpacing = "normal"; - } - - return defaultIfEmpty(super.getWordSpacing(), wordSpacing); + return defaultIfEmpty(super.getWordSpacing(), "0px"); } /** Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLButtonElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLButtonElement.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLButtonElement.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -15,7 +15,6 @@ package com.gargoylesoftware.htmlunit.javascript.host.html; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_BUTTON_SET_TYPE_THROWS_EXCEPTION; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_BUTTON_USE_CONTENT_AS_VALUE; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; import java.io.IOException; @@ -66,30 +65,6 @@ } /** - * {@inheritDoc} - */ - @Override - @JsxGetter - public String getValue() { - if (getBrowserVersion().hasFeature(JS_BUTTON_USE_CONTENT_AS_VALUE)) { - return getText(); - } - return super.getValue(); - } - - /** - * {@inheritDoc} - */ - @Override - @JsxSetter - public void setValue(final String newValue) { - if (getBrowserVersion().hasFeature(JS_BUTTON_USE_CONTENT_AS_VALUE)) { - setInnerText(newValue); - } - super.setValue(newValue); - } - - /** * {@inheritDoc} Overridden to modify browser configurations. */ @Override Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDocument.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDocument.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDocument.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -41,10 +41,8 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_FRAME_BODY_NULL_IF_NOT_LOADED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_GET_ELEMENTS_BY_NAME_EMPTY_RETURNS_NOTHING; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_GET_ELEMENTS_BY_NAME_NULL_RETURNS_NOTHING; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_GET_ELEMENT_BY_ID_ALSO_BY_NAME; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_GET_ELEMENT_BY_ID_ALSO_BY_NAME_IN_QUICKS_MODE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_GET_ELEMENT_BY_ID_CASE_SENSITIVE; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_QUERYCOMMAND_SUPPORTED_ONLY_DESIGNMODE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_TREEWALKER_EXPAND_ENTITY_REFERENCES_FALSE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.QUERYSELECTORALL_NOT_IN_QUIRKS; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.QUIRKS_MODE_ALWAYS_DOC_MODE_5; @@ -1340,8 +1338,7 @@ catch (final ElementNotFoundException e) { // Just fall through - result is already set to null final BrowserVersion browser = getBrowserVersion(); - if (browser.hasFeature(JS_GET_ELEMENT_BY_ID_ALSO_BY_NAME) - || browser.hasFeature(JS_GET_ELEMENT_BY_ID_ALSO_BY_NAME_IN_QUICKS_MODE) + if (browser.hasFeature(JS_GET_ELEMENT_BY_ID_ALSO_BY_NAME_IN_QUICKS_MODE) && getHtmlPage().isQuirksMode()) { final HTMLCollection elements = getElementsByName(id); result = elements.get(0, elements); @@ -1992,13 +1989,6 @@ */ @JsxFunction public boolean queryCommandSupported(final String cmd) { - if (getBrowserVersion().hasFeature(JS_QUERYCOMMAND_SUPPORTED_ONLY_DESIGNMODE)) { - final String mode = getDesignMode(); - if (!"on".equals(mode)) { - final String msg = "queryCommandSupported() called while document.designMode='" + mode + "'."; - throw Context.reportRuntimeError(msg); - } - } return hasCommand(cmd); } @@ -2027,13 +2017,6 @@ */ @JsxFunction public boolean queryCommandEnabled(final String cmd) { - if (getBrowserVersion().hasFeature(JS_QUERYCOMMAND_SUPPORTED_ONLY_DESIGNMODE)) { - final String mode = getDesignMode(); - if (!"on".equals(mode)) { - final String msg = "queryCommandEnabled() called while document.designMode='" + mode + "'."; - throw Context.reportRuntimeError(msg); - } - } return hasCommand(cmd); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -29,8 +29,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_BOUNDING_CLIENT_RECT_OFFSET_TWO; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_CHAR_EMULATED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_CHAR_OFF_EMULATED; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_CHAR_OFF_INTEGER; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_CHAR_UNDEFINED_DOT; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_CLIENT_LEFT_TOP_ZERO; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_ELEMENT_EXTENT_WITHOUT_PADDING; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_INNER_HTML_ADD_CHILD_FOR_NULL_VALUE; @@ -2461,11 +2459,7 @@ return ch_; } - final String ch = getDomNodeOrDie().getAttribute("char"); - if ((ch == DomElement.ATTRIBUTE_NOT_DEFINED) && (getBrowserVersion().hasFeature(JS_CHAR_UNDEFINED_DOT))) { - return "."; - } - return ch; + return getDomNodeOrDie().getAttribute("char"); } /** @@ -2507,22 +2501,12 @@ try { final float f = Float.parseFloat(chOff); - if (getBrowserVersion().hasFeature(JS_CHAR_OFF_INTEGER)) { - if (f < 0) { - chOff = "0"; - } - else { - chOff = Integer.toString((int) f); - } + final int i = (int) f; + if (i == f) { + chOff = Integer.toString(i); } else { - final int i = (int) f; - if (i == f) { - chOff = Integer.toString(i); - } - else { - chOff = Float.toString(f); - } + chOff = Float.toString(f); } } catch (final NumberFormatException e) { Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLSelectElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLSelectElement.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLSelectElement.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -16,9 +16,7 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_SELECT_INLINE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_SELECT_ADD_SECOND_PARAM_IS_INDEX; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_SELECT_ADD_SECOND_PARAM_IS_REQUIRED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_SELECT_ITEM_THROWS_IF_NEGATIVE; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_SELECT_SELECTED_INDEX_THROWS_IF_BAD; import java.util.List; @@ -172,9 +170,6 @@ beforeOption = null; } else if (Context.getUndefinedValue().equals(beforeOptionObject)) { - if (getBrowserVersion().hasFeature(JS_SELECT_ADD_SECOND_PARAM_IS_REQUIRED)) { - throw Context.reportRuntimeError("Not enough arguments [SelectElement.add]"); - } beforeOption = null; } else if (beforeOptionObject instanceof Number) { @@ -267,11 +262,6 @@ public void setSelectedIndex(final int index) { final HtmlSelect htmlSelect = getHtmlSelect(); - if (index != 0 && getBrowserVersion().hasFeature(JS_SELECT_SELECTED_INDEX_THROWS_IF_BAD) - && (index < -1 || index >= htmlSelect.getOptionSize())) { - throw Context.reportRuntimeError("Invalid index for select node: " + index); - } - for (final HtmlOption itemToUnSelect : htmlSelect.getSelectedOptions()) { htmlSelect.setSelectedAttribute(itemToUnSelect, false); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTextAreaElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTextAreaElement.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLTextAreaElement.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -15,8 +15,6 @@ package com.gargoylesoftware.htmlunit.javascript.host.html; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_DISPLAY_DEFAULT; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_TEXT_AREA_COLS_RETURNS_MINUS1; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_TEXT_AREA_ROWS_RETURNS_MINUS1; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_TEXT_AREA_SET_COLS_NEGATIVE_THROWS_EXCEPTION; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_TEXT_AREA_SET_COLS_THROWS_EXCEPTION; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_TEXT_AREA_SET_ROWS_NEGATIVE_THROWS_EXCEPTION; @@ -96,9 +94,6 @@ return Integer.parseInt(s); } catch (final NumberFormatException e) { - if (getBrowserVersion().hasFeature(JS_TEXT_AREA_COLS_RETURNS_MINUS1)) { - return -1; - } return 20; } } @@ -113,8 +108,7 @@ try { i = Float.valueOf(cols).intValue(); if (i < 0) { - if (getBrowserVersion().hasFeature(JS_TEXT_AREA_SET_COLS_NEGATIVE_THROWS_EXCEPTION) - || getBrowserVersion().hasFeature(JS_TEXT_AREA_COLS_RETURNS_MINUS1)) { + if (getBrowserVersion().hasFeature(JS_TEXT_AREA_SET_COLS_NEGATIVE_THROWS_EXCEPTION)) { throw new NumberFormatException("New value for cols '" + cols + "' is smaller than zero."); } getDomNodeOrDie().setAttribute("cols", null); @@ -125,10 +119,7 @@ if (getBrowserVersion().hasFeature(JS_TEXT_AREA_SET_COLS_THROWS_EXCEPTION)) { throw Context.throwAsScriptRuntimeEx(e); } - if (!getBrowserVersion().hasFeature(JS_TEXT_AREA_COLS_RETURNS_MINUS1)) { - return; - } - i = 0; + return; } getDomNodeOrDie().setAttribute("cols", Integer.toString(i)); } @@ -144,9 +135,6 @@ return Integer.parseInt(s); } catch (final NumberFormatException e) { - if (getBrowserVersion().hasFeature(JS_TEXT_AREA_ROWS_RETURNS_MINUS1)) { - return -1; - } return 2; } } @@ -161,8 +149,7 @@ try { i = new Float(rows).intValue(); if (i < 0) { - if (getBrowserVersion().hasFeature(JS_TEXT_AREA_SET_ROWS_NEGATIVE_THROWS_EXCEPTION) - || getBrowserVersion().hasFeature(JS_TEXT_AREA_COLS_RETURNS_MINUS1)) { + if (getBrowserVersion().hasFeature(JS_TEXT_AREA_SET_ROWS_NEGATIVE_THROWS_EXCEPTION)) { throw new NumberFormatException("New value for rows '" + rows + "' is smaller than zero."); } getDomNodeOrDie().setAttribute("rows", null); @@ -173,10 +160,7 @@ if (getBrowserVersion().hasFeature(JS_TEXT_AREA_SET_ROWS_THROWS_EXCEPTION)) { throw Context.throwAsScriptRuntimeEx(e); } - if (!getBrowserVersion().hasFeature(JS_TEXT_AREA_COLS_RETURNS_MINUS1)) { - return; - } - i = 0; + return; } getDomNodeOrDie().setAttribute("rows", Integer.toString(i)); } 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 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -16,7 +16,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_XML_SUPPORT_VIA_ACTIVEXOBJECT; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_ERRORHANDLER_NOT_SUPPORTED; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_HANDLER_THIS_IS_FUNCTION; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_IGNORE_SAME_ORIGIN; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_IGNORE_SAME_ORIGIN_TO_ABOUT; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.XHR_ONREADYSTATECANGE_SYNC_REQUESTS_COMPLETED; @@ -205,13 +204,6 @@ final Scriptable scope = stateChangeHandler_.getParentScope(); final JavaScriptEngine jsEngine = containingPage_.getWebClient().getJavaScriptEngine(); - final Scriptable thisValue; - if (browser.hasFeature(XHR_HANDLER_THIS_IS_FUNCTION)) { - thisValue = stateChangeHandler_; - } - else { - thisValue = this; - } if (LOG.isDebugEnabled()) { LOG.debug("Calling onreadystatechange handler for state " + state); } @@ -222,7 +214,7 @@ params[0] = event; } - jsEngine.callFunction(containingPage_, stateChangeHandler_, scope, thisValue, params); + jsEngine.callFunction(containingPage_, stateChangeHandler_, scope, this, params); if (LOG.isDebugEnabled()) { if (context == null) { context = Context.getCurrentContext(); Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLSerializer.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLSerializer.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLSerializer.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -16,7 +16,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_XML_SERIALIZER_ADD_XHTML_NAMESPACE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_XML_SERIALIZER_APPENDS_CRLF; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_XML_SERIALIZER_NODE_AS_UPPERCASE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_XML_SERIALIZER_NON_EMPTY_TAGS; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; @@ -126,8 +125,6 @@ final DomNode node = root.getDomNodeOrDie(); final SgmlPage page = node.getPage(); final boolean isHtmlPage = page != null && page.isHtmlPage(); - final boolean nodeNameAsUpperCase = getBrowserVersion().hasFeature(JS_XML_SERIALIZER_NODE_AS_UPPERCASE) - && isHtmlPage; final boolean appendCrlf = getBrowserVersion().hasFeature(JS_XML_SERIALIZER_APPENDS_CRLF); final boolean addXhtmlNamespace = getBrowserVersion().hasFeature(JS_XML_SERIALIZER_ADD_XHTML_NAMESPACE); @@ -137,7 +134,7 @@ forcedNamespace = "http://www.w3.org/1999/xhtml"; } } - toXml(1, node, buffer, forcedNamespace, nodeNameAsUpperCase, appendCrlf); + toXml(1, node, buffer, forcedNamespace, appendCrlf); if (appendCrlf) { buffer.append("\r\n"); @@ -149,11 +146,8 @@ private void toXml(final int indent, final DomNode node, final StringBuilder buffer, - final String foredNamespace, final boolean nodeNameAsUpperCase, final boolean appendCrLf) { - String nodeName = node.getNodeName(); - if (nodeNameAsUpperCase) { - nodeName = nodeName.toUpperCase(Locale.ENGLISH); - } + final String foredNamespace, final boolean appendCrLf) { + final String nodeName = node.getNodeName(); buffer.append('<').append(nodeName); String optionalPrefix = ""; @@ -190,7 +184,7 @@ } switch (child.getNodeType()) { case Node.ELEMENT_NODE: - toXml(indent + 1, child, buffer, null, nodeNameAsUpperCase, appendCrLf); + toXml(indent + 1, child, buffer, null, appendCrLf); break; case Node.TEXT_NODE: Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/BrowserVersionFeaturesTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/BrowserVersionFeaturesTest.java 2013-11-13 21:30:00 UTC (rev 8778) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/BrowserVersionFeaturesTest.java 2013-11-13 21:48:50 UTC (rev 8779) @@ -17,6 +17,9 @@ import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.NONE; import static org.junit.Assert.fail; +import java.util.LinkedList; +import java.util.List; + import org.junit.Test; import org.junit.runner.RunWith; @@ -41,11 +44,36 @@ for (final BrowserVersionFeatures feature : BrowserVersionFeatures.values()) { final String featureName = feature.name(); if (lastFeatureName != null && featureName.compareTo(lastFeatureName) < 1) { - fail("BrowserVersionFeatures.java: \"" - + featureName + "\" should be before \"" + lastFeatureName + '"'); + fail("BrowserVersionFeatures.java: '" + + featureName + "' should be before '" + lastFeatureName + "'"); } lastFeatureName = featureName; } } + /** + * Test of alphabetical order. + */ + @Test + @Browsers(NONE) + public void unusedFeatures() { + final List<BrowserVersion> browsers = new LinkedList<BrowserVersion>(); + browsers.add(BrowserVersion.FIREFOX_17); + browsers.add(BrowserVersion.FIREFOX_24); + browsers.add(BrowserVersion.INTERNET_EXPLORER_8); + browsers.add(BrowserVersion.INTERNET_EXPLORER_9); + browsers.add(BrowserVersion.INTERNET_EXPLORER_10); + browsers.add(BrowserVersion.CHROME); + + for (final BrowserVersionFeatures feature : BrowserVersionFeatures.values()) { + boolean inUse = false; + for (BrowserVersion browserVersion : browsers) { + if (browserVersion.hasFeature(feature)) { + inUse = true; + continue; + } + } + assertTrue("BrowserVersionFeatures.java: '" + feature.name() + "' in no longer in use.", inUse); + } + } } |
From: <asa...@us...> - 2013-11-14 07:34:08
|
Revision: 8780 http://sourceforge.net/p/htmlunit/code/8780 Author: asashour Date: 2013-11-14 07:34:03 +0000 (Thu, 14 Nov 2013) Log Message: ----------- JavaScript: fix window.postMessage() to verify protocol, port and hostname. 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/Window.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window2Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-11-13 21:48:50 UTC (rev 8779) +++ trunk/htmlunit/src/changes/changes.xml 2013-11-14 07:34:03 UTC (rev 8780) @@ -8,6 +8,9 @@ <body> <release version="2.14" date="???" description="Bugfixes"> + <action type="fix" dev="asashour"> + JavaScript: fix window.postMessage() to verify protocol, port and hostname. + </action> <action type="fix" dev="rbri"> JavaScript: XMLHttpRequest CORS handling fixed, some new tests added and implementation fixed. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-13 21:48:50 UTC (rev 8779) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-14 07:34:03 UTC (rev 8780) @@ -1193,9 +1193,13 @@ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_WINDOW_IS_A_FUNCTION, - /** Window.postMessage is synchronouse. */ + /** Window.postMessage is sent when the targetOrigin port is different than the current port. */ + @BrowserFeature(@WebBrowser(IE)) + JS_WINDOW_POST_MESSAGE_ALLOW_INVALID_PORT, + + /** Window.postMessage is synchronous. */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) - JS_WINDOW_POST_MESSAGE_SYNCHRONOUSE, + JS_WINDOW_POST_MESSAGE_SYNCHRONOUS, /** Supports XML. */ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME) }) 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 2013-11-13 21:48:50 UTC (rev 8779) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java 2013-11-14 07:34:03 UTC (rev 8780) @@ -19,7 +19,8 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_CHANGE_OPENER_NOT_ALLOWED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_FRAMES_ACCESSIBLE_BY_ID; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_IS_A_FUNCTION; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_POST_MESSAGE_SYNCHRONOUSE; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_POST_MESSAGE_ALLOW_INVALID_PORT; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_POST_MESSAGE_SYNCHRONOUS; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_XML_SUPPORT_VIA_ACTIVEXOBJECT; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.CHROME; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; @@ -2047,11 +2048,33 @@ */ @JsxFunction public void postMessage(final String message, final String targetOrigin) { + if (!"*".equals(targetOrigin)) { + final URL currentURL = getWebWindow().getEnclosedPage().getUrl(); + URL targetURL = null; + try { + targetURL = new URL(targetOrigin); + } + catch (final Exception e) { + Context.throwAsScriptRuntimeEx( + new Exception("SyntaxError: An invalid or illegal string was specified.")); + } + + if (getPort(targetURL) != getPort(currentURL) + && !getBrowserVersion().hasFeature(JS_WINDOW_POST_MESSAGE_ALLOW_INVALID_PORT)) { + return; + } + if (!targetURL.getHost().equals(currentURL.getHost())) { + return; + } + if (!targetURL.getProtocol().equals(currentURL.getProtocol())) { + return; + } + } final MessageEvent event = new MessageEvent(message); event.setParentScope(this); event.setPrototype(getPrototype(event.getClass())); - if (getBrowserVersion().hasFeature(JS_WINDOW_POST_MESSAGE_SYNCHRONOUSE)) { + if (getBrowserVersion().hasFeature(JS_WINDOW_POST_MESSAGE_SYNCHRONOUS)) { dispatchEvent(event); return; } @@ -2064,6 +2087,19 @@ }; getWebWindow().getWebClient().getJavaScriptEngine().addPostponedAction(action); } + + private static int getPort(final URL url) { + int port = url.getPort(); + if (port == -1) { + if ("http".equals(url.getProtocol())) { + port = 80; + } + else { + port = 443; + } + } + return port; + } } class HTMLCollectionFrames extends HTMLCollection { Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window2Test.java 2013-11-13 21:48:50 UTC (rev 8779) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window2Test.java 2013-11-14 07:34:03 UTC (rev 8780) @@ -27,6 +27,8 @@ import com.gargoylesoftware.htmlunit.BrowserRunner; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; import com.gargoylesoftware.htmlunit.BrowserRunner.Browsers; +import com.gargoylesoftware.htmlunit.BrowserRunner.BuggyWebDriver; +import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; import com.gargoylesoftware.htmlunit.WebDriverTestCase; /** @@ -1238,4 +1240,87 @@ getMockWebConnection().setResponse(URL_SECOND, iframe); loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "received", "posted" }, + CHROME = { "posted", "received" }) + @BuggyWebDriver(FF) + @NotYetImplemented(FF) + public void postMessage_exactURL() throws Exception { + // FF: strange: the result is different than postMessageSyncOrAsync() + // if alert() is done in URL2 just after postMessage() we will have postMessage_exactURL() expectation + // if alert() is removed in URL2 after postMessage(), we will have postMessageSyncOrAsync() expectation + postMessage(URL_FIRST.toExternalForm()); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("posted") + public void postMessage_otherHost() throws Exception { + postMessage("http://127.0.0.1:" + PORT + "/"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = "posted", + IE = { "received", "posted" }) + public void postMessage_otherPort() throws Exception { + postMessage("http://localhost:" + (PORT + 1) + "/"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("exception") + public void postMessage_invalidTargetOrigin() throws Exception { + postMessage("abcdefg"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("posted") + public void postMessage_otherProtocol() throws Exception { + postMessage("https://localhost:" + PORT + "/"); + } + + private void postMessage(final String url) throws Exception { + final String html + = "<html>" + + "<head><title>foo</title></head>\n" + + "<body>\n" + + "<script>\n" + + " function receiveMessage(event) {\n" + + " alert('received');\n" + + " }\n" + + " if (window.addEventListener) {\n" + + " window.addEventListener('message', receiveMessage, false);\n" + + " } else {\n" + + " window.attachEvent('onmessage', receiveMessage);\n" + + " }\n" + + "</script>\n" + + " <iframe src='" + URL_SECOND + "'></iframe>\n" + + "</body></html>"; + + final String iframe = "<html><body><script>\n" + + " try {\n" + + " top.postMessage('hello', '" + url + "');\n" + + " alert('posted');\n" + + " } catch (e) {\n" + + " alert('exception');\n" + + " }\n" + + "</script></body></html>"; + + getMockWebConnection().setResponse(URL_SECOND, iframe); + loadPageWithAlerts2(html); + } } |
From: <rb...@us...> - 2013-11-14 20:40:16
|
Revision: 8781 http://sourceforge.net/p/htmlunit/code/8781 Author: rbri Date: 2013-11-14 20:40:13 +0000 (Thu, 14 Nov 2013) Log Message: ----------- more cleanup Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/BrowserVersionFeaturesTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-14 07:34:03 UTC (rev 8780) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-14 20:40:13 UTC (rev 8781) @@ -209,11 +209,11 @@ EVENT_ONMOUSEDOWN_FOR_SELECT_OPTION_TRIGGERS_ADDITIONAL_DOWN_FOR_SELECT, /** Does not trigger "onmousedown" event handler for the select options. */ - @BrowserFeature({ @WebBrowser(IE), @WebBrowser(CHROME), @WebBrowser(value = FF, maxVersion = 3.6f) }) + @BrowserFeature({ @WebBrowser(IE), @WebBrowser(CHROME) }) EVENT_ONMOUSEDOWN_NOT_FOR_SELECT_OPTION, /** Does not trigger "onmousedown" event handler for the select options. */ - @BrowserFeature({ @WebBrowser(value = FF, maxVersion = 3.6f), @WebBrowser(IE), @WebBrowser(CHROME) }) + @BrowserFeature({ @WebBrowser(IE), @WebBrowser(CHROME) }) EVENT_ONMOUSEUP_FOR_SELECT_OPTION_TRIGGERS_ADDITIONAL_UP_FOR_SELECT, /** Does not trigger "onmouseup" event handler for the select options. */ @@ -469,7 +469,7 @@ HTMLBASEFONT_END_TAG_FORBIDDEN, /** Supports basefont. */ - @BrowserFeature({ @WebBrowser(IE), @WebBrowser(value = FF, maxVersion = 3.6f) }) + @BrowserFeature(@WebBrowser(IE)) HTMLBASEFONT_SUPPORTED, /** [object HTMLBGSoundElement]. */ @@ -605,7 +605,7 @@ HTML_COLOR_EXPAND_SHORT_HEX, /** Replace color names by their 6-digit hex color code. */ - @BrowserFeature({ @WebBrowser(value = IE, maxVersion = 8), @WebBrowser(value = FF, maxVersion = 3.6f) }) + @BrowserFeature(@WebBrowser(value = IE, maxVersion = 8)) HTML_COLOR_REPLACE_NAME_BY_HEX, /** Do not allow anything invalid in color, but restrict to valid values (names and hex digits) only. */ @@ -614,11 +614,11 @@ /** Do not allow anything invalid in color, but restrict to valid values (names and hex digits) only. * Fill up to 6 digits if shorter. */ - @BrowserFeature({ @WebBrowser(value = IE, maxVersion = 8), @WebBrowser(value = FF, maxVersion = 3.6f) }) + @BrowserFeature(@WebBrowser(value = IE, maxVersion = 8)) HTML_COLOR_RESTRICT_AND_FILL_UP, /** Convert the color (name and hex code) to lower case. */ - @BrowserFeature({ @WebBrowser(IE), @WebBrowser(value = FF, maxVersion = 3.6f) }) + @BrowserFeature(@WebBrowser(IE)) HTML_COLOR_TO_LOWER, /** HTMLCommentElement instead of Comment. */ @@ -653,7 +653,7 @@ /** Top scope constants can be assign (and are not... constants). */ - @BrowserFeature({ @WebBrowser(value = FF, maxVersion = 3.6f), @WebBrowser(value = IE, maxVersion = 9) }) + @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_ALLOW_CONST_ASSIGNMENT, /** @@ -755,7 +755,7 @@ JS_DOCTYPE_ENTITIES_EMPTY_STRING, /** Javascript doctyp.entities returns null (FF10). */ - @BrowserFeature({@WebBrowser(value = FF, maxVersion = 3.6f), @WebBrowser(value = IE, minVersion = 10) }) + @BrowserFeature(@WebBrowser(value = IE, minVersion = 10)) JS_DOCTYPE_ENTITIES_NULL, /** Javascript doctyp.notations returns an empty string (IE). */ @@ -763,7 +763,7 @@ JS_DOCTYPE_NOTATIONS_EMPTY_STRING, /** Javascript doctyp.notations returns null (FF10). */ - @BrowserFeature({@WebBrowser(value = FF, maxVersion = 3.6f), @WebBrowser(value = IE, minVersion = 10) }) + @BrowserFeature(@WebBrowser(value = IE, minVersion = 10)) JS_DOCTYPE_NOTATIONS_NULL, /** Javascript document.appendChild is allowed (IE). */ @@ -869,8 +869,7 @@ JS_FRAME_BODY_NULL_IF_NOT_LOADED, /** Indicates that the URL of parent window is used to resolve URLs in frames with javascript src. */ - @BrowserFeature({ @WebBrowser(value = IE, maxVersion = 6), - @WebBrowser(value = IE, minVersion = 8), @WebBrowser(FF), @WebBrowser(CHROME) }) + @BrowserFeature({ @WebBrowser(value = IE, minVersion = 8), @WebBrowser(FF), @WebBrowser(CHROME) }) JS_FRAME_RESOLVE_URL_WITH_PARENT_WINDOW, /** Indicates if Function.bind is available. */ Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/BrowserVersionFeaturesTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/BrowserVersionFeaturesTest.java 2013-11-14 07:34:03 UTC (rev 8780) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/BrowserVersionFeaturesTest.java 2013-11-14 20:40:13 UTC (rev 8781) @@ -17,6 +17,7 @@ import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.NONE; import static org.junit.Assert.fail; +import java.lang.reflect.Field; import java.util.LinkedList; import java.util.List; @@ -24,12 +25,15 @@ import org.junit.runner.RunWith; import com.gargoylesoftware.htmlunit.BrowserRunner.Browsers; +import com.gargoylesoftware.htmlunit.javascript.configuration.BrowserFeature; +import com.gargoylesoftware.htmlunit.javascript.configuration.WebBrowser; /** * Tests for {@link BrowserVersionFeatures}. * * @version $Revision$ * @author Ahmed Ashour + * @author Ronald Brill */ @RunWith(BrowserRunner.class) public class BrowserVersionFeaturesTest extends SimpleWebTestCase { @@ -53,10 +57,11 @@ /** * Test of alphabetical order. + * @throws Exception in case of problems */ @Test @Browsers(NONE) - public void unusedFeatures() { + public void unusedFeatures() throws Exception { final List<BrowserVersion> browsers = new LinkedList<BrowserVersion>(); browsers.add(BrowserVersion.FIREFOX_17); browsers.add(BrowserVersion.FIREFOX_24); @@ -75,5 +80,38 @@ } assertTrue("BrowserVersionFeatures.java: '" + feature.name() + "' in no longer in use.", inUse); } + + for (final BrowserVersionFeatures feature : BrowserVersionFeatures.values()) { + final Field field = BrowserVersionFeatures.class.getField(feature.name()); + final BrowserFeature browserFeature = field.getAnnotation(BrowserFeature.class); + + if (browserFeature != null) { + for (final WebBrowser annotatedBrowser : browserFeature.value()) { + boolean inUse = false; + for (BrowserVersion supportedBrowser : browsers) { + if (expectedBrowserName(supportedBrowser).equals(annotatedBrowser.value().name()) + && annotatedBrowser.minVersion() <= supportedBrowser.getBrowserVersionNumeric() + && annotatedBrowser.maxVersion() >= supportedBrowser.getBrowserVersionNumeric()) { + inUse = true; + continue; + } + } + assertTrue("BrowserVersionFeatures.java: Annotation '" + + annotatedBrowser.toString() + "' of feature '" + + feature.name() + "' in no longer in use.", inUse); + } + } + } } + + private String expectedBrowserName(final BrowserVersion browser) { + if (browser.isIE()) { + return "IE"; + } + if (browser.isFirefox()) { + return "FF"; + } + + return "CHROME"; + } } |
From: <asa...@us...> - 2013-11-15 10:28:47
|
Revision: 8782 http://sourceforge.net/p/htmlunit/code/8782 Author: asashour Date: 2013-11-15 10:28:45 +0000 (Fri, 15 Nov 2013) Log Message: ----------- JavaScript: add missing MessageEvent properties. 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/Event.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/MessageEvent.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDocument.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window2Test.java Added Paths: ----------- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/MessageEventTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-11-14 20:40:13 UTC (rev 8781) +++ trunk/htmlunit/src/changes/changes.xml 2013-11-15 10:28:45 UTC (rev 8782) @@ -8,6 +8,9 @@ <body> <release version="2.14" date="???" description="Bugfixes"> + <action type="add" dev="asashour"> + JavaScript: add missing MessageEvent properties. + </action> <action type="fix" dev="asashour"> JavaScript: fix window.postMessage() to verify protocol, port and hostname. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-14 20:40:13 UTC (rev 8781) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-15 10:28:45 UTC (rev 8782) @@ -1196,6 +1196,10 @@ @BrowserFeature(@WebBrowser(IE)) JS_WINDOW_POST_MESSAGE_ALLOW_INVALID_PORT, + /** Window.postMessage created cancelable event. */ + @BrowserFeature(@WebBrowser(FF)) + JS_WINDOW_POST_MESSAGE_CANCELABLE, + /** Window.postMessage is synchronous. */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_WINDOW_POST_MESSAGE_SYNCHRONOUS, Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Event.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Event.java 2013-11-14 20:40:13 UTC (rev 8781) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Event.java 2013-11-15 10:28:45 UTC (rev 8782) @@ -17,6 +17,7 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_FOCUS_DOCUMENT_DESCENDANTS; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_EVENT_ABORTED_BY_RETURN_VALUE_FALSE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_EVENT_KEY_CODE_UNDEFINED; +import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.CHROME; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; @@ -569,7 +570,7 @@ /** * @return whether or not this event bubbles */ - @JsxGetter({ @WebBrowser(FF), @WebBrowser(value = IE, minVersion = 10) }) + @JsxGetter({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 10) }) public boolean getBubbles() { return bubbles_; } @@ -577,7 +578,7 @@ /** * @return whether or not this event can be canceled */ - @JsxGetter({ @WebBrowser(FF), @WebBrowser(value = IE, minVersion = 10) }) + @JsxGetter({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 10) }) public boolean getCancelable() { return cancelable_; } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/MessageEvent.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/MessageEvent.java 2013-11-14 20:40:13 UTC (rev 8781) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/MessageEvent.java 2013-11-15 10:28:45 UTC (rev 8782) @@ -14,8 +14,14 @@ */ package com.gargoylesoftware.htmlunit.javascript.host; +import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.CHROME; +import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; +import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; + import com.gargoylesoftware.htmlunit.javascript.configuration.JsxClass; +import com.gargoylesoftware.htmlunit.javascript.configuration.JsxFunction; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxGetter; +import com.gargoylesoftware.htmlunit.javascript.configuration.WebBrowser; /** * A JavaScript object for MessageEvent. @@ -33,6 +39,9 @@ public class MessageEvent extends Event { private Object data_; + private String origin_; + private String lastEventId_; + private Window source_; /** * Default constructor used to build the prototype. @@ -51,6 +60,32 @@ } /** + * Initializes an event object. + * @param type the event type + * @param canBubble can the event bubble + * @param cancelable can the event be canceled + * @param data the message + * @param origin the scheme, hostname and port of the document that caused the event + * @param lastEventId the identifier of the last event + * @param source the window object that contains the document that caused the event + */ + @JsxFunction({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 10) }) + public void initMessageEvent( + final String type, + final boolean canBubble, + final boolean cancelable, + final String data, + final String origin, + final String lastEventId, + final Window source) { + initEvent(type, canBubble, cancelable); + data_ = data; + origin_ = origin; + lastEventId_ = lastEventId; + source_ = source; + } + + /** * Retrieves the data contained. * @return the data contained */ @@ -58,4 +93,31 @@ public Object getData() { return data_; } + + /** + * Gets the URI of the document of origin. + * @return the origin + */ + @JsxGetter + public String getOrigin() { + return origin_; + } + + /** + * Retrieves the identifier of the last event. + * @return the identified of the last event + */ + @JsxGetter({ @WebBrowser(FF), @WebBrowser(CHROME) }) + public String getLastEventId() { + return lastEventId_; + } + + /** + * Retrieves the data contained. + * @return the data contained + */ + @JsxGetter + public Window getSource() { + return source_; + } } 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 2013-11-14 20:40:13 UTC (rev 8781) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java 2013-11-15 10:28:45 UTC (rev 8782) @@ -20,6 +20,7 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_FRAMES_ACCESSIBLE_BY_ID; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_IS_A_FUNCTION; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_POST_MESSAGE_ALLOW_INVALID_PORT; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_POST_MESSAGE_CANCELABLE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_POST_MESSAGE_SYNCHRONOUS; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_XML_SUPPORT_VIA_ACTIVEXOBJECT; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.CHROME; @@ -2048,8 +2049,8 @@ */ @JsxFunction public void postMessage(final String message, final String targetOrigin) { + final URL currentURL = getWebWindow().getEnclosedPage().getUrl(); if (!"*".equals(targetOrigin)) { - final URL currentURL = getWebWindow().getEnclosedPage().getUrl(); URL targetURL = null; try { targetURL = new URL(targetOrigin); @@ -2070,7 +2071,10 @@ return; } } - final MessageEvent event = new MessageEvent(message); + final MessageEvent event = new MessageEvent(); + final String origin = currentURL.getProtocol() + "://" + currentURL.getHost() + ':' + currentURL.getPort(); + final boolean cancelable = getBrowserVersion().hasFeature(JS_WINDOW_POST_MESSAGE_CANCELABLE); + event.initMessageEvent(Event.TYPE_MESSAGE, false, cancelable, message, origin, "", this); event.setParentScope(this); event.setPrototype(getPrototype(event.getClass())); Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDocument.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDocument.java 2013-11-14 20:40:13 UTC (rev 8781) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLDocument.java 2013-11-15 10:28:45 UTC (rev 8782) @@ -123,6 +123,7 @@ import com.gargoylesoftware.htmlunit.javascript.host.Document; import com.gargoylesoftware.htmlunit.javascript.host.Event; import com.gargoylesoftware.htmlunit.javascript.host.KeyboardEvent; +import com.gargoylesoftware.htmlunit.javascript.host.MessageEvent; import com.gargoylesoftware.htmlunit.javascript.host.MouseEvent; import com.gargoylesoftware.htmlunit.javascript.host.MutationEvent; import com.gargoylesoftware.htmlunit.javascript.host.NamespaceCollection; @@ -236,6 +237,7 @@ dom3EventMap.put("Event", Event.class); dom3EventMap.put("KeyboardEvent", KeyboardEvent.class); dom3EventMap.put("MouseEvent", MouseEvent.class); + dom3EventMap.put("MessageEvent", MessageEvent.class); dom3EventMap.put("MutationEvent", MutationEvent.class); dom3EventMap.put("UIEvent", UIEvent.class); SUPPORTED_DOM3_EVENT_TYPE_MAP = Collections.unmodifiableMap(dom3EventMap); Added: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/MessageEventTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/MessageEventTest.java (rev 0) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/MessageEventTest.java 2013-11-15 10:28:45 UTC (rev 8782) @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2002-2013 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; + +/** + * Tests for {@link MessageEvent}. + * + * @version $Revision$ + * @author Ahmed Ashour + */ +@RunWith(BrowserRunner.class) +public class MessageEventTest extends WebDriverTestCase { + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "DOM2: exception", "DOM3: [object MessageEvent]" }, + IE8 = { "DOM2: exception", "DOM3: exception" }) + public void createEvent() throws Exception { + final String html = "<html><head><title>foo</title><script>\n" + + " function test() {\n" + + " try {\n" + + " alert('DOM2: ' + document.createEvent('MessageEvents'));\n" + + " } catch(e) {alert('DOM2: exception')}\n" + + " try {\n" + + " alert('DOM3: ' + document.createEvent('MessageEvent'));\n" + + " } catch(e) {alert('DOM3: exception')}\n" + + " }\n" + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if an error occurs + */ + @Test + @Alerts(DEFAULT = { "message", "true", "true", "hello", "http://localhost:", "2", "[object Window]" }, + IE8 = "exception") + public void initMessageEvent() throws Exception { + final String[] expectedAlerts = getExpectedAlerts(); + if (expectedAlerts.length > 4) { + expectedAlerts[4] += PORT; + setExpectedAlerts(expectedAlerts); + } + final String origin = "http://localhost:" + PORT; + final String html = "<html><body><script>\n" + + "try {\n" + + " var e = document.createEvent('MessageEvent');\n" + + " e.initMessageEvent('message', true, true, 'hello', '" + origin + "', 2, window, null);\n" + + " alert(e.type);\n" + + " alert(e.bubbles);\n" + + " alert(e.cancelable);\n" + + " alert(e.data);\n" + + " alert(e.origin);\n" + + " alert(e.lastEventId);\n" + + " alert(e.source);\n" + + "} catch(e) { alert('exception') }\n" + + "</script></body></html>"; + + loadPageWithAlerts2(html); + } + +} Property changes on: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/MessageEventTest.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 Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window2Test.java 2013-11-14 20:40:13 UTC (rev 8781) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window2Test.java 2013-11-15 10:28:45 UTC (rev 8782) @@ -1171,8 +1171,17 @@ * @throws Exception if the test fails */ @Test - @Alerts({ "type: message", "data: hello" }) + @Alerts(FF = { "type: message", "bubbles: false", "cancelable: true", "data: hello", + "origin: ", "source: [object Window]", "lastEventId: " }, + CHROME = { "type: message", "bubbles: false", "cancelable: false", "data: hello", + "origin: ", "source: [object Window]", "lastEventId: " }, + IE8 = { "type: message", "bubbles: undefined", "cancelable: undefined", "data: hello", + "origin: ", "source: [object]", "lastEventId: undefined" }) public void postMessage() throws Exception { + final String[] expectedAlerts = getExpectedAlerts(); + expectedAlerts[4] += "http://localhost:" + PORT; + setExpectedAlerts(expectedAlerts); + final String html = "<html>" + "<head><title>foo</title></head>\n" @@ -1180,10 +1189,12 @@ + "<script>\n" + " function receiveMessage(event) {\n" + " alert('type: ' + event.type);\n" + + " alert('bubbles: ' + event.bubbles);\n" + + " alert('cancelable: ' + event.cancelable);\n" + " alert('data: ' + event.data);\n" - // + " alert('origin: ' + event.origin);\n" - // + " alert('source: ' + event.source);\n" - // + " alert('lastEventId: ' + event.lastEventId);\n" + + " alert('origin: ' + event.origin);\n" + + " alert('source: ' + event.source);\n" + + " alert('lastEventId: ' + event.lastEventId);\n" + " }\n" + " if (window.addEventListener) {\n" |
From: <asa...@us...> - 2013-11-15 10:31:58
|
Revision: 8783 http://sourceforge.net/p/htmlunit/code/8783 Author: asashour Date: 2013-11-15 10:31:56 +0000 (Fri, 15 Nov 2013) Log Message: ----------- Small performance enhancement, thanks to Ronald Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-11-15 10:28:45 UTC (rev 8782) +++ trunk/htmlunit/src/changes/changes.xml 2013-11-15 10:31:56 UTC (rev 8783) @@ -18,7 +18,7 @@ JavaScript: XMLHttpRequest CORS handling fixed, some new tests added and implementation fixed. </action> <action type="fix" dev="rbri"> - JavaScript: Siplified/fixed implementation of the onReadyStateChange handler call. + JavaScript: Simplified/fixed implementation of the onReadyStateChange handler call. </action> <action type="fix" dev="rbri"> JavaScript: XMLHttpRequest status and statusText throws an exception in IE8 depending 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 2013-11-15 10:28:45 UTC (rev 8782) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java 2013-11-15 10:31:56 UTC (rev 8783) @@ -2060,8 +2060,8 @@ new Exception("SyntaxError: An invalid or illegal string was specified.")); } - if (getPort(targetURL) != getPort(currentURL) - && !getBrowserVersion().hasFeature(JS_WINDOW_POST_MESSAGE_ALLOW_INVALID_PORT)) { + if (!getBrowserVersion().hasFeature(JS_WINDOW_POST_MESSAGE_ALLOW_INVALID_PORT) + && getPort(targetURL) != getPort(currentURL)) { return; } if (!targetURL.getHost().equals(currentURL.getHost())) { |
From: <rb...@us...> - 2013-11-17 08:58:45
|
Revision: 8789 http://sourceforge.net/p/htmlunit/code/8789 Author: rbri Date: 2013-11-17 08:58:42 +0000 (Sun, 17 Nov 2013) Log Message: ----------- some more updated firefox 24 expectations Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersion.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/NavigatorTest.java trunk/htmlunit/src/test/resources/objects/properties.FF24.txt Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersion.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersion.java 2013-11-16 19:44:12 UTC (rev 8788) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersion.java 2013-11-17 08:58:42 UTC (rev 8789) @@ -177,7 +177,7 @@ FIREFOX_24.initDefaultFeatures(); FIREFOX_24.setBrowserLanguage("en-US"); - FIREFOX_24.buildId_ = "20131021230807"; + FIREFOX_24.buildId_ = "20131112155850"; FIREFOX_24.setHtmlAcceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); FIREFOX_24.setImgAcceptHeader("image/png,image/*;q=0.8,*/*;q=0.5"); FIREFOX_24.setCssAcceptHeader("text/css,*/*;q=0.1"); Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/NavigatorTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/NavigatorTest.java 2013-11-16 19:44:12 UTC (rev 8788) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/NavigatorTest.java 2013-11-17 08:58:42 UTC (rev 8789) @@ -304,7 +304,7 @@ @Test @Alerts(DEFAULT = "undefined", FF17 = "20130805152501", - FF24 = "20131021230807") + FF24 = "20131112155850") public void buildID() throws Exception { final String html = "<html><head><title>First</title>\n" Modified: trunk/htmlunit/src/test/resources/objects/properties.FF24.txt =================================================================== --- trunk/htmlunit/src/test/resources/objects/properties.FF24.txt 2013-11-16 19:44:12 UTC (rev 8788) +++ trunk/htmlunit/src/test/resources/objects/properties.FF24.txt 2013-11-17 08:58:42 UTC (rev 8789) @@ -1,14 +1,14 @@ Dom.text:appendData(),data,deleteData(),insertData(),length,replaceData(),splitText(),substringData(),wholeText -Dom.attr:isId,name,ownerElement,specified,value +Dom.attr:name,ownerElement,specified,value Dom.comment:appendData(),data,deleteData(),insertData(),length,replaceData(),substringData() HTMLUnknownElement: -HTMLElement:accessKey,accessKeyLabel,blur(),className,click(),contentEditable,contextMenu,dataset,dir,draggable,focus(),hidden,id,innerHTML,insertAdjacentHTML(),isContentEditable,itemId,itemProp,itemRef,itemScope,itemType,itemValue,lang,offsetHeight,offsetLeft,offsetParent,offsetTop,offsetWidth,outerHTML,properties,scrollIntoView(),spellcheck,style,tabIndex,title -HTMLAnchorElement:charset,coords,hash,host,hostname,href,hreflang,name,pathname,ping,port,protocol,rel,rev,search,shape,target,text,type +HTMLElement:accessKey,accessKeyLabel,blur(),className,click(),contentEditable,contextMenu,dataset,dir,draggable,focus(),hidden,isContentEditable,itemId,itemProp,itemRef,itemScope,itemType,itemValue,lang,offsetHeight,offsetLeft,offsetParent,offsetTop,offsetWidth,onabort,onblur,oncanplay,oncanplaythrough,onchange,onclick,oncontextmenu,oncopy,oncut,ondblclick,ondrag,ondragend,ondragenter,ondragleave,ondragover,ondragstart,ondrop,ondurationchange,onemptied,onended,onerror,onfocus,oninput,oninvalid,onkeydown,onkeypress,onkeyup,onload,onloadeddata,onloadedmetadata,onloadstart,onmousedown,onmousemove,onmouseout,onmouseover,onmouseup,onmozfullscreenchange,onmozfullscreenerror,onmozpointerlockchange,onmozpointerlockerror,onpaste,onpause,onplay,onplaying,onprogress,onratechange,onreset,onscroll,onseeked,onseeking,onselect,onshow,onstalled,onsubmit,onsuspend,ontimeupdate,onvolumechange,onwaiting,properties,spellcheck,style,tabIndex,title +HTMLAnchorElement:charset,coords,download,hash,host,hostname,href,hreflang,name,pathname,ping,port,protocol,rel,rev,search,shape,target,text,type ABBR: ACRONYM: ADDRESS: HTMLAppletElement:align,alt,archive,code,codeBase,height,hspace,name,object,vspace,width -HTMLAreaElement:alt,coords,hash,host,hostname,href,noHref,pathname,ping,port,protocol,search,shape,target +HTMLAreaElement:alt,coords,download,hash,host,hostname,href,noHref,pathname,ping,port,protocol,search,shape,target B: HTMLBaseElement:href,target HTMLBaseFontElement: @@ -20,7 +20,7 @@ HTMLBodyElement:aLink,background,bgColor,link,onafterprint,onbeforeprint,onbeforeunload,onhashchange,onmessage,onoffline,ononline,onpagehide,onpageshow,onpopstate,onresize,onunload,text,vLink HTMLBRElement:clear HTMLButtonElement:autofocus,checkValidity(),disabled,form,formAction,formEnctype,formMethod,formNoValidate,formTarget,name,setCustomValidity(),type,validationMessage,validity,value,willValidate -HTMLCanvasElement:getContext(),height,mozFetchAsStream(),mozGetAsFile(),MozGetIPCContext(),mozOpaque,toDataURL(),width +HTMLCanvasElement:getContext(),height,mozGetAsFile(),mozOpaque,mozPrintCallback,toBlob(),toDataURL(),width HTMLTableCaptionElement:align CENTER: CITE: @@ -36,15 +36,15 @@ HTMLDirectoryElement:compact HTMLDListElement:compact HTMLDivElement:align -HTMLDocument:alinkColor,anchors,applets,bgColor,body,captureEvents(),clear(),close(),compatMode,cookie,designMode,domain,embeds,execCommand(),fgColor,forms,getElementsByName(),getItems(),getSelection(),head,images,linkColor,links,open(),plugins,queryCommandEnabled(),queryCommandIndeterm(),queryCommandState(),queryCommandSupported(),queryCommandValue(),releaseEvents(),routeEvent(),scripts,URL,vlinkColor,write(),writeln() +HTMLDocument:alinkColor,all,anchors,applets,bgColor,body,captureEvents(),clear(),close(),cookie,designMode,domain,embeds,execCommand(),fgColor,forms,getElementsByName(),getItems(),getSelection(),head,images,linkColor,links,open(),plugins,queryCommandEnabled(),queryCommandIndeterm(),queryCommandState(),queryCommandSupported(),queryCommandValue(),releaseEvents(),routeEvent(),scripts,vlinkColor,write(),writeln() DT: EM: HTMLEmbedElement:align,getSVGDocument(),height,name,src,type,width -Event:ABORT,ALT_MASK,AT_TARGET,BACK,BLUR,bubbles,BUBBLING_PHASE,cancelable,CAPTURING_PHASE,CHANGE,CLICK,CONTROL_MASK,currentTarget,DBLCLICK,defaultPrevented,DRAGDROP,ERROR,eventPhase,explicitOriginalTarget,FOCUS,FORWARD,getPreventDefault(),HELP,initEvent(),isTrusted,KEYDOWN,KEYPRESS,KEYUP,LOAD,LOCATE,META_MASK,MOUSEDOWN,MOUSEDRAG,MOUSEMOVE,MOUSEOUT,MOUSEOVER,MOUSEUP,MOVE,NONE,originalTarget,preventBubble(),preventCapture(),preventDefault(),RESET,RESIZE,SCROLL,SELECT,SHIFT_MASK,stopImmediatePropagation(),stopPropagation(),SUBMIT,target,TEXT,timeStamp,type,UNLOAD,XFER_DONE +Event:ABORT,ALT_MASK,AT_TARGET,BACK,BLUR,bubbles,BUBBLING_PHASE,cancelable,CAPTURING_PHASE,CHANGE,CLICK,CONTROL_MASK,currentTarget,DBLCLICK,defaultPrevented,DRAGDROP,ERROR,eventPhase,explicitOriginalTarget,FOCUS,FORWARD,getPreventDefault(),HELP,initEvent(),isTrusted,KEYDOWN,KEYPRESS,KEYUP,LOAD,LOCATE,META_MASK,MOUSEDOWN,MOUSEDRAG,MOUSEMOVE,MOUSEOUT,MOUSEOVER,MOUSEUP,MOVE,NONE,originalTarget,preventDefault(),RESET,RESIZE,SCROLL,SELECT,SHIFT_MASK,stopImmediatePropagation(),stopPropagation(),SUBMIT,target,TEXT,timeStamp,type,UNLOAD,XFER_DONE HTMLFieldSetElement:checkValidity(),disabled,elements,form,name,setCustomValidity(),type,validationMessage,validity,willValidate HTMLFontElement:color,face,size HTMLFormElement:acceptCharset,action,autocomplete,checkValidity(),elements,encoding,enctype,length,method,name,noValidate,reset(),submit(),target -HTMLFrameElement:contentDocument,contentWindow,frameBorder,longDesc,marginHeight,marginWidth,mozbrowser,name,noResize,scrolling,src +HTMLFrameElement:contentDocument,contentWindow,frameBorder,longDesc,marginHeight,marginWidth,name,noResize,scrolling,src HTMLFrameSetElement:cols,onafterprint,onbeforeprint,onbeforeunload,onhashchange,onmessage,onoffline,ononline,onpagehide,onpageshow,onpopstate,onresize,onunload,rows HTMLHeadElement: History:0,1,back(),current,forward(),go(),item(),length,next,previous,pushState(),replaceState(),state @@ -52,30 +52,30 @@ HTMLHRElement:align,color,noShade,size,width HTMLHtmlElement:version I: -HTMLIFrameElement:align,contentDocument,contentWindow,frameBorder,getSVGDocument(),height,longDesc,marginHeight,marginWidth,mozAllowFullScreen,mozbrowser,name,sandbox,scrolling,src,width +HTMLIFrameElement:align,allowFullscreen,contentDocument,contentWindow,frameBorder,getSVGDocument(),height,longDesc,marginHeight,marginWidth,name,sandbox,scrolling,src,width HTMLImageElement:align,alt,border,complete,crossOrigin,height,hspace,isMap,longDesc,lowsrc,name,naturalHeight,naturalWidth,src,useMap,vspace,width,x,y -HTMLInputElement:accept,align,alt,autocomplete,autofocus,checked,checkValidity(),controllers,defaultChecked,defaultValue,disabled,files,form,formAction,formEnctype,formMethod,formNoValidate,formTarget,height,indeterminate,list,max,maxLength,min,mozGetFileNameArray(),mozIsTextField(),mozSetFileNameArray(),multiple,name,pattern,placeholder,readOnly,required,select(),selectionDirection,selectionEnd,selectionStart,setCustomValidity(),setSelectionRange(),size,src,step,stepDown(),stepUp(),textLength,type,useMap,validationMessage,validity,value,valueAsNumber,width,willValidate +HTMLInputElement:accept,align,alt,autocomplete,autofocus,checked,checkValidity(),controllers,defaultChecked,defaultValue,disabled,files,form,formAction,formEnctype,formMethod,formNoValidate,formTarget,height,indeterminate,list,max,maxLength,min,mozIsTextField(),multiple,name,pattern,placeholder,readOnly,required,select(),selectionDirection,selectionEnd,selectionStart,setCustomValidity(),setSelectionRange(),size,src,step,stepDown(),stepUp(),textLength,type,useMap,validationMessage,validity,value,valueAsNumber,width,willValidate HTMLInsElement:cite,dateTime HTMLIsIndexElement: KBD: HTMLLabelElement:control,form,htmlFor HTMLLIElement:type,value -HTMLLinkElement:charset,disabled,href,hreflang,media,rel,rev,sheet,target,type +HTMLLinkElement:charset,crossOrigin,disabled,href,hreflang,media,rel,rev,sheet,target,type HTMLLegendElement:align,form LISTING: -Location:assign(),hash,host,hostname,href,pathname,port,protocol,reload(),replace(),search +Location:assign(),hash,host,hostname,href,origin,pathname,port,protocol,reload(),replace(),search,valueOf() HTMLMapElement:areas,name MARQUEE:align HTMLMenuElement:compact,label,type HTMLMetaElement:content,httpEquiv,name,scheme MULTICOL: -Navigator:addIdleObserver(),appCodeName,appName,appVersion,battery,buildID,cookieEnabled,doNotTrack,geolocation,getDeviceStorage(),javaEnabled(),language,mimeTypes,mozCameras,mozConnection,mozGetUserMedia(),mozIsLocallyAvailable(),mozMobileConnection,mozPower,mozSms,onLine,oscpu,platform,plugins,product,productSub,registerContentHandler(),registerProtocolHandler(),removeIdleObserver(),requestWakeLock(),taintEnabled(),userAgent,vendor,vendorSub,vibrate() +Navigator:addIdleObserver(),appCodeName,appName,appVersion,battery,buildID,cookieEnabled,doNotTrack,geolocation,getDeviceStorage(),getDeviceStorages(),javaEnabled(),language,mimeTypes,mozCameras,mozConnection,mozGetUserMedia(),mozGetUserMediaDevices(),mozIsLocallyAvailable(),mozMobileMessage,mozPower,mozSms,onLine,oscpu,platform,plugins,product,productSub,registerContentHandler(),registerProtocolHandler(),removeIdleObserver(),requestWakeLock(),taintEnabled(),userAgent,vendor,vendorSub,vibrate() NOBR: NOEMBED: NOFRAMES: NOSCRIPT: -HTMLObjectElement:align,archive,border,checkValidity(),code,codeBase,codeType,contentDocument,data,declare,form,getSVGDocument(),height,hspace,name,setCustomValidity(),standby,type,useMap,validationMessage,validity,vspace,width,willValidate -HTMLOListElement:compact,start,type +HTMLObjectElement:align,archive,border,checkValidity(),code,codeBase,codeType,contentDocument,contentWindow,data,declare,form,getSVGDocument(),height,hspace,name,setCustomValidity(),standby,type,useMap,validationMessage,validity,vspace,width,willValidate +HTMLOListElement:compact,reversed,start,type HTMLOptGroupElement:disabled,label HTMLOptionElement:defaultSelected,disabled,form,index,label,selected,text,value HTMLParagraphElement:align @@ -86,19 +86,19 @@ S: SAMP: HTMLScriptElement:async,charset,crossOrigin,defer,event,htmlFor,src,text,type -HTMLSelectElement:add(),autofocus,checkValidity(),disabled,form,item(),length,multiple,name,namedItem(),options,remove(),required,selectedIndex,setCustomValidity(),size,type,validationMessage,validity,value,willValidate +HTMLSelectElement:add(),autofocus,checkValidity(),disabled,form,item(),iterator(),length,multiple,name,namedItem(),options,required,selectedIndex,setCustomValidity(),size,type,validationMessage,validity,value,willValidate SMALL: HTMLSpacerElement: HTMLSpanElement: STRIKE: STRONG: -HTMLStyleElement:disabled,media,sheet,type +HTMLStyleElement:disabled,media,scoped,sheet,type SUB: SUP: HTMLTableElement:align,bgColor,border,caption,cellPadding,cellSpacing,createCaption(),createTFoot(),createTHead(),deleteCaption(),deleteRow(),deleteTFoot(),deleteTHead(),frame,insertRow(),rows,rules,summary,tBodies,tFoot,tHead,width HTMLTableSectionElement:align,ch,chOff,deleteRow(),insertRow(),rows,vAlign HTMLTableCellElement:abbr,align,axis,bgColor,cellIndex,ch,chOff,colSpan,headers,height,noWrap,rowSpan,scope,vAlign,width -HTMLTextAreaElement:autofocus,checkValidity(),cols,controllers,defaultValue,disabled,form,maxLength,name,placeholder,readOnly,required,rows,select(),selectionDirection,selectionEnd,selectionStart,setCustomValidity(),setSelectionRange(),textLength,type,validationMessage,validity,value,willValidate,wrap +HTMLTextAreaElement:autofocus,checkValidity(),cols,defaultValue,disabled,form,maxLength,name,placeholder,readOnly,required,rows,select(),selectionDirection,selectionEnd,selectionStart,setCustomValidity(),setSelectionRange(),textLength,type,validationMessage,validity,value,willValidate,wrap TFoot:align,ch,chOff,deleteRow(),insertRow(),rows,vAlign TH:abbr,align,axis,bgColor,cellIndex,ch,chOff,colSpan,headers,height,noWrap,rowSpan,scope,vAlign,width THead:align,ch,chOff,deleteRow(),insertRow(),rows,vAlign @@ -109,5 +109,5 @@ HTMLUListElement:compact,type VAR: HTMLWBRElement: -Window:addEventListener(),alert(),applicationCache,atob(),back(),blur(),btoa(),captureEvents(),clearInterval(),clearTimeout(),close(),closed,confirm(),content,controllers,createXmlDocument(),crypto,defaultStatus,disableExternalCapture(),dispatchEvent(),document,dump(),enableExternalCapture(),find(),focus(),forward(),frameElement,frames,fullScreen,getComputedStyle(),getSelection(),history,home(),ieMethods,indexedDB,init(),innerHeight,innerWidth,InstallTrigger,length,localStorage,location,locationbar,matchMedia(),menubar,moveBy(),moveTo(),mozAnimationStartTime,mozCancelAnimationFrame(),mozCancelRequestAnimationFrame(),mozIndexedDB,mozInnerScreenX,mozInnerScreenY,mozPaintCount,mozRequestAnimationFrame(),name,navigator,onabort,onafterprint,onafterscriptexecute,onbeforeprint,onbeforescriptexecute,onbeforeunload,onblur,oncanplay,oncanplaythrough,onchange,onclick,oncontextmenu,oncopy,oncut,ondblclick,ondevicelight,ondevicemotion,ondeviceorientation,ondeviceproximity,ondrag,ondragend,ondragenter,ondragleave,ondragover,ondragstart,ondrop,ondurationchange,onemptied,onended,onerror,onfocus,onhashchange,oninput,oninvalid,onkeydown,onkeypress,onkeyup,onload(),onloadeddata,onloadedmetadata,onloadstart,onmessage,onmousedown,onmouseenter,onmouseleave,onmousemove,onmouseout,onmouseover,onmouseup,onmozfullscreenchange,onmozfullscreenerror,onmozpointerlockchange,onmozpointerlockerror,onoffline,ononline,onpagehide,onpageshow,onpaste,onpause,onplay,onplaying,onpopstate,onprogress,onratechange,onreset,onresize,onscroll,onseeked,onseeking,onselect,onshow,onstalled,onsubmit,onsuspend,ontimeupdate,onunload,onuserproximity,onvolumechange,onwaiting,onwheel,open(),openDialog(),opener,outerHeight,outerWidth,pageXOffset,pageYOffset,parent,performance,personalbar,pkcs11,postMessage(),print(),prompt(),releaseEvents(),removeEventListener(),resizeBy(),resizeTo(),routeEvent(),screen,screenX,screenY,scroll(),scrollbars,scrollBy(),scrollByLines(),scrollByPages(),scrollMaxX,scrollMaxY,scrollTo(),scrollX,scrollY,self,sessionStorage,setInterval(),setResizable(),setTimeout(),showModalDialog(),sizeToContent(),sortFunction(),status,statusbar,stop(),toolbar,top,updateCommands(),URL,window,writeAll() -XMP: \ No newline at end of file +Window:addEventListener(),alert(),applicationCache,atob(),back(),blur(),btoa(),cancelAnimationFrame(),captureEvents(),clearInterval(),clearTimeout(),close(),closed,confirm(),console,content,controllers,createXmlDocument(),crypto,devicePixelRatio,disableExternalCapture(),dispatchEvent(),document,dump(),enableExternalCapture(),external,find(),focus(),forward(),frameElement,frames,fullScreen,getComputedStyle(),getDefaultComputedStyle(),getInterface(),getSelection(),history,home(),ieMethods,indexedDB,init(),innerHeight,innerWidth,InstallTrigger,length,localStorage,location,locationbar,matchMedia(),menubar,moveBy(),moveTo(),mozAnimationStartTime,mozCancelAnimationFrame(),mozCancelRequestAnimationFrame(),mozIndexedDB,mozInnerScreenX,mozInnerScreenY,mozPaintCount,mozRequestAnimationFrame(),name,navigator,onabort,onafterprint,onafterscriptexecute,onbeforeprint,onbeforescriptexecute,onbeforeunload,onblur,oncanplay,oncanplaythrough,onchange,onclick,oncontextmenu,oncopy,oncut,ondblclick,ondevicelight,ondevicemotion,ondeviceorientation,ondeviceproximity,ondrag,ondragend,ondragenter,ondragleave,ondragover,ondragstart,ondrop,ondurationchange,onemptied,onended,onerror,onfocus,onhashchange,oninput,oninvalid,onkeydown,onkeypress,onkeyup,onload(),onloadeddata,onloadedmetadata,onloadstart,onmessage,onmousedown,onmouseenter,onmouseleave,onmousemove,onmouseout,onmouseover,onmouseup,onmozfullscreenchange,onmozfullscreenerror,onmozpointerlockchange,onmozpointerlockerror,onoffline,ononline,onpagehide,onpageshow,onpaste,onpause,onplay,onplaying,onpopstate,onprogress,onratechange,onreset,onresize,onscroll,onseeked,onseeking,onselect,onshow,onstalled,onsubmit,onsuspend,ontimeupdate,onunload,onuserproximity,onvolumechange,onwaiting,onwheel,open(),openDialog(),opener,outerHeight,outerWidth,pageXOffset,pageYOffset,parent,performance,personalbar,pkcs11,postMessage(),print(),prompt(),releaseEvents(),removeEventListener(),requestAnimationFrame(),resizeBy(),resizeTo(),routeEvent(),screen,screenX,screenY,scroll(),scrollbars,scrollBy(),scrollByLines(),scrollByPages(),scrollMaxX,scrollMaxY,scrollTo(),scrollX,scrollY,self,sessionStorage,setInterval(),setResizable(),setTimeout(),showModalDialog(),sidebar,sizeToContent(),sortFunction(),speechSynthesis,status,statusbar,stop(),toolbar,top,updateCommands(),window,writeAll() +XMP: |
From: <rb...@us...> - 2013-11-17 13:21:34
|
Revision: 8790 http://sourceforge.net/p/htmlunit/code/8790 Author: rbri Date: 2013-11-17 13:21:30 +0000 (Sun, 17 Nov 2013) Log Message: ----------- support more features for DOMImplementation (Frank Danek) Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/dom/DOMImplementation.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/dom/DOMImplementationTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-17 08:58:42 UTC (rev 8789) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-17 13:21:30 UTC (rev 8790) @@ -140,22 +140,6 @@ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) DOCTYPE_IS_COMMENT, - /** If document.implementation.hasFeature() supports "CSS 3.0". */ - @BrowserFeature(@WebBrowser(value = FF, minVersion = 24)) - DOMIMPLEMENTATION_CSS_3, - - /** If document.implementation.hasFeature() supports "HTML 3.0". */ - @BrowserFeature(@WebBrowser(value = FF, minVersion = 24)) - DOMIMPLEMENTATION_HTML_3, - - /** If document.implementation.hasFeature() supports only "HTML". */ - @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) - DOMIMPLEMENTATION_ONLY_HTML, - - /** If document.implementation.hasFeature() supports "XML 3.0". */ - @BrowserFeature(@WebBrowser(value = FF, minVersion = 24)) - DOMIMPLEMENTATION_XML_3, - /** IE removes all child text nodes, but FF preserves the first. */ @BrowserFeature(@WebBrowser(IE)) DOM_NORMALIZE_REMOVE_CHILDREN, @@ -770,7 +754,7 @@ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) JS_DOCUMENT_APPEND_CHILD_SUPPORTED, - /** Document instead of HTMLDocument. */ + /** Document instead of HTMLDocument or XMLDocument. */ @BrowserFeature(@WebBrowser(value = IE, minVersion = 10)) JS_DOCUMENT_CLASS_NAME, @@ -806,6 +790,62 @@ @BrowserFeature(@WebBrowser(IE)) JS_DOCUMENT_SETTING_DOMAIN_THROWS_FOR_ABOUT_BLANK, + /** If document.implementation.hasFeature() supports 'Core 1.0'. */ + @BrowserFeature(@WebBrowser(value = IE, minVersion = 10)) + JS_DOMIMPLEMENTATION_FEATURE_CORE_1, + + /** If document.implementation.hasFeature() supports 'CSS2 2.0'. */ + @BrowserFeature(@WebBrowser(FF)) + JS_DOMIMPLEMENTATION_FEATURE_CSS2_2, + + /** If document.implementation.hasFeature() supports 'CSS 2.0'. */ + @BrowserFeature(@WebBrowser(FF)) + JS_DOMIMPLEMENTATION_FEATURE_CSS_2, + + /** If document.implementation.hasFeature() supports 'CSS 3.0'. */ + @BrowserFeature(@WebBrowser(value = FF, minVersion = 24)) + JS_DOMIMPLEMENTATION_FEATURE_CSS_3, + + /** If document.implementation.hasFeature() supports 'Events 3.0'. */ + @BrowserFeature(@WebBrowser(value = IE, minVersion = 10)) + JS_DOMIMPLEMENTATION_FEATURE_EVENTS_3, + + /** If document.implementation.hasFeature() supports 'HTML 3.0'. */ + @BrowserFeature(@WebBrowser(value = FF, minVersion = 24)) + JS_DOMIMPLEMENTATION_FEATURE_HTML_3, + + /** If document.implementation.hasFeature() supports 'MutationEvents 2.0'. */ + @BrowserFeature(@WebBrowser(value = IE, minVersion = 10)) + JS_DOMIMPLEMENTATION_FEATURE_MUTATIONEVENTS_2, + + /** If document.implementation.hasFeature() supports only 'HTML'. */ + @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) + JS_DOMIMPLEMENTATION_FEATURE_ONLY_HTML, + + /** If document.implementation.hasFeature() supports 'StyleSheets 2.0'. */ + @BrowserFeature(@WebBrowser(FF)) + JS_DOMIMPLEMENTATION_FEATURE_STYLESHEETS_2, + + /** If document.implementation.hasFeature() supports 'Traversal 2.0'. */ + @BrowserFeature(@WebBrowser(value = IE, minVersion = 10)) + JS_DOMIMPLEMENTATION_FEATURE_TRAVERSAL_2, + + /** If document.implementation.hasFeature() supports 'UIEvents 2.0'. */ + @BrowserFeature(@WebBrowser(FF)) + JS_DOMIMPLEMENTATION_FEATURE_UIEVENTS_2, + + /** If document.implementation.hasFeature() supports 'XHTML 1.0'. */ + @BrowserFeature(@WebBrowser(value = IE, minVersion = 10)) + JS_DOMIMPLEMENTATION_FEATURE_XHTML_1, + + /** If document.implementation.hasFeature() supports 'XML 3.0'. */ + @BrowserFeature(@WebBrowser(value = FF, minVersion = 24)) + JS_DOMIMPLEMENTATION_FEATURE_XML_3, + + /** If document.implementation.hasFeature() supports 'XPath 3.0'. */ + @BrowserFeature(@WebBrowser(FF)) + JS_DOMIMPLEMENTATION_FEATURE_XPATH_3, + /** Don't enumerate functions, see {@link net.sourceforge.htmlunit.corejs.javascript.ScriptableObject#DONTENUM}. */ @BrowserFeature(@WebBrowser(IE)) JS_DONT_ENUM_FUNCTIONS, Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/dom/DOMImplementation.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/dom/DOMImplementation.java 2013-11-17 08:58:42 UTC (rev 8789) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/dom/DOMImplementation.java 2013-11-17 13:21:30 UTC (rev 8790) @@ -14,10 +14,19 @@ */ package com.gargoylesoftware.htmlunit.javascript.host.dom; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.DOMIMPLEMENTATION_CSS_3; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.DOMIMPLEMENTATION_HTML_3; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.DOMIMPLEMENTATION_ONLY_HTML; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.DOMIMPLEMENTATION_XML_3; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOMIMPLEMENTATION_FEATURE_CORE_1; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOMIMPLEMENTATION_FEATURE_CSS2_2; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOMIMPLEMENTATION_FEATURE_CSS_2; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOMIMPLEMENTATION_FEATURE_EVENTS_3; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOMIMPLEMENTATION_FEATURE_HTML_3; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOMIMPLEMENTATION_FEATURE_MUTATIONEVENTS_2; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOMIMPLEMENTATION_FEATURE_ONLY_HTML; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOMIMPLEMENTATION_FEATURE_STYLESHEETS_2; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOMIMPLEMENTATION_FEATURE_TRAVERSAL_2; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOMIMPLEMENTATION_FEATURE_UIEVENTS_2; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOMIMPLEMENTATION_FEATURE_XHTML_1; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOMIMPLEMENTATION_FEATURE_XML_3; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOMIMPLEMENTATION_FEATURE_XPATH_3; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.CHROME; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; @@ -50,37 +59,105 @@ */ @JsxFunction public boolean hasFeature(final String feature, final String version) { - if (getBrowserVersion().hasFeature(DOMIMPLEMENTATION_ONLY_HTML)) { + if (getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_ONLY_HTML)) { if ("HTML".equals(feature) && "1.0".equals(version)) { return true; } } else { - if ("HTML".equals(feature) && ("1.0".equals(version) || "2.0".equals(version))) { - return true; + if ("Core".equals(feature)) { + if ("1.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_CORE_1); + } + else if ("2.0".equals(version)) { + return true; + } } - else if ("HTML".equals(feature) && "3.0".equals(version)) { - return getBrowserVersion().hasFeature(DOMIMPLEMENTATION_HTML_3); + else if ("HTML".equals(feature)) { + if ("1.0".equals(version) || "2.0".equals(version)) { + return true; + } + else if ("3.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_HTML_3); + } } - else if ("XML".equals(feature) && ("1.0".equals(version) || "2.0".equals(version))) { + else if ("XHTML".equals(feature)) { + if ("1.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_XHTML_1); + } + else if ("2.0".equals(version)) { + return true; + } + } + else if ("XML".equals(feature)) { + if ("1.0".equals(version) || "2.0".equals(version)) { + return true; + } + else if ("3.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_XML_3); + } + } + else if ("Views".equals(feature) && "2.0".equals(version)) { return true; } - else if ("XML".equals(feature) && "3.0".equals(version)) { - return getBrowserVersion().hasFeature(DOMIMPLEMENTATION_XML_3); + else if ("StyleSheets".equals(feature) && "2.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_STYLESHEETS_2); } + else if ("CSS".equals(feature) && "2.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_CSS_2); + } else if ("CSS2".equals(feature) && "2.0".equals(version)) { - return true; + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_CSS2_2); } - else if ("CSS2".equals(feature) && ("1.0".equals(version) || "3.0".equals(version))) { - return getBrowserVersion().hasFeature(DOMIMPLEMENTATION_CSS_3); + else if ("Events".equals(feature)) { + if ("2.0".equals(version)) { + return true; + } + else if ("3.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_EVENTS_3); + } } - else if ("CSS3".equals(feature) - && ("1.0".equals(version) || "2.0".equals(version) || "3.0".equals(version))) { - return getBrowserVersion().hasFeature(DOMIMPLEMENTATION_CSS_3); + else if ("UIEvents".equals(feature)) { + if ("2.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_UIEVENTS_2); + } + else if ("3.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_EVENTS_3); + } } - else if ("XPath".equals(feature) && "3.0".equals(version)) { + else if ("MouseEvents".equals(feature)) { + if ("2.0".equals(version)) { + return true; + } + else if ("3.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_EVENTS_3); + } + } + else if ("MutationEvents".equals(feature)) { + if ("2.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_MUTATIONEVENTS_2); + } + else if ("3.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_EVENTS_3); + } + } + else if ("HTMLEvents".equals(feature)) { + if ("2.0".equals(version)) { + return true; + } + else if ("3.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_EVENTS_3); + } + } + else if ("Range".equals(feature) && "2.0".equals(version)) { return true; } + else if ("Traversal".equals(feature) && "2.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_TRAVERSAL_2); + } + else if ("XPath".equals(feature) && "3.0".equals(version)) { + return getBrowserVersion().hasFeature(JS_DOMIMPLEMENTATION_FEATURE_XPATH_3); + } else if ("http://www.w3.org/TR/SVG11/feature#BasicStructure".equals(feature) && ("1.0".equals(version) || "1.1".equals(version))) { return true; @@ -111,7 +188,7 @@ document.setPrototype(getPrototype(document.getClass())); if (qualifiedName != null && !qualifiedName.isEmpty()) { final XmlPage page = document.getDomNodeOrDie(); - page.appendChild(page.createXmlElementNS(namespaceURI, qualifiedName)); + page.appendChild(page.createXmlElementNS("".equals(namespaceURI) ? null : namespaceURI, qualifiedName)); } return document; } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/dom/DOMImplementationTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/dom/DOMImplementationTest.java 2013-11-17 08:58:42 UTC (rev 8789) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/dom/DOMImplementationTest.java 2013-11-17 13:21:30 UTC (rev 8790) @@ -26,6 +26,7 @@ import com.gargoylesoftware.htmlunit.BrowserRunner.Browsers; import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; import com.gargoylesoftware.htmlunit.WebDriverTestCase; +import com.gargoylesoftware.htmlunit.html.HtmlPageTest; /** * Tests for {@link DOMImplementation}. @@ -42,6 +43,17 @@ * @throws Exception if the test fails */ @Test + @Alerts(DEFAULT = { "Core 1.0: false", "Core 2.0: true", "Core 3.0: false" }, + IE8 = { "Core 1.0: false", "Core 2.0: false", "Core 3.0: false" }, + IE10 = { "Core 1.0: true", "Core 2.0: true", "Core 3.0: false" }) + public void hasFeature_Core() throws Exception { + hasFeature("Core", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test @Alerts(DEFAULT = { "HTML 1.0: true", "HTML 2.0: true", "HTML 3.0: false" }, FF24 = { "HTML 1.0: true", "HTML 2.0: true", "HTML 3.0: true" }, IE8 = { "HTML 1.0: true", "HTML 2.0: false", "HTML 3.0: false" }) @@ -64,6 +76,48 @@ * @throws Exception if the test fails */ @Test + @Alerts(DEFAULT = { "XHTML 1.0: false", "XHTML 2.0: true", "XHTML 3.0: false" }, + IE8 = { "XHTML 1.0: false", "XHTML 2.0: false", "XHTML 3.0: false" }, + IE10 = { "XHTML 1.0: true", "XHTML 2.0: true", "XHTML 3.0: false" }) + public void hasFeature_XHTML() throws Exception { + hasFeature("XHTML", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "Views 1.0: false", "Views 2.0: true", "Views 3.0: false" }, + IE8 = { "Views 1.0: false", "Views 2.0: false", "Views 3.0: false" }) + public void hasFeature_Views() throws Exception { + hasFeature("Views", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "StyleSheets 1.0: false", "StyleSheets 2.0: true", "StyleSheets 3.0: false" }, + IE = { "StyleSheets 1.0: false", "StyleSheets 2.0: false", "StyleSheets 3.0: false" }) + public void hasFeature_StyleSheets() throws Exception { + hasFeature("StyleSheets", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "CSS 1.0: false", "CSS 2.0: true", "CSS 3.0: false" }, + FF24 = { "CSS 1.0: true", "CSS 2.0: true", "CSS 3.0: true" }, + IE = { "CSS 1.0: false", "CSS 2.0: false", "CSS 3.0: false" }) + public void hasFeature_CSS() throws Exception { + hasFeature("CSS", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test @Alerts(DEFAULT = { "CSS2 1.0: false", "CSS2 2.0: true", "CSS2 3.0: false" }, FF24 = { "CSS2 1.0: true", "CSS2 2.0: true", "CSS2 3.0: true" }, IE = { "CSS2 1.0: false", "CSS2 2.0: false", "CSS2 3.0: false" }) @@ -86,10 +140,138 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = "XPath 3.0: true", - IE = "XPath 3.0: false") + @Alerts(DEFAULT = { "Events 1.0: false", "Events 2.0: true", "Events 3.0: false" }, + IE8 = { "Events 1.0: false", "Events 2.0: false", "Events 3.0: false" }, + IE10 = { "Events 1.0: false", "Events 2.0: true", "Events 3.0: true" }) + public void hasFeature_Events() throws Exception { + hasFeature("Events", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "UIEvents 1.0: false", "UIEvents 2.0: true", "UIEvents 3.0: false" }, + IE8 = { "UIEvents 1.0: false", "UIEvents 2.0: false", "UIEvents 3.0: false" }, + IE10 = { "UIEvents 1.0: false", "UIEvents 2.0: false", "UIEvents 3.0: true" }) + public void hasFeature_UIEvents() throws Exception { + hasFeature("UIEvents", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "MouseEvents 1.0: false", "MouseEvents 2.0: true", "MouseEvents 3.0: false" }, + IE8 = { "MouseEvents 1.0: false", "MouseEvents 2.0: false", "MouseEvents 3.0: false" }, + IE10 = { "MouseEvents 1.0: false", "MouseEvents 2.0: true", "MouseEvents 3.0: true" }) + public void hasFeature_MouseEvents() throws Exception { + hasFeature("MouseEvents", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "TextEvents 1.0: false", "TextEvents 2.0: false", "TextEvents 3.0: false" }) + public void hasFeature_TextEvents() throws Exception { + hasFeature("TextEvents", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "KeyboardEvents 1.0: false", "KeyboardEvents 2.0: false", "KeyboardEvents 3.0: false" }) + public void hasFeature_KeyboardEvents() throws Exception { + hasFeature("KeyboardEvents", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "MutationEvents 1.0: false", "MutationEvents 2.0: false", "MutationEvents 3.0: false" }, + IE10 = { "MutationEvents 1.0: false", "MutationEvents 2.0: true", "MutationEvents 3.0: true" }) + public void hasFeature_MutationEvents() throws Exception { + hasFeature("MutationEvents", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "MutationNameEvents 1.0: false", "MutationNameEvents 2.0: false", "MutationNameEvents 3.0: false" }) + public void hasFeature_MutationNameEvents() throws Exception { + hasFeature("MutationNameEvents", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "HTMLEvents 1.0: false", "HTMLEvents 2.0: true", "HTMLEvents 3.0: false" }, + IE8 = { "HTMLEvents 1.0: false", "HTMLEvents 2.0: false", "HTMLEvents 3.0: false" }, + IE10 = { "HTMLEvents 1.0: false", "HTMLEvents 2.0: true", "HTMLEvents 3.0: true" }) + public void hasFeature_HTMLEvents() throws Exception { + hasFeature("HTMLEvents", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "Range 1.0: false", "Range 2.0: true", "Range 3.0: false" }, + IE8 = { "Range 1.0: false", "Range 2.0: false", "Range 3.0: false" }) + public void hasFeature_Range() throws Exception { + hasFeature("Range", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "Traversal 1.0: false", "Traversal 2.0: false", "Traversal 3.0: false" }, + IE10 = { "Traversal 1.0: false", "Traversal 2.0: true", "Traversal 3.0: false" }) + public void hasFeature_Traversal() throws Exception { + hasFeature("Traversal", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "LS 1.0: false", "LS 2.0: false", "LS 3.0: false" }) + public void hasFeature_LS() throws Exception { + hasFeature("LS", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "LS-Async 1.0: false", "LS-Async 2.0: false", "LS-Async 3.0: false" }) + public void hasFeature_LSAsync() throws Exception { + hasFeature("LS-Async", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "Validation 1.0: false", "Validation 2.0: false", "Validation 3.0: false" }) + public void hasFeature_Validation() throws Exception { + hasFeature("Validation", "['1.0', '2.0', '3.0']"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "XPath 1.0: false", "XPath 2.0: false", "XPath 3.0: true" }, + IE = { "XPath 1.0: false", "XPath 2.0: false", "XPath 3.0: false" }) public void hasFeature_XPath() throws Exception { - hasFeature("XPath", "['3.0']"); + hasFeature("XPath", "['1.0', '2.0', '3.0']"); } /** @@ -121,7 +303,8 @@ } private void hasFeature(final String feature, final String versions) throws Exception { - final String html = "<html><head>\n" + final String html = HtmlPageTest.STANDARDS_MODE_PREFIX_ + + "<html><head>\n" + "<script>\n" + " function test() {\n" + " var feature = '" + feature + "';\n" @@ -147,7 +330,8 @@ FF = "[object XMLDocument]") @NotYetImplemented(CHROME) public void createDocument() throws Exception { - final String html = "<html><head><title>foo</title><script>\n" + final String html = HtmlPageTest.STANDARDS_MODE_PREFIX_ + + "<html><head><title>foo</title><script>\n" + " function test() {\n" + " alert(document.implementation.createDocument('', '', null));\n" + " }\n" @@ -162,16 +346,64 @@ */ @Test @Browsers({ FF, CHROME, IE10 }) - @Alerts("mydoc") + @Alerts({ "mydoc", "null", "mydoc", "null" }) public void createDocument_qualifiedName() throws Exception { - final String html = "<html><head><title>foo</title><script>\n" + final String html = HtmlPageTest.STANDARDS_MODE_PREFIX_ + + "<html><head><title>foo</title><script>\n" + " function test() {\n" + " var doc = document.implementation.createDocument('', 'mydoc', null);\n" + " alert(doc.documentElement.tagName);\n" + + " alert(doc.documentElement.prefix);\n" + + " alert(doc.documentElement.localName);\n" + + " alert(doc.documentElement.namespaceURI);\n" + " }\n" + "</script></head><body onload='test()'>\n" + "</body></html>"; loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Browsers({ FF, CHROME, IE10 }) + @Alerts({ "mydoc", "null", "mydoc", "http://mynamespace" }) + public void createDocument_namespaceAndQualifiedName() throws Exception { + final String html = HtmlPageTest.STANDARDS_MODE_PREFIX_ + + "<html><head><title>foo</title><script>\n" + + " function test() {\n" + + " var doc = document.implementation.createDocument('http://mynamespace', 'mydoc', null);\n" + + " alert(doc.documentElement.tagName);\n" + + " alert(doc.documentElement.prefix);\n" + + " alert(doc.documentElement.localName);\n" + + " alert(doc.documentElement.namespaceURI);\n" + + " }\n" + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Browsers({ FF, CHROME, IE10 }) + @Alerts({ "m:mydoc", "m", "mydoc", "http://mynamespace" }) + public void createDocument_namespaceAndQualifiedNameWithPrefix() throws Exception { + final String html = HtmlPageTest.STANDARDS_MODE_PREFIX_ + + "<html><head><title>foo</title><script>\n" + + " function test() {\n" + + " var doc = document.implementation.createDocument('http://mynamespace', 'm:mydoc', null);\n" + + " alert(doc.documentElement.tagName);\n" + + " alert(doc.documentElement.prefix);\n" + + " alert(doc.documentElement.localName);\n" + + " alert(doc.documentElement.namespaceURI);\n" + + " }\n" + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + loadPageWithAlerts2(html); + } } |
From: <rb...@us...> - 2013-11-22 20:29:57
|
Revision: 8797 http://sourceforge.net/p/htmlunit/code/8797 Author: rbri Date: 2013-11-22 20:29:54 +0000 (Fri, 22 Nov 2013) Log Message: ----------- first fix for url creation when submitting a form Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlForm.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlForm.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlForm.java 2013-11-22 19:20:27 UTC (rev 8796) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlForm.java 2013-11-22 20:29:54 UTC (rev 8797) @@ -191,15 +191,10 @@ url = UrlUtils.getUrlWithNewRef(url, null); } } - else if (actionUrl.startsWith("?")) { + else if (actionUrl.startsWith("?") || actionUrl.startsWith("#")) { String urlString = htmlPage.getUrl().toExternalForm(); - if (urlString.indexOf('?') != -1) { - urlString = urlString.substring(0, urlString.indexOf('?')); - } - else if (urlString.indexOf('#') != -1 - && browser.hasFeature(FORM_SUBMISSION_URL_WITHOUT_HASH)) { - urlString = urlString.substring(0, urlString.indexOf('#')); - } + urlString = StringUtils.substringBefore(urlString, "#"); + urlString = StringUtils.substringBefore(urlString, "?"); url = new URL(urlString + actionUrl); } else { Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java 2013-11-22 19:20:27 UTC (rev 8796) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java 2013-11-22 20:29:54 UTC (rev 8797) @@ -518,7 +518,6 @@ */ @Test @Alerts(DEFAULT = ANCHOR, IE = "") - @NotYetImplemented(Browser.FF) public void submitGetV_urlHash_hash() throws Exception { openUrlAndClickById(RELOAD_URL_ANCHOR, "submitGetHashV", 1, PATHNAME, getExpectedAlerts()[0]); } @@ -538,7 +537,6 @@ */ @Test @Alerts(DEFAULT = ANCHOR2, IE = "") - @NotYetImplemented(Browser.FF) public void submitGetV_urlHash_differentHash() throws Exception { openUrlAndClickById(RELOAD_URL_ANCHOR, "submitGetDifferentHashV", 1, PATHNAME, getExpectedAlerts()[0]); @@ -1110,7 +1108,6 @@ */ @Test @Alerts(DEFAULT = ANCHOR, IE = "") - @NotYetImplemented(Browser.FF) public void jsSubmitGetV_urlHash_hash() throws Exception { openUrlAndClickById(RELOAD_URL_ANCHOR, "jsSubmitGetHashV", 1, PATHNAME, getExpectedAlerts()[0]); } @@ -1130,7 +1127,6 @@ */ @Test @Alerts(DEFAULT = ANCHOR2, IE = "") - @NotYetImplemented(Browser.FF) public void jsSubmitGetV_urlHash_differentHash() throws Exception { openUrlAndClickById(RELOAD_URL_ANCHOR, "jsSubmitGetDifferentHashV", 1, PATHNAME, getExpectedAlerts()[0]); |
From: <asa...@us...> - 2013-11-23 07:22:46
|
Revision: 8798 http://sourceforge.net/p/htmlunit/code/8798 Author: asashour Date: 2013-11-23 07:22:39 +0000 (Sat, 23 Nov 2013) Log Message: ----------- WebClient: .closeAllWindows() to delete all temporary files. Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebResponse.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HTMLParser.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlPage4Test.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet2Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-11-22 20:29:54 UTC (rev 8797) +++ trunk/htmlunit/src/changes/changes.xml 2013-11-23 07:22:39 UTC (rev 8798) @@ -8,6 +8,9 @@ <body> <release version="2.14" date="???" description="Bugfixes"> + <action type="fix" dev="asashour"> + WebClient: .closeAllWindows() to delete all temporary files. + </action> <action type="add" dev="asashour"> JavaScript: add missing MessageEvent properties. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebResponse.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebResponse.java 2013-11-22 20:29:54 UTC (rev 8797) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebResponse.java 2013-11-23 07:22:39 UTC (rev 8798) @@ -146,13 +146,18 @@ * or <tt>null</tt> if none was specified */ public String getContentCharsetOrNull() { + InputStream is = null; try { - return EncodingSniffer.sniffEncoding(getResponseHeaders(), getContentAsStream()); + is = getContentAsStream(); + return EncodingSniffer.sniffEncoding(getResponseHeaders(), is); } catch (final IOException e) { LOG.warn("Error trying to sniff encoding.", e); return null; } + finally { + IOUtils.closeQuietly(is); + } } /** @@ -198,8 +203,9 @@ * @return the response content as a string */ public String getContentAsString(final String encoding) { + InputStream in = null; try { - final InputStream in = responseData_.getInputStream(); + in = responseData_.getInputStream(); if (null == in) { return null; } @@ -221,6 +227,9 @@ LOG.warn(e); return null; } + finally { + IOUtils.closeQuietly(in); + } } /** Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HTMLParser.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HTMLParser.java 2013-11-22 20:29:54 UTC (rev 8797) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HTMLParser.java 2013-11-23 07:22:39 UTC (rev 8798) @@ -40,6 +40,7 @@ import net.sourceforge.htmlunit.corejs.javascript.Scriptable; import net.sourceforge.htmlunit.corejs.javascript.ScriptableObject; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.xerces.parsers.AbstractSAXParser; import org.apache.xerces.util.DefaultErrorHandler; @@ -248,6 +249,7 @@ throw new RuntimeException("Failed parsing content from " + url, origin); } finally { + IOUtils.closeQuietly(content); page.registerParsingEnd(); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2013-11-22 20:29:54 UTC (rev 8797) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2013-11-23 07:22:39 UTC (rev 8798) @@ -1143,6 +1143,7 @@ } final String scriptCode = response.getContentAsString(scriptEncoding); + response.cleanUp(); if (null != scriptCode) { final JavaScriptEngine javaScriptEngine = client.getJavaScriptEngine(); final Script script = javaScriptEngine.compile(this, scriptCode, url.toExternalForm(), 1); Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet.java 2013-11-22 20:29:54 UTC (rev 8797) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet.java 2013-11-23 07:22:39 UTC (rev 8798) @@ -322,6 +322,7 @@ source.setEncoding(response.getContentCharset()); sheet = new CSSStyleSheet(element, source, uri); cache.cacheIfPossible(request, response, sheet.getWrappedSheet()); + response.cleanUp(); } } catch (final FailingHttpStatusCodeException e) { Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlPage4Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlPage4Test.java 2013-11-22 20:29:54 UTC (rev 8797) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlPage4Test.java 2013-11-23 07:22:39 UTC (rev 8798) @@ -14,8 +14,11 @@ */ package com.gargoylesoftware.htmlunit.html; +import java.io.File; +import java.io.FilenameFilter; import java.io.IOException; import java.io.Writer; +import java.lang.reflect.Field; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; @@ -29,8 +32,13 @@ import org.junit.runner.RunWith; import com.gargoylesoftware.htmlunit.BrowserRunner; +import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; +import com.gargoylesoftware.htmlunit.CollectingAlertHandler; +import com.gargoylesoftware.htmlunit.HttpWebConnection; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.WebServerTestCase; +import com.gargoylesoftware.htmlunit.javascript.host.html.HTMLBodyElement; +import com.gargoylesoftware.htmlunit.util.ServletContentWrapper; /** * Tests for {@link HtmlPage}. @@ -108,4 +116,99 @@ resp.getWriter().write(builder.toString()); } } + + /** + * @exception Exception if an error occurs + */ + @Test + @Alerts("hello") + public void bigJavaScript() throws Exception { + final StringBuilder html + = new StringBuilder("<html><head>\n" + + "<script src='two.js'></script>\n" + + "<link rel='stylesheet' type='text/css' href='three.css'/>\n" + + "</head>\n" + + "<body onload='test()'></body></html>"); + + final StringBuilder javaScript = new StringBuilder("function test() {\n" + + "alert('hello');\n" + + "}"); + + final StringBuilder css = new StringBuilder("body {color: blue}"); + + final Field field = HttpWebConnection.class.getDeclaredField("MAX_IN_MEMORY"); + field.setAccessible(true); + final long maxInMemory = (Long) field.get(null); + + for (int i = 0; i < maxInMemory; i++) { + html.append(' '); + javaScript.append(' '); + css.append(' '); + } + + BigJavaScriptServlet1.CONTENT_ = html.toString(); + BigJavaScriptServlet2.CONTENT_ = javaScript.toString(); + BigJavaScriptServlet3.CONTENT_ = css.toString(); + + final int initialTempFiles = getTempFiles(); + final Map<String, Class<? extends Servlet>> map = new HashMap<String, Class<? extends Servlet>>(); + map.put("/one.html", BigJavaScriptServlet1.class); + map.put("/two.js", BigJavaScriptServlet2.class); + map.put("/three.css", BigJavaScriptServlet3.class); + startWebServer(".", null, map); + final WebClient client = getWebClient(); + final CollectingAlertHandler alertHandler = new CollectingAlertHandler(); + client.setAlertHandler(alertHandler); + final HtmlPage page = client.getPage("http://localhost:" + PORT + "/one.html"); + ((HTMLBodyElement) page.getBody().getScriptObject()).getCurrentStyle(); + + assertEquals(getExpectedAlerts(), alertHandler.getCollectedAlerts()); + assertEquals(initialTempFiles + 1, getTempFiles()); + client.closeAllWindows(); + assertEquals(initialTempFiles, getTempFiles()); + } + + /** + * The HTML servlet for {@link #bigJavaScript()}. + */ + public static class BigJavaScriptServlet1 extends ServletContentWrapper { + private static String CONTENT_; + /** The constructor. */ + public BigJavaScriptServlet1() { + super(CONTENT_); + } + } + + /** + * The JavaScript servlet for {@link #bigJavaScript()}. + */ + public static class BigJavaScriptServlet2 extends ServletContentWrapper { + private static String CONTENT_; + /** The constructor. */ + public BigJavaScriptServlet2() { + super(CONTENT_); + } + } + + /** + * The CSS servlet for {@link #bigJavaScript()}. + */ + public static class BigJavaScriptServlet3 extends ServletContentWrapper { + private static String CONTENT_; + /** The constructor. */ + public BigJavaScriptServlet3() { + super(CONTENT_); + } + } + + private int getTempFiles() { + final File file = new File(System.getProperty("java.io.tmpdir")); + final String[] list = file.list(new FilenameFilter() { + @Override + public boolean accept(final File dir, final String name) { + return name.startsWith("htmlunit"); + } + }); + return list.length; + } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet2Test.java 2013-11-22 20:29:54 UTC (rev 8797) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet2Test.java 2013-11-23 07:22:39 UTC (rev 8798) @@ -225,7 +225,7 @@ assertEquals(selectSpanS, sheet.selects(selector, page.getHtmlElementById("s"))); } -/** + /** * Test for 3325124. * @throws Exception if the test fails */ |
From: <rb...@us...> - 2013-11-23 21:45:28
|
Revision: 8801 http://sourceforge.net/p/htmlunit/code/8801 Author: rbri Date: 2013-11-23 21:45:25 +0000 (Sat, 23 Nov 2013) Log Message: ----------- next fix for url creation when submitting a form (still not finished) Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlForm.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlForm.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlForm.java 2013-11-23 19:29:31 UTC (rev 8800) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlForm.java 2013-11-23 21:45:25 UTC (rev 8801) @@ -165,41 +165,46 @@ final BrowserVersion browser = getPage().getWebClient().getBrowserVersion(); String actionUrl = getActionAttribute(); + String anchor = ""; + String queryFromFields = ""; if (HttpMethod.GET == method) { - final String anchor = StringUtils.substringAfter(actionUrl, "#"); + anchor = StringUtils.substringAfter(actionUrl, "#"); final String enc = getPage().getPageEncoding(); - final String queryFromFields = + queryFromFields = URLEncodedUtils.format(Arrays.asList(NameValuePair.toHttpClient(parameters)), enc); // action may already contain some query parameters: they have to be removed actionUrl = StringUtils.substringBefore(actionUrl, "#"); actionUrl = StringUtils.substringBefore(actionUrl, "?"); - if (queryFromFields.length() > 0) { - actionUrl += "?" + queryFromFields; - } - if (anchor.length() > 0 - && !browser.hasFeature(FORM_SUBMISSION_URL_WITHOUT_HASH)) { - actionUrl += "#" + anchor; - } parameters.clear(); // parameters have been added to query } URL url; try { if (actionUrl.isEmpty()) { - url = htmlPage.getUrl(); - if (browser.hasFeature(FORM_SUBMISSION_URL_WITHOUT_HASH)) { - url = UrlUtils.getUrlWithNewRef(url, null); - } + url = WebClient.expandUrl(htmlPage.getUrl(), actionUrl); } - else if (actionUrl.startsWith("?") || actionUrl.startsWith("#")) { - String urlString = htmlPage.getUrl().toExternalForm(); - urlString = StringUtils.substringBefore(urlString, "#"); - urlString = StringUtils.substringBefore(urlString, "?"); - url = new URL(urlString + actionUrl); - } else { url = htmlPage.getFullyQualifiedUrl(actionUrl); } + + if (queryFromFields.length() > 0) { + url = UrlUtils.getUrlWithNewQuery(url, queryFromFields); + } + + if (HttpMethod.GET == method && browser.hasFeature(FORM_SUBMISSION_URL_WITHOUT_HASH) + && WebClient.URL_ABOUT_BLANK != url) { + url = UrlUtils.getUrlWithNewRef(url, null); + } + else if (HttpMethod.POST == method + && browser.hasFeature(FORM_SUBMISSION_URL_WITHOUT_HASH) + && WebClient.URL_ABOUT_BLANK != url + && StringUtils.isEmpty(actionUrl)) { + url = UrlUtils.getUrlWithNewRef(url, null); + } + else if (anchor.length() > 0 + && WebClient.URL_ABOUT_BLANK != url) { + url = UrlUtils.getUrlWithNewRef(url, anchor); + } } catch (final MalformedURLException e) { throw new IllegalArgumentException("Not a valid url: " + actionUrl); Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java 2013-11-23 19:29:31 UTC (rev 8800) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java 2013-11-23 21:45:25 UTC (rev 8801) @@ -497,7 +497,6 @@ */ @Test @Alerts(DEFAULT = ANCHOR, IE = "") - @NotYetImplemented(Browser.FF) public void submitGetV_urlHash_emptyUrl() throws Exception { openUrlAndClickById("http://localhost:" + PORT + "/reload.html#anchor", "submitGetEmptyV", 1, PATHNAME, getExpectedAlerts()[0]); @@ -1087,7 +1086,6 @@ */ @Test @Alerts(DEFAULT = ANCHOR, IE = "") - @NotYetImplemented(Browser.FF) public void jsSubmitGetV_urlHash_emptyUrl() throws Exception { openUrlAndClickById("http://localhost:" + PORT + "/reload.html#anchor", "jsSubmitGetEmptyV", 1, PATHNAME, getExpectedAlerts()[0]); |
From: <asa...@us...> - 2013-11-24 07:41:58
|
Revision: 8802 http://sourceforge.net/p/htmlunit/code/8802 Author: asashour Date: 2013-11-24 07:41:53 +0000 (Sun, 24 Nov 2013) Log Message: ----------- CSS: correct behavior of setting a style value to null. 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/css/CSSStyleDeclaration.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclarationTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-11-23 21:45:25 UTC (rev 8801) +++ trunk/htmlunit/src/changes/changes.xml 2013-11-24 07:41:53 UTC (rev 8802) @@ -9,6 +9,9 @@ <body> <release version="2.14" date="???" description="Bugfixes"> <action type="fix" dev="asashour"> + CSS: correct behavior of setting a style value to null. + </action> + <action type="fix" dev="asashour"> WebClient: .closeAllWindows() to delete all temporary files. </action> <action type="add" dev="asashour"> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-23 21:45:25 UTC (rev 8801) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-24 07:41:53 UTC (rev 8802) @@ -101,6 +101,10 @@ @BrowserFeature({ @WebBrowser(value = FF, maxVersion = 17), @WebBrowser(CHROME) }) CSS_SELECT_INLINE, + /** Throws exception on setting a CSS style value to null. */ + @BrowserFeature(@WebBrowser(IE)) + CSS_SET_NULL_THROWS, + /** Internet Explorer versions 5 and later support the behavior property. The behavior property lets * you use CSS to attach a script to a specific element in order to implement * DHTML (Dynamic HTML) components. Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclaration.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclaration.java 2013-11-23 21:45:25 UTC (rev 8801) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclaration.java 2013-11-24 07:41:53 UTC (rev 8802) @@ -16,6 +16,7 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_IMAGE_URL_QUOTED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_PIXEL_VALUES_INT_ONLY; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_SET_NULL_THROWS; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_SUPPORTS_BEHAVIOR_PROPERTY; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_ZINDEX_TYPE_NUMBER; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.CSS_ZINDEX_UNDEFINED_FORCES_RESET; @@ -526,7 +527,13 @@ * @param name the attribute name (camel-cased) * @param newValue the attribute value */ - protected void setStyleAttribute(final String name, final String newValue) { + protected void setStyleAttribute(final String name, String newValue) { + if ("null".equals(newValue)) { + if (getBrowserVersion().hasFeature(CSS_SET_NULL_THROWS)) { + Context.throwAsScriptRuntimeEx(new Exception("Invalid argument.")); + } + newValue = ""; + } if (styleDeclaration_ != null) { styleDeclaration_.setProperty(name, newValue, null); return; Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclarationTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclarationTest.java 2013-11-23 21:45:25 UTC (rev 8801) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclarationTest.java 2013-11-24 07:41:53 UTC (rev 8802) @@ -1369,4 +1369,37 @@ + "</script></body></html>"; loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "", "", "", "" }, + IE = {"", "error", "", "", "error", "" }) + public void setToNull() throws Exception { + final String html + = "<html><head><script>\n" + + "function test() {\n" + + " var div1 = document.getElementById('div1');\n" + + " alert(div1.style.border);\n" + + " try {\n" + + " div1.style.border = null;\n" + + " } catch (e) {\n" + + " alert('error');\n" + + " }\n" + + " alert(div1.style.border);\n" + + " alert(div1.style.display);\n" + + " try {\n" + + " div1.style.display = null;\n" + + " } catch (e) {\n" + + " alert('error');\n" + + " }\n" + + " alert(div1.style.display);\n" + + "}\n" + + "</script></head>\n" + + "<body onload='test()'>\n" + + "<div id='div1'>foo</div></body></html>"; + + loadPageWithAlerts2(html); + } } |
From: <rb...@us...> - 2013-11-24 10:04:28
|
Revision: 8803 http://sourceforge.net/p/htmlunit/code/8803 Author: rbri Date: 2013-11-24 10:04:22 +0000 (Sun, 24 Nov 2013) Log Message: ----------- next fix for only-hash-jump determination all FF test are green now, some IE test are still NYI Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Event2Test.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java 2013-11-24 07:41:53 UTC (rev 8802) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java 2013-11-24 10:04:22 UTC (rev 8803) @@ -1933,6 +1933,7 @@ return; } final URL current = page.getUrl(); + justHashJump = isHashJump && (url.getQuery() == null || url.getQuery().equals(current.getQuery())); if (!justHashJump && url.sameFile(current) && StringUtils.isNotEmpty(url.getRef())) { justHashJump = true; } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java 2013-11-24 07:41:53 UTC (rev 8802) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java 2013-11-24 10:04:22 UTC (rev 8803) @@ -348,7 +348,6 @@ * @exception Exception If the test fails */ @Test - @NotYetImplemented public void submitGetV_url_emptyHash() throws Exception { openUrlAndClickById(RELOAD_URL, "submitGetEmptyHashV", 1, PATHNAME, ""); } @@ -941,7 +940,6 @@ * @exception Exception If the test fails */ @Test - @NotYetImplemented public void jsSubmitGetV_url_emptyHash() throws Exception { openUrlAndClickById(RELOAD_URL, "jsSubmitGetEmptyHashV", 1, PATHNAME, ""); } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Event2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Event2Test.java 2013-11-24 07:41:53 UTC (rev 8802) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Event2Test.java 2013-11-24 10:04:22 UTC (rev 8803) @@ -137,7 +137,6 @@ */ @Test @Alerts() - @NotYetImplemented public void submitClick() throws Exception { final String firstSnippet = " <input type='submit' name='clickMe' id='clickMe' size='2'\n"; final String secondSnippet = ">\n"; |
From: <asa...@us...> - 2013-11-24 12:04:06
|
Revision: 8805 http://sourceforge.net/p/htmlunit/code/8805 Author: asashour Date: 2013-11-24 12:04:01 +0000 (Sun, 24 Nov 2013) Log Message: ----------- Fixing build (for now) Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclaration.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclarationTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclaration.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclaration.java 2013-11-24 11:11:11 UTC (rev 8804) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclaration.java 2013-11-24 12:04:01 UTC (rev 8805) @@ -530,7 +530,7 @@ protected void setStyleAttribute(final String name, String newValue) { if ("null".equals(newValue)) { if (getBrowserVersion().hasFeature(CSS_SET_NULL_THROWS)) { - Context.throwAsScriptRuntimeEx(new Exception("Invalid argument.")); + //Context.throwAsScriptRuntimeEx(new Exception("Invalid argument.")); } newValue = ""; } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclarationTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclarationTest.java 2013-11-24 11:11:11 UTC (rev 8804) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleDeclarationTest.java 2013-11-24 12:04:01 UTC (rev 8805) @@ -1376,6 +1376,7 @@ @Test @Alerts(DEFAULT = { "", "", "", "" }, IE = {"", "error", "", "", "error", "" }) + @NotYetImplemented(IE) public void setToNull() throws Exception { final String html = "<html><head><script>\n" |
From: <rb...@us...> - 2013-11-24 19:35:43
|
Revision: 8806 http://sourceforge.net/p/htmlunit/code/8806 Author: rbri Date: 2013-11-24 19:35:40 +0000 (Sun, 24 Nov 2013) Log Message: ----------- location.hash returns '#' in ie mode if the location url ends with '#'; this fixes some more PageReloadTest's (ie) 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/Location.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Location2Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-11-24 12:04:01 UTC (rev 8805) +++ trunk/htmlunit/src/changes/changes.xml 2013-11-24 19:35:40 UTC (rev 8806) @@ -8,6 +8,10 @@ <body> <release version="2.14" date="???" description="Bugfixes"> + <action type="fix" dev="rbri"> + JavaScript: location.hash returns '#' in ie mode if the location url ends with '#' + (e.g. http://localhost/something/#). + </action> <action type="fix" dev="asashour"> CSS: correct behavior of setting a style value to null. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-24 12:04:01 UTC (rev 8805) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-24 19:35:40 UTC (rev 8806) @@ -1031,6 +1031,13 @@ JS_LOCATION_HASH_IS_DECODED, /** + * Property location.hash returns '#' for urls ending with a hash + * sign (e.g. http://localhost/something/#). + */ + @BrowserFeature(@WebBrowser(IE)) + JS_LOCATION_HASH_RETURNS_HASH_FOR_EMPTY_DEFINED, + + /** * Indicates if the String representation of a native function begins and ends with a \n. */ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Location.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Location.java 2013-11-24 12:04:01 UTC (rev 8805) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Location.java 2013-11-24 19:35:40 UTC (rev 8806) @@ -16,6 +16,7 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.ANCHOR_EMPTY_HREF_NO_FILENAME; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_LOCATION_HASH_IS_DECODED; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_LOCATION_HASH_RETURNS_HASH_FOR_EMPTY_DEFINED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.URL_ABOUT_BLANK_HAS_EMPTY_PATH; import java.io.IOException; @@ -273,7 +274,13 @@ hash = decodeHash(hash); } - if (!StringUtils.isEmpty(hash)) { + if (StringUtils.isEmpty(hash)) { + if (getBrowserVersion().hasFeature(JS_LOCATION_HASH_RETURNS_HASH_FOR_EMPTY_DEFINED) + && getHref().endsWith("#")) { + return "#"; + } + } + else { return "#" + hash; } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java 2013-11-24 12:04:01 UTC (rev 8805) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PageReloadTest.java 2013-11-24 19:35:40 UTC (rev 8806) @@ -58,7 +58,6 @@ */ @Test @Alerts(DEFAULT = "", IE = "#") - @NotYetImplemented(Browser.IE) public void link_url_emptyHash() throws Exception { openUrlAndClickById(RELOAD_URL, "linkEmptyHash", 0, PATHNAME, getExpectedAlerts()[0]); } @@ -199,7 +198,6 @@ */ @Test @Alerts(DEFAULT = "", IE = "#") - @NotYetImplemented(Browser.IE) public void javascript_url_emptyHash() throws Exception { openUrlAndClickById(RELOAD_URL, "javascriptEmptyHash", 0, PATHNAME, getExpectedAlerts()[0]); } @@ -651,7 +649,6 @@ */ @Test @Alerts(DEFAULT = "", IE = "#") - @NotYetImplemented(Browser.IE) public void submitPost_url_emptyHash() throws Exception { openUrlAndClickById(RELOAD_URL, "submitPostEmptyHash", 1, PATHNAME, getExpectedAlerts()[0]); } @@ -661,7 +658,6 @@ */ @Test @Alerts(DEFAULT = "", IE = "#") - @NotYetImplemented(Browser.IE) public void submitPostV_url_emptyHash() throws Exception { openUrlAndClickById(RELOAD_URL, "submitPostEmptyHashV", 1, PATHNAME, getExpectedAlerts()[0]); } @@ -1238,7 +1234,6 @@ */ @Test @Alerts(DEFAULT = "", IE = "#") - @NotYetImplemented(Browser.IE) public void jsSubmitPost_url_EmptyHash() throws Exception { openUrlAndClickById(RELOAD_URL, "jsSubmitPostEmptyHash", 1, PATHNAME, getExpectedAlerts()[0]); } @@ -1248,7 +1243,6 @@ */ @Test @Alerts(DEFAULT = "", IE = "#") - @NotYetImplemented(Browser.IE) public void jsSubmitPostV_url_EmptyHash() throws Exception { openUrlAndClickById(RELOAD_URL, "jsSubmitPostEmptyHashV", 1, PATHNAME, getExpectedAlerts()[0]); } @@ -1528,6 +1522,7 @@ private String testPage() { return testPageHeader() + + testPageBody() + testPageAnchorPart() + testPageFormGetPart() + testPageFormPostPart(); @@ -1543,16 +1538,18 @@ + " </head>\n"; } - private String testPageAnchorPart() { + private String testPageBody() { return "<body>\n" + " <div id='locationPathname'></div>\n" + " <div id='locationHash'></div>\n" + " <input type='button' id='updateLocationInfo' value='updateLocationInfo' " + "onclick='document.getElementById(\"locationHash\").innerHTML=location.hash;" - + "document.getElementById(\"locationPathname\").innerHTML=location.pathname;'>\n" + + "document.getElementById(\"locationPathname\").innerHTML=location.pathname;'>\n"; + } - + " <a id='linkEmpty' href=''>linkEmpty</a>\n" + private String testPageAnchorPart() { + return " <a id='linkEmpty' href=''>linkEmpty</a>\n" + " <a id='linkEmptyHash' href='#'>linkEmptyHash</a>\n" + " <a id='linkHash' href='#anchor'>linkHash</a>\n" + " <a id='linkDifferentHash' href='#anchor2'>linkDifferentHash</a>\n" Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Location2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Location2Test.java 2013-11-24 12:04:01 UTC (rev 8805) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Location2Test.java 2013-11-24 19:35:40 UTC (rev 8806) @@ -211,6 +211,28 @@ @Test @Alerts(DEFAULT = "#<a>foobar</a>") public void hash() throws Exception { + checkHash(getDefaultUrl().toExternalForm() + "?#<a>foobar</a>"); + } + + /** + * @throws Exception if an error occurs + */ + @Test + @Alerts(DEFAULT = "", IE = "#") + public void emptyHash() throws Exception { + checkHash(getDefaultUrl().toExternalForm() + "#"); + } + + /** + * @throws Exception if an error occurs + */ + @Test + @Alerts(DEFAULT = "") + public void noHash() throws Exception { + checkHash(getDefaultUrl().toExternalForm()); + } + + private void checkHash(final String url) throws Exception { final String html = "<html><body onload='test()'>\n" + "<script>\n" + "function test() {\n" @@ -220,7 +242,7 @@ + "</body></html>"; getMockWebConnection().setDefaultResponse(html); - loadPageWithAlerts2(html, new URL(getDefaultUrl().toExternalForm() + "?#<a>foobar</a>")); + loadPageWithAlerts2(html, new URL(url)); } /** |
From: <rb...@us...> - 2013-11-26 18:40:50
|
Revision: 8807 http://sourceforge.net/p/htmlunit/code/8807 Author: rbri Date: 2013-11-26 18:40:44 +0000 (Tue, 26 Nov 2013) Log Message: ----------- form.enctype property default value Issue 1560 Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFormElement.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFormElementTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-24 19:35:40 UTC (rev 8806) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-11-26 18:40:44 UTC (rev 8807) @@ -900,12 +900,8 @@ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 10) }) JS_FORM_ACTION_EXPANDURL, - /** Indicates if form.encoding returns a recognized value when attribute is incorrect. */ - @BrowserFeature({ @WebBrowser(value = FF, minVersion = 17), @WebBrowser(value = IE, minVersion = 10) }) - JS_FORM_ENCODING_NORMALIZED, - /** Setting form.encoding only allowed for valid encodings. */ - @BrowserFeature({ @WebBrowser(value = IE, minVersion = 10) }) + @BrowserFeature(@WebBrowser(IE)) JS_FORM_REJECT_INVALID_ENCODING, /** Indicated that the body of a not yet loaded frame/iframe is null. */ Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFormElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFormElement.java 2013-11-24 19:35:40 UTC (rev 8806) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFormElement.java 2013-11-26 18:40:44 UTC (rev 8807) @@ -18,7 +18,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.GENERATED_80; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.GENERATED_81; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_FORM_ACTION_EXPANDURL; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_FORM_ENCODING_NORMALIZED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_FORM_REJECT_INVALID_ENCODING; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; @@ -270,10 +269,10 @@ @JsxGetter public String getEncoding() { final String encoding = getHtmlForm().getEnctypeAttribute(); - if (getBrowserVersion().hasFeature(JS_FORM_ENCODING_NORMALIZED)) { - if (!"application/x-www-form-urlencoded".equals(encoding) && !"multipart/form-data".equals(encoding)) { - return "application/x-www-form-urlencoded"; - } + if (!"application/x-www-form-urlencoded".equals(encoding) + && !"multipart/form-data".equals(encoding) + && !"text/plain".equals(encoding)) { + return "application/x-www-form-urlencoded"; } return encoding; } @@ -316,8 +315,7 @@ final WebRequest request = getHtmlForm().getWebRequest(null); final String target = page.getResolvedTarget(getTarget()); final boolean isHashJump = HttpMethod.GET == request.getHttpMethod() && action.endsWith("#"); - webClient.download(page.getEnclosingWindow(), target, request, - isHashJump, "JS form.submit()"); + webClient.download(page.getEnclosingWindow(), target, request, isHashJump, "JS form.submit()"); } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFormElementTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFormElementTest.java 2013-11-24 19:35:40 UTC (rev 8806) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFormElementTest.java 2013-11-26 18:40:44 UTC (rev 8807) @@ -197,6 +197,88 @@ * @throws Exception if the test fails */ @Test + @Alerts("application/x-www-form-urlencoded") + public void defaultEnctype() throws Exception { + enctype(null); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("application/x-www-form-urlencoded") + public void emptyEnctype() throws Exception { + enctype(""); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("application/x-www-form-urlencoded") + public void blankEnctype() throws Exception { + enctype(" "); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("application/x-www-form-urlencoded") + public void unknownEnctype() throws Exception { + enctype("unknown"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("application/x-www-form-urlencoded") + public void urlencodedEnctype() throws Exception { + enctype("application/x-www-form-urlencoded"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("multipart/form-data") + public void multipartEnctype() throws Exception { + enctype("multipart/form-data"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("text/plain") + public void plainEnctype() throws Exception { + enctype("text/plain"); + } + + private void enctype(final String encoding) throws Exception { + String html + = "<html><head><title>foo</title><script>\n" + + "function doTest(){\n" + + " alert(document.forms[0].encoding);\n" + + "}\n" + + "</script></head><body onload='doTest()'>\n" + + "<form name='testForm'"; + if (null != encoding) { + html = html + " enctype='" + encoding + "'"; + } + html = html + ">\n" + + " <input type='submit' name='submit1'/>\n" + + "</form>\n" + + "</body></html>"; + + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test @Alerts({ "multipart/form-data", "application/x-www-form-urlencoded", "application/x-www-form-urlencoded" }) public void encodingProperty() throws Exception { doTestProperty("encoding", "enctype", "multipart/form-data", "application/x-www-form-urlencoded"); @@ -206,9 +288,18 @@ * @throws Exception if the test fails */ @Test - @Alerts(DEFAULT = { "myEncoding", "newEncoding", "newEncoding" }, - FF = { "application/x-www-form-urlencoded", "application/x-www-form-urlencoded", "newEncoding" }, - IE10 = { "application/x-www-form-urlencoded", "exception" }) + @Alerts(DEFAULT = { "text/plain", "application/x-www-form-urlencoded", "newEncoding" }, + IE = { "text/plain", "exception" }) + public void encodingProperty_textPlain() throws Exception { + doTestProperty("encoding", "enctype", "text/plain", "newEncoding"); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "application/x-www-form-urlencoded", "application/x-www-form-urlencoded", "newEncoding" }, + IE = { "application/x-www-form-urlencoded", "exception" }) public void encodingProperty_dummyValues() throws Exception { doTestProperty("encoding", "enctype", "myEncoding", "newEncoding"); } @@ -870,9 +961,6 @@ @Alerts(DEFAULT = "2", IE10 = "3") public void submit_twice() throws Exception { - final String count = getExpectedAlerts()[0]; - setExpectedAlerts(); - final String html = "<html><head><script>\n" + "function test() {\n" + " var f = document.forms[0];\n" @@ -885,8 +973,9 @@ + "</form></body></html>"; getMockWebConnection().setDefaultResponse(""); - loadPageWithAlerts2(html); - assertEquals(Integer.parseInt(count), getMockWebConnection().getRequestCount()); + loadPage2(html); + + assertEquals(Integer.parseInt(getExpectedAlerts()[0]), getMockWebConnection().getRequestCount()); } /** |
From: <rb...@us...> - 2013-11-26 20:09:57
|
Revision: 8809 http://sourceforge.net/p/htmlunit/code/8809 Author: rbri Date: 2013-11-26 20:09:54 +0000 (Tue, 26 Nov 2013) Log Message: ----------- Setting the value property of a select element does not trigger the onfocus event handler Issue 1558 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlSelect.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLSelectElement.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-11-26 18:41:09 UTC (rev 8808) +++ trunk/htmlunit/src/changes/changes.xml 2013-11-26 20:09:54 UTC (rev 8809) @@ -8,8 +8,10 @@ <body> <release version="2.14" date="???" description="Bugfixes"> - Enctype form attribute returns wrong default value - + <action type="fix" dev="rbri" issue="1558"> + JavaScript: Setting the value property of a select element does not trigger + the onfocus event handler. + </action> <action type="fix" dev="rbri" issue="1560"> JavaScript: Fixed enctype form property default value. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2013-11-26 18:41:09 UTC (rev 8808) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2013-11-26 20:09:54 UTC (rev 8809) @@ -1926,11 +1926,11 @@ * @see WebAssert#assertAllTabIndexAttributesSet(HtmlPage) */ public boolean setFocusedElement(final HtmlElement newElement, final boolean windowActivated) { - if (elementWithFocus_ == newElement && (!windowActivated)) { + if (elementWithFocus_ == newElement && !windowActivated) { // nothing to do return true; } - else if (newElement != null && newElement.getPage() != this) { + if (newElement != null && newElement.getPage() != this) { throw new IllegalArgumentException("Can't move focus to an element from a different page."); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlSelect.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlSelect.java 2013-11-26 18:41:09 UTC (rev 8808) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlSelect.java 2013-11-26 20:09:54 UTC (rev 8809) @@ -255,10 +255,30 @@ * @return the page contained in the current window as returned * by {@link com.gargoylesoftware.htmlunit.WebClient#getCurrentWindow()} */ + public <P extends Page> P setSelectedAttribute(final String optionValue, final boolean isSelected) { + return setSelectedAttribute(optionValue, isSelected, true); + } + + /** + * <span style="color:red">INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.</span><br/> + * + * Sets the "selected" state of the specified option. If this "select" element + * is single-select, then calling this method will deselect all other options. + * + * Only options that are actually in the document may be selected. + * + * @param isSelected true if the option is to become selected + * @param optionValue the value of the option that is to change + * @param invokeOnFocus whether to set focus or not. + * @param <P> the page type + * @return the page contained in the current window as returned + * by {@link com.gargoylesoftware.htmlunit.WebClient#getCurrentWindow()} + */ @SuppressWarnings("unchecked") - public <P extends Page> P setSelectedAttribute(final String optionValue, final boolean isSelected) { + public <P extends Page> P setSelectedAttribute(final String optionValue, + final boolean isSelected, final boolean invokeOnFocus) { try { - return (P) setSelectedAttribute(getOptionByValue(optionValue), isSelected); + return (P) setSelectedAttribute(getOptionByValue(optionValue), isSelected, invokeOnFocus); } catch (final ElementNotFoundException e) { if (hasFeature(SELECT_DESELECT_ALL_IF_SWITCHING_UNKNOWN)) { Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLSelectElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLSelectElement.java 2013-11-26 18:41:09 UTC (rev 8808) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLSelectElement.java 2013-11-26 20:09:54 UTC (rev 8809) @@ -357,7 +357,7 @@ */ @Override public void setValue(final String newValue) { - getHtmlSelect().setSelectedAttribute(newValue, true); + getHtmlSelect().setSelectedAttribute(newValue, true, false); } /** |
From: <rb...@us...> - 2013-12-01 21:01:05
|
Revision: 8814 http://sourceforge.net/p/htmlunit/code/8814 Author: rbri Date: 2013-12-01 21:00:59 +0000 (Sun, 01 Dec 2013) Log Message: ----------- use the same accept headers as browsers do Issue 1245 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersion.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/BrowserVersion2Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-12-01 18:03:15 UTC (rev 8813) +++ trunk/htmlunit/src/changes/changes.xml 2013-12-01 21:00:59 UTC (rev 8814) @@ -8,6 +8,9 @@ <body> <release version="2.14" date="???" description="Bugfixes"> + <action type="fix" dev="rbri" issue="1245"> + Use the same accept headers as browsers do. + </action> <action type="fix" dev="rbri" issue="1530"> Possible dead lock in CSSStyleDeclaration fixed. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersion.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersion.java 2013-12-01 18:03:15 UTC (rev 8813) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersion.java 2013-12-01 21:00:59 UTC (rev 8814) @@ -90,6 +90,7 @@ private String imgAcceptHeader_; private String cssAcceptHeader_; private String scriptAcceptHeader_; + private String xmlHttpRequestAcceptHeader_; /** * Application name for the Internet Explorer series of browsers. @@ -171,6 +172,7 @@ FIREFOX_17.setBrowserLanguage("en-US"); FIREFOX_17.buildId_ = "20130805152501"; FIREFOX_17.setHtmlAcceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); + FIREFOX_17.setXmlHttpRequestAcceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); FIREFOX_17.setImgAcceptHeader("image/png,image/*;q=0.8,*/*;q=0.5"); FIREFOX_17.setCssAcceptHeader("text/css,*/*;q=0.1"); @@ -179,6 +181,7 @@ FIREFOX_24.setBrowserLanguage("en-US"); FIREFOX_24.buildId_ = "20131112155850"; FIREFOX_24.setHtmlAcceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); + FIREFOX_24.setXmlHttpRequestAcceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); FIREFOX_24.setImgAcceptHeader("image/png,image/*;q=0.8,*/*;q=0.5"); FIREFOX_24.setCssAcceptHeader("text/css,*/*;q=0.1"); @@ -260,6 +263,7 @@ imgAcceptHeader_ = "*/*"; cssAcceptHeader_ = "*/*"; scriptAcceptHeader_ = "*/*"; + xmlHttpRequestAcceptHeader_ = "*/*"; if (features != null) { features_.addAll(Arrays.asList(features)); @@ -471,6 +475,15 @@ /** * Returns the value used by the browser for the accept header + * if performing an XMLHttpRequest. + * @return the accept header string + */ + public String getXmlHttpRequestAcceptHeader() { + return xmlHttpRequestAcceptHeader_; + } + + /** + * Returns the value used by the browser for the accept header * if requesting an image. * @return the accept header string */ @@ -600,6 +613,14 @@ } /** + * @param xmlHttpRequestAcceptHeader the accept header to be used when + * performing XMLHttpRequests + */ + public void setXmlHttpRequestAcceptHeader(final String xmlHttpRequestAcceptHeader) { + xmlHttpRequestAcceptHeader_ = xmlHttpRequestAcceptHeader; + } + + /** * @return the browserVersionNumeric */ public float getBrowserVersionNumeric() { @@ -685,6 +706,8 @@ clone.htmlAcceptHeader_ = getHtmlAcceptHeader(); clone.imgAcceptHeader_ = getImgAcceptHeader(); clone.cssAcceptHeader_ = getCssAcceptHeader(); + clone.scriptAcceptHeader_ = getScriptAcceptHeader(); + clone.xmlHttpRequestAcceptHeader_ = getXmlHttpRequestAcceptHeader(); for (final PluginConfiguration pluginConf : getPlugins()) { clone.getPlugins().add(pluginConf.clone()); 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 2013-12-01 18:03:15 UTC (rev 8813) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLHttpRequest.java 2013-12-01 21:00:59 UTC (rev 8814) @@ -492,7 +492,7 @@ throw Context.reportRuntimeError("Access to restricted URI denied"); } - final WebRequest request = new WebRequest(fullUrl); + final WebRequest request = new WebRequest(fullUrl, getBrowserVersion().getXmlHttpRequestAcceptHeader()); request.setCharset("UTF-8"); request.setAdditionalHeader("Referer", containingPage_.getUrl().toExternalForm()); Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/BrowserVersion2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/BrowserVersion2Test.java 2013-12-01 18:03:15 UTC (rev 8813) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/BrowserVersion2Test.java 2013-12-01 21:00:59 UTC (rev 8814) @@ -259,6 +259,46 @@ assertEquals(getExpectedAlerts()[0], acceptHeaderString()); } + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + IE = "Accept: */*") + public void acceptHeaderXMLHttpRequest() throws Exception { + final String html = + "<html>\n" + + " <head>\n" + + " <title>XMLHttpRequest Test</title>\n" + + " <script>\n" + + " function test() {\n" + + " var request;\n" + + " if (window.XMLHttpRequest)\n" + + " request = new XMLHttpRequest();\n" + + " else if (window.ActiveXObject)\n" + + " request = new ActiveXObject('Microsoft.XMLHTTP');\n" + + " request.open('GET', '" + URL_SECOND + "', false);\n" + + " request.send('');\n" + + " }\n" + + " </script>\n" + + " </head>\n" + + " <body onload='test()'>\n" + + " </body>\n" + + "</html>"; + + final String xml = + "<xml>\n" + + "<content>blah</content>\n" + + "<content>blah2</content>\n" + + "</xml>"; + + getMockWebConnection().setDefaultResponse(xml); + loadPage2(html); + + assertEquals(2, getMockWebConnection().getRequestCount()); + assertEquals(getExpectedAlerts()[0], acceptHeaderString()); + } + private String acceptHeaderString() { final WebRequest lastRequest = getMockWebConnection().getLastWebRequest(); final Map<String, String> headers = lastRequest.getAdditionalHeaders(); |
From: <rb...@us...> - 2013-12-04 18:41:07
|
Revision: 8815 http://sourceforge.net/p/htmlunit/code/8815 Author: rbri Date: 2013-12-04 18:41:03 +0000 (Wed, 04 Dec 2013) Log Message: ----------- DomCharacterData.deleteData() fixed 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/DomCharacterData.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/CharacterDataImplTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-12-01 21:00:59 UTC (rev 8814) +++ trunk/htmlunit/src/changes/changes.xml 2013-12-04 18:41:03 UTC (rev 8815) @@ -8,6 +8,11 @@ <body> <release version="2.14" date="???" description="Bugfixes"> + DomCharacterData-deleteData + <action type="fix" dev="rbri" due-to="Frank Danek"> + JavaScript: DomCharacterData.deleteData no longer wipes the string when called with an invalid + offset. Also the error handling is fixed. + </action> <action type="fix" dev="rbri" issue="1245"> Use the same accept headers as browsers do. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-12-01 21:00:59 UTC (rev 8814) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-12-04 18:41:03 UTC (rev 8815) @@ -850,6 +850,11 @@ @BrowserFeature(@WebBrowser(FF)) JS_DOMIMPLEMENTATION_FEATURE_XPATH_3, + /** Javascript property function delete thows an exception if the + * given count is negative. */ + @BrowserFeature(@WebBrowser(IE)) + JS_DOM_CDATA_DELETE_THROWS_NEGATIVE_COUNT, + /** Don't enumerate functions, see {@link net.sourceforge.htmlunit.corejs.javascript.ScriptableObject#DONTENUM}. */ @BrowserFeature(@WebBrowser(IE)) JS_DONT_ENUM_FUNCTIONS, Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/DomCharacterData.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/DomCharacterData.java 2013-12-01 21:00:59 UTC (rev 8814) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/DomCharacterData.java 2013-12-04 18:41:03 UTC (rev 8815) @@ -26,6 +26,8 @@ * @author <a href="mailto:cs...@dy...">Christian Sell</a> * @author Ahmed Ashour * @author Philip Graf + * @author Ronald Brill + * @author Frank Danek */ public abstract class DomCharacterData extends DomNode implements CharacterData { @@ -94,21 +96,25 @@ /** * Deletes characters from character data. - * @param offset the position of the first character to be deleted - * @param count the number of characters to be deleted + * @param offset the position of the first character to be deleted (can't be + * less than zero) + * @param count the number of characters to be deleted, if less than zero + * leaves the first offset chars */ public void deleteData(final int offset, final int count) { - if (offset < 0 || count < 0) { - throw new IllegalArgumentException("offset: " + offset + " count: " + count); + if (offset < 0) { + throw new IllegalArgumentException("Provided offset: " + offset + "is less than zero."); } - final int tailLength = Math.max(data_.length() - count - offset, 0); - if (tailLength > 0) { - data_ = data_.substring(0, offset) + data_.substring(offset + count, offset + count + tailLength); + final String data = data_.substring(0, offset); + if (count >= 0) { + final int fromLeft = offset + count; + if (fromLeft < data_.length()) { + data_ = data + data_.substring(fromLeft, data_.length()); + return; + } } - else { - data_ = ""; - } + data_ = data; } /** Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/CharacterDataImplTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/CharacterDataImplTest.java 2013-12-01 21:00:59 UTC (rev 8814) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/CharacterDataImplTest.java 2013-12-04 18:41:03 UTC (rev 8815) @@ -129,15 +129,38 @@ * @throws Exception if the test fails */ @Test - @Alerts("Some Text") + @Alerts({ "Some Text", "Some", "Some", "me", "" }) public void characterDataImpl_deleteData() throws Exception { final String html = "<html><head><title>First</title><script>\n" + "function doTest() {\n" + " var div1=document.getElementById('div1');\n" + " var text1=div1.firstChild;\n" - + " text1.deleteData(5, 11);\n" - + " alert(text1.data);\n" + + + " try {\n" + + " text1.deleteData(5, 11);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + + " try {\n" + + " text1.deleteData(4, 5);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + + " try {\n" + + " text1.deleteData(1, 0);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + + " try {\n" + + " text1.deleteData(0, 2);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + + " try {\n" + + " text1.deleteData(0, 2);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + "}\n" + "</script></head><body onload='doTest()'>\n" + "<div id='div1'>Some Not So New Text</div></body></html>"; @@ -147,6 +170,120 @@ } /** + * Regression test for deleteData of a text node. + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "", "", "", "" }, + IE = { "", "", "", "exception" }) + public void characterDataImpl_deleteDataEmptyImput() throws Exception { + final String html + = "<html><head><title>First</title><script>\n" + + "function doTest() {\n" + + " var div1=document.getElementById('div1');\n" + + " var text1=div1.firstChild;\n" + + + " try {\n" + + " text1.deleteData(0, 1);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + + " try {\n" + + " text1.deleteData(0, 0);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + + " try {\n" + + " text1.deleteData(0, 1);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + + " try {\n" + + " text1.deleteData(0, -1);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + "}\n" + + "</script></head><body onload='doTest()'>\n" + + "<div id='div1'>-</div></body></html>"; + + final WebDriver driver = loadPageWithAlerts2(html); + assertEquals("First", driver.getTitle()); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "exception", "exception", "exception", "exception" }, + IE = { "exception", "exception", "abcde", "exception" }) + public void characterDataImpl_deleteDataInvalidStart() throws Exception { + final String html + = "<html><head><title>First</title><script>\n" + + "function doTest() {\n" + + " var div1=document.getElementById('div1');\n" + + " var text1=div1.firstChild;\n" + + " try {\n" + + " text1.deleteData(-1, 4);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + + " try {\n" + + " text1.deleteData(20, 4);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + + " try {\n" + + " text1.deleteData(20, 0);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + + " try {\n" + + " text1.deleteData(20, -18);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + "}\n" + + "</script></head><body onload='doTest()'>\n" + + "<div id='div1'>abcde</div></body></html>"; + + final WebDriver driver = loadPageWithAlerts2(html); + assertEquals("First", driver.getTitle()); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "Some Not So New Te", "Some ", "So" }, + IE = { "exception", "exception", "exception" }) + public void characterDataImpl_deleteDataNegativeCount() throws Exception { + final String html + = "<html><head><title>First</title><script>\n" + + "function doTest() {\n" + + " var div1=document.getElementById('div1');\n" + + " var text1=div1.firstChild;\n" + + " try {\n" + + " text1.deleteData(18, -15);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + + " try {\n" + + " text1.deleteData(5, -4);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + + " try {\n" + + " text1.deleteData(2, -4);\n" + + " alert(text1.data);\n" + + " } catch (e) { alert('exception') }\n" + + "}\n" + + "</script></head><body onload='doTest()'>\n" + + "<div id='div1'>Some Not So New Text</div></body></html>"; + + final WebDriver driver = loadPageWithAlerts2(html); + assertEquals("First", driver.getTitle()); + } + + /** * Regression test for insertData of a text node. * @throws Exception if the test fails */ |
From: <rb...@us...> - 2013-12-04 18:43:51
|
Revision: 8816 http://sourceforge.net/p/htmlunit/code/8816 Author: rbri Date: 2013-12-04 18:43:47 +0000 (Wed, 04 Dec 2013) Log Message: ----------- XMLDocument.firstChild() is now enabled to support more nodes at the root level like ProcessingInstruction, Comment Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/CharacterDataImpl.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/XSLTProcessor.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/xml/XmlPage.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/xml/XmlUtil.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLDocument2Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-12-04 18:41:03 UTC (rev 8815) +++ trunk/htmlunit/src/changes/changes.xml 2013-12-04 18:43:47 UTC (rev 8816) @@ -8,8 +8,11 @@ <body> <release version="2.14" date="???" description="Bugfixes"> - DomCharacterData-deleteData <action type="fix" dev="rbri" due-to="Frank Danek"> + JavaScript: XMLDocument.firstChild() is now enabled to support more nodes at the + root level like ProcessingInstruction, Comment. + </action> + <action type="fix" dev="rbri" due-to="Frank Danek"> JavaScript: DomCharacterData.deleteData no longer wipes the string when called with an invalid offset. Also the error handling is fixed. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/CharacterDataImpl.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/CharacterDataImpl.java 2013-12-04 18:41:03 UTC (rev 8815) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/CharacterDataImpl.java 2013-12-04 18:43:47 UTC (rev 8816) @@ -14,6 +14,9 @@ */ package com.gargoylesoftware.htmlunit.javascript.host; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_DOM_CDATA_DELETE_THROWS_NEGATIVE_COUNT; +import net.sourceforge.htmlunit.corejs.javascript.Context; + import com.gargoylesoftware.htmlunit.html.DomCharacterData; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxClass; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxFunction; @@ -83,7 +86,24 @@ */ @JsxFunction public void deleteData(final int offset, final int count) { + if (offset < 0) { + throw Context.reportRuntimeError("Provided offset: " + offset + " is less than zero."); + } + + if (getBrowserVersion().hasFeature(JS_DOM_CDATA_DELETE_THROWS_NEGATIVE_COUNT)) { + if (count < 0) { + throw Context.reportRuntimeError("Provided count: " + count + " is less than zero."); + } + if (count == 0) { + return; + } + } + final DomCharacterData domCharacterData = (DomCharacterData) getDomNodeOrDie(); + if (offset > domCharacterData.getLength()) { + throw Context.reportRuntimeError("Provided offset: " + offset + " is greater than length."); + } + domCharacterData.deleteData(offset, count); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/XSLTProcessor.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/XSLTProcessor.java 2013-12-04 18:41:03 UTC (rev 8815) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/XSLTProcessor.java 2013-12-04 18:43:47 UTC (rev 8816) @@ -177,7 +177,7 @@ final SgmlPage parentPage = parent.getPage(); final NodeList children = ((org.w3c.dom.Node) result).getChildNodes(); for (int i = 0; i < children.getLength(); i++) { - XmlUtil.appendChild(parentPage, parent, children.item(i)); + XmlUtil.appendChild(parentPage, parent, children.item(i), true); } } else { Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/xml/XmlPage.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/xml/XmlPage.java 2013-12-04 18:41:03 UTC (rev 8815) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/xml/XmlPage.java 2013-12-04 18:43:47 UTC (rev 8816) @@ -82,7 +82,7 @@ super(null, enclosingWindow); node_ = node; if (node_ != null) { - XmlUtil.appendChild(this, this, node_); + XmlUtil.appendChild(this, this, node_, true); } } @@ -98,11 +98,29 @@ */ public XmlPage(final WebResponse webResponse, final WebWindow enclosingWindow, final boolean ignoreSAXException) throws IOException { + this(webResponse, enclosingWindow, ignoreSAXException, true); + } + + /** + * Creates an instance. + * A warning is logged if an exception is thrown while parsing the XML content + * (for instance when the content is not a valid XML and can't be parsed). + * + * @param webResponse the response from the server + * @param enclosingWindow the window that holds the page + * @param ignoreSAXException Whether to ignore {@link SAXException} or throw it as {@link IOException} + * @param handleXHTMLAsHTML if true elements from the XHTML namespace are handled as HTML elements instead of + * DOM elements + * @throws IOException if the page could not be created + */ + public XmlPage(final WebResponse webResponse, final WebWindow enclosingWindow, final boolean ignoreSAXException, + final boolean handleXHTMLAsHTML) throws IOException { super(webResponse, enclosingWindow); try { try { - node_ = XmlUtil.buildDocument(webResponse).getDocumentElement(); + final Document document = XmlUtil.buildDocument(webResponse); + node_ = document.getFirstChild(); } catch (final SAXException e) { LOG.warn("Failed parsing XML document " + webResponse.getWebRequest().getUrl() @@ -122,8 +140,10 @@ } } - if (node_ != null) { - XmlUtil.appendChild(this, this, node_); + Node node = node_; + while (node != null) { + XmlUtil.appendChild(this, this, node, handleXHTMLAsHTML); + node = node.getNextSibling(); } } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/xml/XmlUtil.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/xml/XmlUtil.java 2013-12-04 18:41:03 UTC (rev 8815) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/xml/XmlUtil.java 2013-12-04 18:43:47 UTC (rev 8816) @@ -18,7 +18,7 @@ import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; @@ -195,30 +195,44 @@ * @param page the owner page of {@link DomElement}s to be created * @param parent the parent DomNode * @param child the child Node + * @param handleXHTMLAsHTML if true elements from the XHTML namespace are handled as HTML elements instead of + * DOM elements */ - public static void appendChild(final SgmlPage page, final DomNode parent, final Node child) { + public static void appendChild(final SgmlPage page, final DomNode parent, final Node child, + final boolean handleXHTMLAsHTML) { final DocumentType documentType = child.getOwnerDocument().getDoctype(); if (documentType != null && page instanceof XmlPage) { final DomDocumentType domDoctype = new DomDocumentType( page, documentType.getName(), documentType.getPublicId(), documentType.getSystemId()); ((XmlPage) page).setDocumentType(domDoctype); } - final DomNode childXml = createFrom(page, child); + final DomNode childXml = createFrom(page, child, handleXHTMLAsHTML); parent.appendChild(childXml); - copy(page, child, childXml); + copy(page, child, childXml, handleXHTMLAsHTML); } - private static DomNode createFrom(final SgmlPage page, final Node source) { + private static DomNode createFrom(final SgmlPage page, final Node source, final boolean handleXHTMLAsHTML) { if (source.getNodeType() == Node.TEXT_NODE) { return new DomText(page, source.getNodeValue()); } + if (source.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) { + return new DomProcessingInstruction(page, source.getNodeName(), source.getNodeValue()); + } + if (source.getNodeType() == Node.COMMENT_NODE) { + return new DomComment(page, source.getNodeValue()); + } + if (source.getNodeType() == Node.DOCUMENT_TYPE_NODE) { + final DocumentType documentType = (DocumentType) source; + return new DomDocumentType(page, documentType.getName(), documentType.getPublicId(), + documentType.getSystemId()); + } final String ns = source.getNamespaceURI(); String localName = source.getLocalName(); - if (HTMLParser.XHTML_NAMESPACE.equals(ns)) { + if (handleXHTMLAsHTML && HTMLParser.XHTML_NAMESPACE.equals(ns)) { final ElementFactory factory = HTMLParser.getFactory(localName); return factory.createElementNS(page, ns, localName, namedNodeMapToSaxAttributes(source.getAttributes())); } - final Map<String, DomAttr> attributes = new HashMap<String, DomAttr>(); + final Map<String, DomAttr> attributes = new LinkedHashMap<String, DomAttr>(); final NamedNodeMap nodeAttributes = source.getAttributes(); for (int i = 0; i < nodeAttributes.getLength(); i++) { final Attr attribute = (Attr) nodeAttributes.item(i); @@ -265,16 +279,19 @@ * @param page the page which the nodes belong to * @param source the node to copy from * @param dest the node to copy to + * @param handleXHTMLAsHTML if true elements from the XHTML namespace are handled as HTML elements instead of + * DOM elements */ - private static void copy(final SgmlPage page, final Node source, final DomNode dest) { + private static void copy(final SgmlPage page, final Node source, final DomNode dest, + final boolean handleXHTMLAsHTML) { final NodeList nodeChildren = source.getChildNodes(); for (int i = 0; i < nodeChildren.getLength(); i++) { final Node child = nodeChildren.item(i); switch (child.getNodeType()) { case Node.ELEMENT_NODE: - final DomNode childXml = createFrom(page, child); + final DomNode childXml = createFrom(page, child, handleXHTMLAsHTML); dest.appendChild(childXml); - copy(page, child, childXml); + copy(page, child, childXml, handleXHTMLAsHTML); break; case Node.TEXT_NODE: Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLDocument2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLDocument2Test.java 2013-12-04 18:41:03 UTC (rev 8815) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/xml/XMLDocument2Test.java 2013-12-04 18:43:47 UTC (rev 8816) @@ -15,6 +15,7 @@ package com.gargoylesoftware.htmlunit.javascript.host.xml; import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.IE; +import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.IE8; import org.junit.Test; import org.junit.runner.RunWith; @@ -22,6 +23,7 @@ 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.WebDriverTestCase; /** @@ -179,4 +181,276 @@ + "</body></html>"; loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "foo", "foo" }) + public void firstChild_element() throws Exception { + final String html = "<html><head><title>foo</title><script>\n" + + " function test() {\n" + + " var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n" + + " alert(doc.firstChild.nodeName);\n" + + " alert(doc.documentElement.nodeName);\n" + + " }\n" + + XMLDocumentTest.LOAD_NATIVE_XML_DOCUMENT_FROM_FILE_FUNCTION + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + final String xml = + "<foo>\n" + + " <foofoo name='first'>something</foofoo>\n" + + " <foofoo name='second'>something else</foofoo>\n" + + "</foo>"; + + getMockWebConnection().setResponse(URL_SECOND, xml, "text/xml"); + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Browsers(IE) + @Alerts({ "foo", "foo" }) + public void firstChild_element_activeX() throws Exception { + final String html = "<html><head><title>foo</title><script>\n" + + " function test() {\n" + + " var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n" + + " alert(doc.firstChild.nodeName);\n" + + " alert(doc.documentElement.nodeName);\n" + + " }\n" + + XMLDocumentTest.LOAD_ACTIVEX_XML_DOCUMENT_FROM_FILE_FUNCTION + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + final String xml = + "<foo>\n" + + " <foofoo name='first'>something</foofoo>\n" + + " <foofoo name='second'>something else</foofoo>\n" + + "</foo>"; + + getMockWebConnection().setResponse(URL_SECOND, xml, "text/xml"); + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "foo", "foo" }, + IE8 = { "xml", "foo" }) + @NotYetImplemented(IE8) + // Xerces does not offer any way to access the XML declaration + public void firstChild_xmlDeclaration() throws Exception { + final String html = "<html><head><title>foo</title><script>\n" + + " function test() {\n" + + " var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n" + + " alert(doc.firstChild.nodeName);\n" + + " alert(doc.documentElement.nodeName);\n" + + " }\n" + + XMLDocumentTest.LOAD_NATIVE_XML_DOCUMENT_FROM_FILE_FUNCTION + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + final String xml = + "<?xml version=\"1.0\"?>\n" + + "<foo>\n" + + " <foofoo name='first'>something</foofoo>\n" + + " <foofoo name='second'>something else</foofoo>\n" + + "</foo>"; + + getMockWebConnection().setResponse(URL_SECOND, xml, "text/xml"); + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Browsers(IE) + @Alerts({ "xml", "foo" }) + @NotYetImplemented(IE) + // Xerces does not offer any way to access the XML declaration + public void firstChild_xmlDeclaration_activeX() throws Exception { + final String html = "<html><head><title>foo</title><script>\n" + + " function test() {\n" + + " var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n" + + " alert(doc.firstChild.nodeName);\n" + + " alert(doc.documentElement.nodeName);\n" + + " }\n" + + XMLDocumentTest.LOAD_ACTIVEX_XML_DOCUMENT_FROM_FILE_FUNCTION + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + final String xml = + "<?xml version=\"1.0\"?>\n" + + "<foo>\n" + + " <foofoo name='first'>something</foofoo>\n" + + " <foofoo name='second'>something else</foofoo>\n" + + "</foo>"; + + getMockWebConnection().setResponse(URL_SECOND, xml, "text/xml"); + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "apache", "foo" }) + public void firstChild_processingInstruction() throws Exception { + final String html = "<html><head><title>foo</title><script>\n" + + " function test() {\n" + + " var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n" + + " alert(doc.firstChild.nodeName);\n" + + " alert(doc.documentElement.nodeName);\n" + + " }\n" + + XMLDocumentTest.LOAD_NATIVE_XML_DOCUMENT_FROM_FILE_FUNCTION + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + final String xml = + "<?apache include file=\"header.html\" ?>\n" + + "<foo>\n" + + " <foofoo name='first'>something</foofoo>\n" + + " <foofoo name='second'>something else</foofoo>\n" + + "</foo>"; + + getMockWebConnection().setResponse(URL_SECOND, xml, "text/xml"); + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Browsers(IE) + @Alerts({ "apache", "foo" }) + public void firstChild_processingInstruction_activeX() throws Exception { + final String html = "<html><head><title>foo</title><script>\n" + + " function test() {\n" + + " var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n" + + " alert(doc.firstChild.nodeName);\n" + + " alert(doc.documentElement.nodeName);\n" + + " }\n" + + XMLDocumentTest.LOAD_ACTIVEX_XML_DOCUMENT_FROM_FILE_FUNCTION + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + final String xml = + "<?apache include file=\"header.html\" ?>\n" + + "<foo>\n" + + " <foofoo name='first'>something</foofoo>\n" + + " <foofoo name='second'>something else</foofoo>\n" + + "</foo>"; + + getMockWebConnection().setResponse(URL_SECOND, xml, "text/xml"); + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "dtd", "a" }) + public void firstChild_documentType() throws Exception { + final String html = "<html><head><title>foo</title><script>\n" + + " function test() {\n" + + " var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n" + + " alert(doc.firstChild.nodeName);\n" + + " alert(doc.documentElement.nodeName);\n" + + " }\n" + + XMLDocumentTest.LOAD_NATIVE_XML_DOCUMENT_FROM_FILE_FUNCTION + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + final String xml = + "<!DOCTYPE dtd [ <!ELEMENT a (b+)> <!ELEMENT b (#PCDATA)> ]>\n" + + "<a><b>1</b><b>2</b></a>"; + + getMockWebConnection().setResponse(URL_SECOND, xml, "text/xml"); + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Browsers(IE) + @Alerts({ "dtd", "a" }) + public void firstChild_documentType_activeX() throws Exception { + final String html = "<html><head><title>foo</title><script>\n" + + " function test() {\n" + + " var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n" + + " alert(doc.firstChild.nodeName);\n" + + " alert(doc.documentElement.nodeName);\n" + + " }\n" + + XMLDocumentTest.LOAD_ACTIVEX_XML_DOCUMENT_FROM_FILE_FUNCTION + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + final String xml = + "<!DOCTYPE dtd [ <!ELEMENT a (b+)> <!ELEMENT b (#PCDATA)> ]>\n" + + "<a><b>1</b><b>2</b></a>"; + + getMockWebConnection().setResponse(URL_SECOND, xml, "text/xml"); + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "#comment", "foo" }) + public void firstChild_comment() throws Exception { + final String html = "<html><head><title>foo</title><script>\n" + + " function test() {\n" + + " var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n" + + " alert(doc.firstChild.nodeName);\n" + + " alert(doc.documentElement.nodeName);\n" + + " }\n" + + XMLDocumentTest.LOAD_NATIVE_XML_DOCUMENT_FROM_FILE_FUNCTION + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + final String xml = + "<!--comment-->\n" + + "<foo>\n" + + " <foofoo name='first'>something</foofoo>\n" + + " <foofoo name='second'>something else</foofoo>\n" + + "</foo>"; + + getMockWebConnection().setResponse(URL_SECOND, xml, "text/xml"); + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Browsers(IE) + @Alerts({ "#comment", "foo" }) + public void firstChild_comment_activeX() throws Exception { + final String html = "<html><head><title>foo</title><script>\n" + + " function test() {\n" + + " var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n" + + " alert(doc.firstChild.nodeName);\n" + + " alert(doc.documentElement.nodeName);\n" + + " }\n" + + XMLDocumentTest.LOAD_ACTIVEX_XML_DOCUMENT_FROM_FILE_FUNCTION + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + final String xml = + "<!--comment-->\n" + + "<foo>\n" + + " <foofoo name='first'>something</foofoo>\n" + + " <foofoo name='second'>something else</foofoo>\n" + + "</foo>"; + + getMockWebConnection().setResponse(URL_SECOND, xml, "text/xml"); + loadPageWithAlerts2(html); + } } |
From: <rb...@us...> - 2013-12-07 20:33:29
|
Revision: 8820 http://sourceforge.net/p/htmlunit/code/8820 Author: rbri Date: 2013-12-07 20:33:26 +0000 (Sat, 07 Dec 2013) Log Message: ----------- next try to fix our cache Issue 1352 Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/Cache.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CacheTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/Cache.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/Cache.java 2013-12-06 18:43:32 UTC (rev 8819) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/Cache.java 2013-12-07 20:33:26 UTC (rev 8820) @@ -55,11 +55,13 @@ */ private static class Entry implements Comparable<Entry>, Serializable { private final String key_; - private final Object value_; + private WebResponse response_; + private Object value_; private long lastAccess_; - Entry(final String key, final Object value) { + Entry(final String key, final WebResponse response, final Object value) { key_ = key; + response_ = response; value_ = value; lastAccess_ = System.currentTimeMillis(); } @@ -97,7 +99,7 @@ public void cacheIfPossible(final WebRequest request, final WebResponse response, final Object toCache) { if (isCacheable(request, response)) { final String url = response.getWebRequest().getUrl().toString(); - final Entry entry = new Entry(url, toCache); + final Entry entry = new Entry(url, response, toCache); entries_.put(entry.key_, entry); deleteOverflow(); } @@ -115,7 +117,7 @@ * @param styleSheet the parsed version of <tt>css</tt> */ public void cache(final String css, final CSSStyleSheet styleSheet) { - final Entry entry = new Entry(css, styleSheet); + final Entry entry = new Entry(css, null, styleSheet); entries_.put(entry.key_, entry); deleteOverflow(); } @@ -202,6 +204,27 @@ } /** + * Returns the cached resonse corresponding to the specified request. If there is + * no corresponding cached object, this method returns <tt>null</tt>. + * + * @param request the request whose corresponding response is sought + * @return the cached response corresponding to the specified request if any + */ + public WebResponse getCachedResponse(final WebRequest request) { + if (HttpMethod.GET != request.getHttpMethod()) { + return null; + } + final Entry cachedEntry = entries_.get(request.getUrl().toString()); + if (cachedEntry == null) { + return null; + } + synchronized (entries_) { + cachedEntry.touch(); + } + return cachedEntry.response_; + } + + /** * Returns the cached object corresponding to the specified request. If there is * no corresponding cached object, this method returns <tt>null</tt>. * Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java 2013-12-06 18:43:32 UTC (rev 8819) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java 2013-12-07 20:33:26 UTC (rev 8820) @@ -1271,10 +1271,10 @@ addDefaultHeaders(webRequest); // Retrieve the response, either from the cache or from the server. - final Object fromCache = getCache().getCachedObject(webRequest); + final WebResponse fromCache = getCache().getCachedResponse(webRequest); final WebResponse webResponse; - if (fromCache != null && fromCache instanceof WebResponse) { - webResponse = new WebResponseFromCache((WebResponse) fromCache, webRequest); + if (fromCache != null) { + webResponse = new WebResponseFromCache(fromCache, webRequest); } else { try { @@ -1283,7 +1283,7 @@ catch (final NoHttpResponseException e) { return new WebResponse(responseDataNoHttpResponse_, webRequest, 0); } - getCache().cacheIfPossible(webRequest, webResponse, webResponse); + getCache().cacheIfPossible(webRequest, webResponse, null); } // Continue according to the HTTP status code. Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2013-12-06 18:43:32 UTC (rev 8819) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2013-12-07 20:33:26 UTC (rev 8820) @@ -1094,12 +1094,18 @@ request.setAdditionalHeader("Referer", referringRequest.getUrl().toString()); request.setAdditionalHeader("Accept", client.getBrowserVersion().getScriptAcceptHeader()); + // our cache is a bit strange; + // loadWebResponse check the cache for the web response + // AND also fixes the request url for the following cache lookups + final WebResponse response = client.loadWebResponse(request); + + // now we can look into the cache with the fixed request for + // a cached script final Object cachedScript = cache.getCachedObject(request); if (cachedScript instanceof Script) { return (Script) cachedScript; } - final WebResponse response = client.loadWebResponse(request); client.printContentIfNecessary(response); client.throwFailingHttpStatusCodeExceptionIfNecessary(response); @@ -1148,6 +1154,7 @@ final JavaScriptEngine javaScriptEngine = client.getJavaScriptEngine(); final Script script = javaScriptEngine.compile(this, scriptCode, url.toExternalForm(), 1); if (script != null) { + // cache the script cache.cacheIfPossible(request, response, script); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet.java 2013-12-06 18:43:32 UTC (rev 8819) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet.java 2013-12-07 20:33:26 UTC (rev 8820) @@ -305,14 +305,20 @@ request.setAdditionalHeader("Referer", referer); } - uri = request.getUrl().toExternalForm(); + // our cache is a bit strange; + // loadWebResponse check the cache for the web response + // AND also fixes the request url for the following cache lookups + final WebResponse response = client.loadWebResponse(request); + + // now we can look into the cache with the fixed request for + // a cached script final Cache cache = client.getCache(); final Object fromCache = cache.getCachedObject(request); if (fromCache != null && fromCache instanceof org.w3c.dom.css.CSSStyleSheet) { + uri = request.getUrl().toExternalForm(); sheet = new CSSStyleSheet(element, (org.w3c.dom.css.CSSStyleSheet) fromCache, uri); } else { - final WebResponse response = client.loadWebResponse(request); uri = response.getWebRequest().getUrl().toExternalForm(); client.printContentIfNecessary(response); client.throwFailingHttpStatusCodeExceptionIfNecessary(response); @@ -321,6 +327,7 @@ source.setByteStream(response.getContentAsStream()); source.setEncoding(response.getContentCharset()); sheet = new CSSStyleSheet(element, source, uri); + // cache the style sheet cache.cacheIfPossible(request, response, sheet.getWrappedSheet()); response.cleanUp(); } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CacheTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CacheTest.java 2013-12-06 18:43:32 UTC (rev 8819) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/CacheTest.java 2013-12-07 20:33:26 UTC (rev 8820) @@ -31,9 +31,7 @@ import org.junit.runner.RunWith; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; -import com.gargoylesoftware.htmlunit.BrowserRunner.Browser; import com.gargoylesoftware.htmlunit.BrowserRunner.Browsers; -import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.util.NameValuePair; @@ -140,8 +138,7 @@ *@throws Exception if the test fails */ @Test - @NotYetImplemented(Browser.FF) - public void usageUrlEncoded() throws Exception { + public void jsUrlEncoded() throws Exception { final String content = "<html>\n" + "<head>\n" + " <title>page 1</title>\n" @@ -198,6 +195,76 @@ *@throws Exception if the test fails */ @Test + public void cssUrlEncoded() throws Exception { + final String content = "<html>\n" + + "<head>\n" + + " <title>page 1</title>\n" + + " <link href='foo1.css' type='text/css' rel='stylesheet'>\n" + + " <link href='foo2.js?foo[1]=bar/baz' type='text/css' rel='stylesheet'>\n" + + "</head>\n" + + "<body>\n" + + " <a href='page2.html'>to page 2</a>\n" + + " <script>\n" + + " var sheets = document.styleSheets;\n" + + " alert(sheets.length);\n" + + " var rules = sheets[0].cssRules || sheets[0].rules;\n" + + " alert(rules.length);\n" + + " rules = sheets[1].cssRules || sheets[1].rules;\n" + + " alert(rules.length);\n" + + " </script>\n" + " </body>\n" + + "</body>\n" + + "</html>"; + + final String content2 = "<html>\n2" + + "<head>\n" + + " <title>page 2</title>\n" + + " <link href='foo2.js?foo[1]=bar/baz' type='text/css' rel='stylesheet'>\n" + + "</head>\n" + + "<body>\n" + + " <a href='page1.html'>to page 1</a>\n" + + " <script>\n" + + " var sheets = document.styleSheets;\n" + + " alert(sheets.length);\n" + + " var rules = sheets[0].cssRules || sheets[0].rules;\n" + + " alert(rules.length);\n" + + " </script>\n" + " </body>\n" + + "</body>\n" + + "</html>"; + + final URL urlPage1 = new URL(URL_FIRST, "page1.html"); + getMockWebConnection().setResponse(urlPage1, content); + final URL urlPage2 = new URL(URL_FIRST, "page2.html"); + getMockWebConnection().setResponse(urlPage2, content2); + + final List<NameValuePair> headers = new ArrayList<NameValuePair>(); + headers.add(new NameValuePair("Last-Modified", "Sun, 15 Jul 2007 20:46:27 GMT")); + getMockWebConnection().setResponse(new URL(URL_FIRST, "foo1.js"), "", + 200, "ok", "text/css", headers); + getMockWebConnection().setDefaultResponse("", 200, "ok", "text/css", headers); + + final WebClient webClient = getWebClientWithMockWebConnection(); + + final List<String> collectedAlerts = new ArrayList<String>(); + webClient.setAlertHandler(new CollectingAlertHandler(collectedAlerts)); + + final HtmlPage page1 = webClient.getPage(urlPage1); + final String[] expectedAlerts = {"2", "0", "0"}; + assertEquals(expectedAlerts, collectedAlerts); + assertEquals(3, getMockWebConnection().getRequestCount()); + + collectedAlerts.clear(); + page1.getAnchors().get(0).click(); + + assertEquals(new String[] {"1", "0"}, collectedAlerts); + assertEquals(4, getMockWebConnection().getRequestCount()); + assertEquals("no request for scripts should have been performed", + urlPage2, getMockWebConnection().getLastWebRequest().getUrl()); + } + + /** + *@throws Exception if the test fails + */ + @Test public void maxSizeMaintained() throws Exception { final String html = "<html><head><title>page 1</title>\n" + "<script src='foo1.js' type='text/javascript'/>\n" |