summaryrefslogtreecommitdiffstats
path: root/LayoutTests/fast/xpath/ambiguous-operators.html
diff options
context:
space:
mode:
Diffstat (limited to 'LayoutTests/fast/xpath/ambiguous-operators.html')
-rw-r--r--LayoutTests/fast/xpath/ambiguous-operators.html118
1 files changed, 118 insertions, 0 deletions
diff --git a/LayoutTests/fast/xpath/ambiguous-operators.html b/LayoutTests/fast/xpath/ambiguous-operators.html
new file mode 100644
index 0000000..f22a185
--- /dev/null
+++ b/LayoutTests/fast/xpath/ambiguous-operators.html
@@ -0,0 +1,118 @@
+<html>
+<head>
+<link rel="stylesheet" href="../js/resources/js-test-style.css">
+<script src="../js/resources/js-test-pre.js"></script>
+<script src="xpath-test-pre.js"></script>
+<style>
+#context {display:none}
+</style>
+</head>
+<body>
+<p>Test that an NCName and * are interpreted as an operator when in
+binary operator context, and as a NameTest otherwise.
+
+<p>See <a href="http://bugs.webkit.org/show_bug.cgi?id=50366">bug 50366</a>:
+XPath lexer misinterprets expression starting with "div".</p>
+
+<div id="console"></div>
+
+<div id="context">
+ <div id="two" div="x">2</div>
+</div>
+
+<script>
+var context = document.getElementById('context');
+var div = document.getElementById('two');
+
+// =========== div ===========
+
+test(document, context, "div", [div], null); // div with no preceding token
+test(document, context, " div", [div], null);
+// div following every possible [28] ExprToken http://www.w3.org/TR/xpath/
+test(document, context, "(div) div (div)", 2/2, null); // div after ( and )
+test(document, context, "self::node()[div] div 1", 2/1, null); // div after [ and ]
+test(document, context, ". div .", 2/2, null); // div after .
+test(document, div, ".. div ..", 2/2, null); // div after ..
+test(document, context, "string(div/@div)", "x", null); // div after @
+test(document, context, "substring-before('1992', div)", "199", null); // div after ,
+test(document, div, "self::div", [div], null); // div after ::
+test(document, context, "* div 4", 2/4, null); // div after NameTest *
+test(document, context, "'3' div 4", 3/4, null); // div after Literal
+test(document, context, "\"3\" div 4", 3/4, null); // div after Literal
+test(document, context, "12 div 4", 12/4, null); // div after Number
+
+// div following every [32] Operator
+test(document, context, "true() and div", true, null); // div after OperatorName and
+test(document, context, "false() or div", true, null); // div after OperatorName or
+test(document, context, "div mod div", 0, null); // div after OperatorName mod
+test(document, context, "div div div", 1, null); // div after OperatorName div
+test(document, context, "3 * div", 6, null); // div after MultiplyOperator
+test(document, context, "div/div", [], null); // div after /
+test(document, context, "div//div", [], null); // div after //
+test(document, context, "zz|div", [div], null); // div after |
+test(document, context, "div+div", 4, null); // div after +
+test(document, context, "- - div", 2, null); // div after unary -
+test(document, context, "5 -div", 3, null); // div after binary -
+test(document, context, "div=div", true, null); // div after =
+test(document, context, "div!=div", false, null); // div after =
+test(document, context, "div<div", false, null); // div after <
+test(document, context, "div<=div", true, null); // div after <=
+test(document, context, "div>div", false, null); // div after >
+test(document, context, "div>=div", true, null); // div after >=
+
+
+// =========== * ===========
+
+test(document, context, "*", [div], null); // * with no preceding token
+test(document, context, " *", [div], null);
+// * following every possible [28] ExprToken http://www.w3.org/TR/xpath/
+test(document, context, "(*) * (*)", 2*2, null); // * after ( and )
+test(document, context, "self::node()[*] * 1", 2*1, null); // * after [ and ]
+test(document, context, ". * .", 2*2, null); // * after .
+test(document, div, ".. * ..", 2*2, null); // * after ..
+// (* can't follow @)
+test(document, context, "substring-before('1992', *)", "199", null); // * after ,
+test(document, div, "self::*", [div], null); // * after ::
+test(document, context, "* * 4", 2*4, null); // * after NameTest *
+test(document, context, "'3' * 4", 3*4, null); // * after Literal
+test(document, context, "\"3\" * 4", 3*4, null); // * after Literal
+test(document, context, "12 * 4", 12*4, null); // * after Number
+
+// * following every [32] Operator
+test(document, context, "true() and *", true, null); // * after OperatorName and
+test(document, context, "false() or *", true, null); // * after OperatorName or
+test(document, context, "* mod *", 0, null); // * after OperatorName mod
+test(document, context, "* div *", 1, null); // * after OperatorName div
+test(document, context, "3 * *", 6, null); // * after MultiplyOperator
+test(document, context, "*/*", [], null); // * after /
+test(document, context, "*//*", [], null); // * after //
+test(document, context, "zz|*", [div], null); // * after |
+test(document, context, "*+*", 4, null); // * after +
+test(document, context, "- - *", 2, null); // * after unary -
+test(document, context, "5 -*", 3, null); // * after binary -
+test(document, context, "*=*", true, null); // * after =
+test(document, context, "*!=*", false, null); // * after =
+test(document, context, "*<*", false, null); // * after <
+test(document, context, "*<=*", true, null); // * after <=
+test(document, context, "*>*", false, null); // * after >
+test(document, context, "*>=*", true, null); // * after >=
+
+var xmlDoc = (new DOMParser).parseFromString("<or xmlns='uri'>5</or>", "text/xml");
+var nsResolver = function(prefix) {return 'uri';}
+// div and * after :
+test(xmlDoc, xmlDoc, "or:or", [xmlDoc.documentElement], nsResolver);
+test(xmlDoc, xmlDoc, "or:*", [xmlDoc.documentElement], nsResolver);
+
+// A few tests with mod as well
+var xmlDoc2 = (new DOMParser).parseFromString("<mod and='x'>8</mod>", "text/xml");
+test(xmlDoc2, xmlDoc2, "mod", [xmlDoc2.documentElement], null);
+test(xmlDoc2, xmlDoc2, "mod mod mod", 0, null);
+test(xmlDoc2, xmlDoc2, "(mod) mod 5", 3, null);
+test(xmlDoc2, xmlDoc2, "string(mod/@and)", 'x', null);
+
+
+var successfullyParsed = true;
+</script>
+<script src="../js/resources/js-test-post.js"></script>
+</body>
+</html>