Index: LayoutTests/fast/selectors/element-closest.html |
diff --git a/LayoutTests/fast/selectors/element-closest.html b/LayoutTests/fast/selectors/element-closest.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3b56b7c7f3ef385a3bb706a5ece82417f2a321ff |
--- /dev/null |
+++ b/LayoutTests/fast/selectors/element-closest.html |
@@ -0,0 +1,124 @@ |
+<!doctype html> |
+<script src="../../resources/js-test.js"></script> |
+<script> |
+if (window.testRunner) |
+ testRunner.dumpAsText(); |
+</script> |
+<body> |
+<tribe> |
+ |
+ <realm> |
+ <throne></throne> |
+ <ancestor id="doe" name="young" class="classic"> |
+ <target id="anotherTarget"></target> |
+ </ancestor> |
+ </realm> |
+ |
+ <ancestor id="john" name="old" class="classic"> |
+ <sibling></sibling> |
+ <target id="theTarget" webkit="fast"></target> |
+ </ancestor> |
+ |
+</tribe> |
+ |
+<foo> |
+ <bar> |
+ <a id="a"> |
+ <b id="b"> |
+ <c id="c"> |
+ <d id="d"> |
+ <lemon id="sour"></lemon> |
+ </d> |
+ <c/> |
+ </b> |
+ </a> |
+ </bar> |
+</foo> |
+</body> |
+<script> |
+description('This test makes sure the closest() API works correctly'); |
+ |
+var theTarget = document.getElementById('theTarget'); |
+var ancestor = document.getElementById('john'); |
+var sour = document.getElementById('sour'); |
+var sibling = document.getElementById('sibling'); |
+var a = document.getElementById('a'); |
+var b = document.getElementById('b'); |
+var c = document.getElementById('c'); |
+var d = document.getElementById('d'); |
+ |
+shouldBe('theTarget.closest("#theTarget")', 'theTarget'); |
+shouldBe('theTarget.closest("ancestor")', 'ancestor'); |
+shouldBe('theTarget.closest("tribe ancestor")', 'ancestor'); |
+shouldBe('theTarget.closest("tribe ancestor sibling")', 'sibling'); |
+shouldBe('theTarget.closest("tribe > ancestor")', 'ancestor'); |
+shouldBe('theTarget.closest("realm + ancestor")', 'ancestor'); |
+shouldBe('theTarget.closest("realm ~ ancestor")', 'ancestor'); |
+shouldBe('theTarget.closest("tribe, ancestor")', 'ancestor'); |
+shouldBe('theTarget.closest("ancestor, tribe")', 'ancestor'); |
+ |
+shouldBeNull('theTarget.closest("tribe realm")'); |
+shouldBeNull('theTarget.closest("tribe realm throne")'); |
+shouldBeNull('theTarget.closest("tribe realm ancestor")'); |
+shouldBeNull('theTarget.closest("realm > ancestor")'); |
+shouldBeNull('theTarget.closest("throne + ancestor")'); |
+shouldBeNull('theTarget.closest("throne ~ ancestor")'); |
+ |
+shouldBe('theTarget.closest(".classic")', 'ancestor'); |
+shouldBe('theTarget.closest("#john")', 'ancestor'); |
+shouldBeNull('theTarget.closest("doe")'); |
+shouldBe('theTarget.closest("ancestor[name=old]")', 'ancestor'); |
+shouldBeNull('theTarget.closest("ancestor[name=young]")', 'ancestor'); |
+ |
+shouldBeNull('theTarget.closest(null)'); |
+shouldBeNull('theTarget.closest(undefined)'); |
+ |
+shouldBe('sour.closest("lemon")', 'sour'); |
+ |
+shouldBe('sour.closest("a, b, c, d")', 'd'); |
+shouldBe('sour.closest("a, b, c")', 'c'); |
+shouldBe('sour.closest("a, b")', 'b'); |
+shouldBe('sour.closest("d, c, b, a")', 'd'); |
+shouldBe('sour.closest("c, b, a")', 'c'); |
+shouldBe('sour.closest("b, a")', 'b'); |
+shouldBe('sour.closest("a")', 'a'); |
+ |
+shouldBe('document.closest', 'undefined'); |
+shouldThrow('document.closest()'); |
+shouldThrow('theTarget.closest()'); |
+shouldThrow('theTarget.closest("")'); |
+shouldThrow('theTarget.closest(".123")'); |
+shouldThrow('theTarget.closest(" ")'); |
+shouldThrow('theTarget.closest(")")'); |
+shouldThrow('theTarget.closest("(")'); |
+shouldThrow('theTarget.closest("()")'); |
+shouldThrow('theTarget.closest("^_^")'); |
+shouldThrow('theTarget.closest("{")'); |
+shouldThrow('theTarget.closest("}")'); |
+shouldThrow('theTarget.closest("{}")'); |
+ |
+shouldBe('theTarget.closest(":scope")', 'theTarget'); |
+shouldBe('theTarget.closest(":not(:scope)")', 'ancestor'); |
+shouldBe('theTarget.closest("ancestor :scope")', 'theTarget'); |
+shouldBe('theTarget.closest("ancestor > :scope")', 'theTarget'); |
+shouldBeNull('theTarget.closest("ancestor:scope")'); |
+ |
+shouldBe('theTarget.closest("sibling + :scope")', 'theTarget'); |
+shouldBe('theTarget.closest("sibling ~ :scope")', 'theTarget'); |
+ |
+shouldBe('theTarget.closest("#theTarget:scope")', 'theTarget'); |
+shouldBe('theTarget.closest(":scope#theTarget")', 'theTarget'); |
+ |
+shouldBe('theTarget.closest("[webkit]:scope#theTarget")', 'theTarget'); |
+shouldBeNull('theTarget.closest(":not([webkit=fast]):scope#theTarget")'); |
+ |
+shouldBeNull('theTarget.closest(":scope target")'); |
+shouldBeNull('theTarget.closest(":scope > target")'); |
+shouldBeNull('theTarget.closest(":scope + target")'); |
+shouldBeNull('theTarget.closest(":scope ~ target")'); |
+ |
+shouldBeNull('theTarget.closest(":scope *")'); |
+shouldBeNull('theTarget.closest(":scope > *")'); |
+shouldBeNull('theTarget.closest(":scope + *")'); |
+shouldBeNull('theTarget.closest(":scope ~ *")'); |
+</script> |