[prev in list] [next in list] [prev in thread] [next in thread]
List: htmlunit-develop
Subject: [HtmlUnit] SVN: [8422] trunk/htmlunit/src
From: rbri () users ! sourceforge ! net
Date: 2013-07-25 18:36:28
Message-ID: E1V2QOv-0004gg-5s () sfs-ml-1 ! v29 ! ch3 ! sourceforge ! com
[Download RAW message or body]
Revision: 8422
http://sourceforge.net/p/htmlunit/code/8422
Author: rbri
Date: 2013-07-25 18:36:28 +0000 (Thu, 25 Jul 2013)
Log Message:
-----------
XPathEvaluator.evaluate() ignores namespace resolver (patch by Chuck Dumont)
Issue 1528
Modified Paths:
--------------
trunk/htmlunit/src/changes/changes.xml
trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/XPathEvaluator.java
trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/XPathEvaluatorTest.java
Modified: trunk/htmlunit/src/changes/changes.xml
===================================================================
--- trunk/htmlunit/src/changes/changes.xml 2013-07-25 17:30:45 UTC (rev 8421)
+++ trunk/htmlunit/src/changes/changes.xml 2013-07-25 18:36:28 UTC (rev 8422)
@@ -8,6 +8,9 @@
<body>
<release version="2.13" date="???" description="Bugfixes">
+ <action type="fix" dev="rbri" issue="1528" due-to="Chuck Dumont">
+ XPathEvaluator.evaluate() ignores namespace resolver.
+ </action>
<action type="fix" dev="rbri" issue="1527" due-to="Chuck Dumont">
XPathResult types STRING_TYPE, NUMBER_TYPE and BOOLEAN_TYPE don't \
work. </action>
Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/XPathEvaluator.java
===================================================================
--- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/XPathEvaluator.java 2013-07-25 \
17:30:45 UTC (rev 8421)
+++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/XPathEvaluator.java 2013-07-25 \
18:36:28 UTC (rev 8422) @@ -15,7 +15,11 @@
package com.gargoylesoftware.htmlunit.javascript.host;
import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF;
+import net.sourceforge.htmlunit.corejs.javascript.NativeArray;
+import net.sourceforge.htmlunit.corejs.javascript.NativeFunction;
+import org.apache.xml.utils.PrefixResolver;
+
import com.gargoylesoftware.htmlunit.javascript.SimpleScriptable;
import com.gargoylesoftware.htmlunit.javascript.configuration.JsxClass;
import com.gargoylesoftware.htmlunit.javascript.configuration.JsxConstructor;
@@ -27,6 +31,8 @@
*
* @version $Revision$
* @author Marc Guillemot
+ * @author Chuck Dumont
+ * @author Ronald Brill
*/
@JsxClass(browsers = @WebBrowser(value = FF, minVersion = 17))
public class XPathEvaluator extends SimpleScriptable {
@@ -58,7 +64,7 @@
/**
* Evaluates an XPath expression string and returns a result of the specified \
type if possible.
* @param expression the XPath expression string to be parsed and evaluated
- * @param contextNode the context node for the evaluation of this XPath \
expression + * @param contextNodeObj the context node for the evaluation of this \
XPath expression
* @param resolver the resolver permits translation of all prefixes, including \
the XML namespace prefix,
* within the XPath expression into appropriate namespace URIs.
* @param type If a specific type is specified, then the result will be returned \
as the corresponding type @@ -66,7 +72,7 @@
* @return the result of the evaluation of the XPath expression
*/
@JsxFunction(@WebBrowser(FF))
- public XPathResult evaluate(final String expression, final Node contextNode,
+ public XPathResult evaluate(final String expression, final Object \
contextNodeObj, final Object resolver, final int type, final Object result) {
XPathResult xPathResult = (XPathResult) result;
if (xPathResult == null) {
@@ -74,7 +80,23 @@
xPathResult.setParentScope(getParentScope());
xPathResult.setPrototype(getPrototype(xPathResult.getClass()));
}
- xPathResult.init(contextNode.getDomNodeOrDie().getByXPath(expression), \
type); + // contextNodeObj can be either a node or an array with the node as \
the first element. + Node contextNode = null;
+ if (contextNodeObj instanceof NativeArray) {
+ contextNode = (Node) ((NativeArray) contextNodeObj).get(0);
+ }
+ else {
+ contextNode = (Node) contextNodeObj;
+ }
+ PrefixResolver prefixResolver = null;
+ if (resolver instanceof PrefixResolver) {
+ prefixResolver = (PrefixResolver) resolver;
+ }
+ else if (resolver instanceof NativeFunction) {
+ prefixResolver = new NativeFunctionPrefixResolver((NativeFunction) \
resolver, contextNode.getParentScope()); + }
+ xPathResult.init(contextNode.getDomNodeOrDie().getByXPath(expression, \
prefixResolver), type); return xPathResult;
}
+
}
Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/XPathEvaluatorTest.java
===================================================================
--- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/XPathEvaluatorTest.java 2013-07-25 \
17:30:45 UTC (rev 8421)
+++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/XPathEvaluatorTest.java 2013-07-25 \
18:36:28 UTC (rev 8422) @@ -26,6 +26,8 @@
*
* @version $Revision$
* @author Marc Guillemot
+ * @author Chuck Dumont
+ * @author Ronald Brill
*/
@RunWith(BrowserRunner.class)
public class XPathEvaluatorTest extends WebDriverTestCase {
@@ -58,4 +60,68 @@
loadPageWithAlerts2(html);
}
+
+ /**
+ * @throws Exception if the test fails
+ */
+ @Test
+ @Alerts(DEFAULT = { "Immortality" }, IE = { }, FF3_6 = { })
+ public void namespacesWithNodeInArray() throws Exception {
+ final String html = "<html><head><title>foo</title><script>\n"
+ + " var xml = "
+ + " '<soap:Envelope \
xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" + + " \
<soap:books>" + + " <soap:book>"
+ + " <title>Immortality</title>"
+ + " <author>John Smith</author>"
+ + " </soap:book>"
+ + " </soap:books>"
+ + " </soap:Envelope>';\n"
+ + " function test() {\n"
+ + " if (window.XPathEvaluator) {"
+ + " var doc = (new DOMParser).parseFromString(xml);"
+ + " var xpe = new XPathEvaluator();\n"
+ + " var nsResolver = xpe.createNSResolver(doc.documentElement);\n"
+ + " var result = \
xpe.evaluate('/soap:Envelope/soap:books/soap:book/title/text()', " + \
+ "[doc.documentElement], nsResolver, XPathResult.STRING_TYPE, null);\n" + \
+ " alert(result.stringValue);\n" + + " }}\n"
+ + "</script></head><body onload='test()'>\n"
+ + "</body></html>";
+
+ loadPageWithAlerts2(html);
+ }
+
+ /**
+ * @throws Exception if the test fails
+ */
+ @Test
+ @Alerts(DEFAULT = { "Immortality" }, IE = { }, FF3_6 = { })
+ public void namespacesWithCustomNSResolver() throws Exception {
+ final String html = "<html><head><title>foo</title><script>\n"
+ + " function nsResolver(prefix) {"
+ + " return {s : 'http://schemas.xmlsoap.org/soap/envelope/'}[prefix] \
|| null;" + + " }"
+ + " var xml = "
+ + " '<soap:Envelope \
xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" + + " \
<soap:books>" + + " <soap:book>"
+ + " <title>Immortality</title>"
+ + " <author>John Smith</author>"
+ + " </soap:book>"
+ + " </soap:books>"
+ + " </soap:Envelope>';\n"
+ + " function test() {\n"
+ + " if (window.XPathEvaluator) {"
+ + " var doc = (new DOMParser).parseFromString(xml);"
+ + " var xpe = new XPathEvaluator();\n"
+ + " var result = \
xpe.evaluate('/s:Envelope/s:books/s:book/title/text()', " + \
+ "doc.documentElement, nsResolver, XPathResult.STRING_TYPE, null);\n" + + \
" alert(result.stringValue);\n" + + " }}\n"
+ + "</script></head><body onload='test()'>\n"
+ + "</body></html>";
+
+ loadPageWithAlerts2(html);
+ }
}
------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
HtmlUnit-develop mailing list
HtmlUnit-develop@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/htmlunit-develop
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic