blob: c9eaf4164c001feb34ebd5e3108f7b135960eee4 [file] [log] [blame]
<!doctype html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<style>
span.target {
background-color:rgb(0,0,0);
color:rgb(0,0,0);
}
a + :nth-child(n+1 of a + a ~ b) span.target {
background-color:rgb(1,2,3);
}
b:nth-child(n+1 of a + a ~ b) span.target {
color:rgb(1,2,3);
}
:nth-child(n+1 of c + c + c ~ d) span.target {
background-color:rgb(4,5,6);
}
c + c + c + d:nth-child(n+1 of c + c + c ~ d) span.target {
color:rgb(4,5,6);
}
f:nth-child(n+1 of e + e ~ f) ~ g span.target {
background-color:rgb(7,8,9);
}
e + f:nth-child(n+1 of e + e ~ f) ~ g span.target {
color:rgb(7,8,9);
}
span.target:nth-child(n+1 of h + h ~ span.target) {
background-color:rgb(10,11,12);
}
h + span.target:nth-child(n+1 of h + h ~ span.target) {
color:rgb(10,11,12);
}
j:nth-child(n+2 of j+j+j)~j>k span.target {
background-color:rgb(13,14,15);
}
j+j+j:nth-child(n+2 of j+j+j)~j>k span.target {
color:rgb(13,14,15);
}
m l:nth-child(n+2 of l+l+l+l)~m>m>m span.target {
background-color:rgb(16,17,18);
}
m l+l+l+l:nth-child(n+2 of l+l+l+l)~m>m>m span.target {
color:rgb(16,17,18);
}
n o:nth-child(n+2 of o)~n>n>n span.target {
background-color:rgb(19,20,21);
}
p:nth-child(n+2 of p) ~ span.target {
background-color:rgb(22,23,24);
}
q:nth-child(n+2 of q) ~ r span.target {
background-color:rgb(25,26,27);
}
s s:nth-child(n+1 of t+t+t+s)>s>s span.target {
background-color:rgb(28,29,30);
}
s t+t+t+s:nth-child(n+1 of t+t+t+s)>s>s span.target {
color:rgb(28,29,30);
}
</style>
</head>
<body>
<div style="display:none">
<!-- a + b span.target -->
<target1>
<a></a>
<a></a>
<b>
<span class="target" id="target1"></span>
</b>
</target1>
<!-- a + b span.target -->
<target2>
<a></a>
<a></a>
<b>
<b></b> <!-- Fail here and restart backtracking. -->
<b>
<span class="target" id="target2.1"></span>
</b>
</b>
</target2>
<!-- a + b span.target -->
<target2>
<a></a>
<a></a>
<b>
<b></b> <!-- Fail here and restart backtracking. -->
<b>
<b></b> <!-- Fail here and restart backtracking. -->
<a></a>
<b>
<span class="target" id="target2.2"></span>
</b>
</b>
</b>
</target2>
<!-- c + c + c + d span.target -->
<target3>
<c></c>
<c></c>
<c></c>
<d>
<b></b> <!-- Fail here and restart backtracking with the parent of the current element. -->
<c></c>
<c></c>
<d>
<c></c>
<b></b> <!-- Fail here and restart backtracking with the parent of the current element. -->
<d>
<b></b> <!-- Fail here and restart backtracking with the parent of the current element. -->
<c></c>
<d>
<span class="target" id="target3"></span>
</d>
</d>
</d>
</d>
</target3>
<!-- e + f ~ g span.target -->
<target4>
<e></e>
<e></e>
<f></f>
<d></d>
<e></e> <!-- Fail here and restart backtracking indirect adjacent matching. -->
<f></f>
<d></d>
<d></d>
<g>
<d></d> <!-- Fail here and restart backtracking indirect adjacent matching. -->
<f></f>
<g>
<span class="target" id="target4"></span>
</g>
</g>
</target4>
<!-- h + span.target -->
<target6>
<h></h>
<h></h>
<span class="target" id="target6.1"></span>
</target6>
<!-- h + span.target -->
<target6>
<h></h>
<a></a>
<span class="target" id="target6.2"></span>
</target6>
<!-- h + span.target -->
<target6>
<a></a>
<h></h>
<span class="target" id="target6.3"></span>
</target6>
<!-- h + span.target -->
<target6>
<span class="target" id="target6.4"></span>
</target6>
<!-- j+j+j~j>k span.target -->
<target7>
<d></d> <!-- Fail here. -->
<j></j>
<j></j>
<j></j>
<k>
<span class="target" id="target7"></span>
</k>
</target7>
<!-- j+j+j~j>k span.target -->
<target8>
<j></j> <!-- Match j+j+j:nth-child(n+2 of j+j+j)~j>k. -->
<j></j>
<j></j>
<j></j>
<d></d> <!-- Fail here. -->
<j></j> <!-- Match j:nth-child(n+2 of j+j+j)~j>k here, fail j+j+j:nth-child(n+2 of j+j+j)~j>k. -->
<j></j>
<j></j>
<d></d> <!-- Fail here. -->
<j></j>
<j></j>
<d></d> <!-- Fail here. -->
<j></j>
<j>
<k>
<span class="target" id="target8"></span>
</k>
</j>
</target8>
<!-- m l+l+l+l~m>m>m span.target -->
<target9>
<m>
<l></l> <!-- Fail here -->
<l></l>
<l></l>
<l></l>
<m>
<l></l> <!-- Fail here -->
<l></l>
<l></l>
<m>
<a></a> <!-- Fail here and backtrack with the tail -->
<l></l>
<l></l>
<a></a> <!-- Fail here -->
<l></l>
<m>
<m>
<m>
<span class="target" id="target9"></span>
</m>
</m>
</m>
</m>
</m>
</m>
</target9>
<!-- m l+l+l+l~m>m>m span.target -->
<target10>
<m>
<l></l> <!-- Match here -->
<l></l>
<l></l>
<l></l>
<l></l>
<m>
<l></l> <!-- Fail here -->
<l></l>
<l></l>
<l></l>
<m>
<a></a> <!-- Fail here and backtrack with the tail -->
<l></l>
<l></l>
<a></a> <!-- Fail here -->
<l></l>
<m>
<m>
<m>
<span class="target" id="target10"></span>
</m>
</m>
</m>
</m>
</m>
</m>
</target10>
<!-- n o~n>n>n span.target -->
<target11>
<n>
<n>
<a></a> <!-- Fail here -->
<o></o>
<a></a> <!-- Fail here -->
<n>
<a></a> <!-- Fail here and backtrack with the tail -->
<a></a> <!-- Fail here -->
<n>
<n>
<n>
<span class="target" id="target11"></span>
</n>
</n>
</n>
</n>
</n>
</n>
</target11>
<!-- n o~n>n>n span.target -->
<target12>
<n>
<o></o> <!-- Match here -->
<o></o>
<a></a> <!-- Fail here -->
<o></o>
<a></a> <!-- Fail here -->
<n>
<a></a> <!-- Fail here and backtrack with the tail -->
<a></a> <!-- Fail here -->
<n>
<n>
<n>
<span class="target" id="target12"></span>
</n>
</n>
</n>
</n>
</n>
</target12>
<!-- p:nth-child(n+2 of p) ~ span.target -->
<target13>
<p></p> <!-- Match here -->
<p></p>
<span class="target" id="target13.1"></span>
</target13>
<!-- p ~ span.target -->
<target13>
<a></a> <!-- Fail here -->
<p></p>
<span class="target" id="target13.2"></span>
</target13>
<!-- p ~ span.target -->
<target13>
<!-- Fail here -->
<span class="target" id="target13.3"></span>
</target13>
<!-- p ~ span.target -->
<target13>
<a></a> <!-- Fail here -->
<span class="target" id="target13.4"></span>
</target13>
<!-- q ~ r span.target -->
<target14>
<q></q> <!-- Match here -->
<q></q>
<a></a>
<r>
<a></a> <!-- Fail here -->
<r>
<span class="target" id="target14.1"></span>
</r>
</r>
</target14>
<!-- q ~ r span.target -->
<target14>
<!-- Fail here -->
<r>
<a></a> <!-- Fail here -->
<r>
<span class="target" id="target14.2"></span>
</r>
</r>
</target14>
<!-- q ~ r span.target -->
<target14>
<!-- Fail here -->
<r>
<!-- Fail here -->
<r>
<span class="target" id="target14.3"></span>
</r>
</r>
</target14>
<!-- q ~ r span.target -->
<target14>
<q></q> <!-- Match here -->
<a></a>
<r>
<a></a> <!-- Fail here -->
<r>
<span class="target" id="target14.4"></span>
</r>
</r>
</target14>
<!-- s t+t+t+s>s>s span.target -->
<target15>
<s>
<!-- Fail here and backtrack with the tail -->
<t></t>
<t></t>
<s>
<a></a> <!-- Fail here and backtrack with the tail -->
<t></t>
<t></t>
<s>
<s>
<s>
<span class="target" id="target15"></span>
</s>
</s>
</s>
</s>
</s>
</target15>
<!-- s t+t+t+s>s>s span.target -->
<target16>
<s>
<t></t> <!-- Match here -->
<t></t>
<t></t>
<s>
<!-- Fail here and backtrack with the tail -->
<t></t>
<t></t>
<s>
<a></a> <!-- Fail here and backtrack with the tail -->
<t></t>
<t></t>
<s>
<s>
<s>
<span class="target" id="target16"></span>
</s>
</s>
</s>
</s>
</s>
</s>
</target16>
</div>
</body>
<script>
description('The backtracking from adjacent combinators combined with :nth-child(An+B of selector)');
debug("Backtracking without tail, succeeded without backtracking");
shouldBeEqualToString('getComputedStyle(document.getElementById("target1")).backgroundColor', 'rgb(1, 2, 3)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target1")).color', 'rgb(1, 2, 3)');
debug("Backtracking without tail without indirect adjacent, failed and restart.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target2.1")).backgroundColor', 'rgb(1, 2, 3)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target2.1")).color', 'rgb(1, 2, 3)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target2.2")).backgroundColor', 'rgb(1, 2, 3)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target2.2")).color', 'rgb(1, 2, 3)');
debug("Backtracking without tail, 3 direct adjacents without indirect adjacent, failed and restart backtracking.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target3")).backgroundColor', 'rgb(4, 5, 6)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target3")).color', 'rgb(4, 5, 6)');
debug("Backtracking without tail, indirect adjacent.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target4")).backgroundColor', 'rgb(7, 8, 9)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target4")).color', 'rgb(7, 8, 9)');
debug("Backtracking from direct adjacent without tail. Matches.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target6.1")).backgroundColor', 'rgb(10, 11, 12)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target6.1")).color', 'rgb(10, 11, 12)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target6.2")).backgroundColor', 'rgb(0, 0, 0)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target6.2")).color', 'rgb(0, 0, 0)');
debug("Backtracking from direct adjacent tag matching without tail. Fails.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target6.3")).backgroundColor', 'rgb(0, 0, 0)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target6.3")).color', 'rgb(0, 0, 0)');
debug("Backtracking from direct adjacent traversal without tail. Fails.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target6.4")).backgroundColor', 'rgb(0, 0, 0)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target6.4")).color', 'rgb(0, 0, 0)');
debug("Backtracking without tail. And fails.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target7")).backgroundColor', 'rgb(0, 0, 0)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target7")).color', 'rgb(0, 0, 0)');
debug("Backtracking without tail. And Matches.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target8")).backgroundColor', 'rgb(13, 14, 15)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target8")).color', 'rgb(13, 14, 15)');
debug("Backtracking from direct adjacent with tail. And fails.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target9")).backgroundColor', 'rgb(0, 0, 0)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target9")).color', 'rgb(0, 0, 0)');
debug("Backtracking from direct adjacent with tail. And Matches.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target10")).backgroundColor', 'rgb(16, 17, 18)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target10")).color', 'rgb(16, 17, 18)');
debug("Backtracking from indirect adjacent with tail. And fails.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target11")).backgroundColor', 'rgb(0, 0, 0)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target11")).color', 'rgb(0, 0, 0)');
debug("Backtracking from indirect adjacent with tail. And Matches.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target12")).backgroundColor', 'rgb(19, 20, 21)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target12")).color', 'rgb(0, 0, 0)');
debug("Backtracking from indirect adjacent without tail. Matches.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target13.1")).backgroundColor', 'rgb(22, 23, 24)');
debug("Backtracking from indirect adjacent tag matching without tail. Fails.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target13.2")).backgroundColor', 'rgb(0, 0, 0)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target13.3")).backgroundColor', 'rgb(0, 0, 0)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target13.4")).backgroundColor', 'rgb(0, 0, 0)');
debug("Backtracking from indirect adjacent without tail. Matches.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target14.1")).backgroundColor', 'rgb(25, 26, 27)');
debug("Backtracking from indirect adjacent tag matching without tail. Fails.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target14.2")).backgroundColor', 'rgb(0, 0, 0)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target14.3")).backgroundColor', 'rgb(0, 0, 0)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target14.4")).backgroundColor', 'rgb(0, 0, 0)');
debug("Backtracking from direct adjacent with tail. And fails.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target15")).backgroundColor', 'rgb(0, 0, 0)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target15")).color', 'rgb(0, 0, 0)');
debug("Backtracking from direct adjacent with tail. And Matches.");
shouldBeEqualToString('getComputedStyle(document.getElementById("target16")).backgroundColor', 'rgb(28, 29, 30)');
shouldBeEqualToString('getComputedStyle(document.getElementById("target16")).color', 'rgb(28, 29, 30)');
</script>
<script src="../../resources/js-test-post.js"></script>
</html>