1 <html> 2 <head> 3 <title>XPath Test</title> 4 <script> 5 if (window.layoutTestController) 6 layoutTestController.dumpAsText(); 7 8 function test(expression, expect) { 9 function error(message) { 10 var e = Error(); 11 e.result = result; 12 e.expects = expects; 13 e.expression = expression; 14 e.message = message; 15 return e 16 }; 17 var result = document.evaluate(expression, document.body, null, 7, null); 18 var expects = expect.split(/\s+/); 19 for (var i = 0, l = expects.length; i < l; i++) if (expects[i] == '') expects.splice(i, 1); 20 if (result.snapshotLength != expects.length) throw error(); 21 for (var i = 0, l = expects.length; i < l; i++) { 22 var expect = expects[i]; 23 var r = expect.match(/^(?:([atpc]):)?(.*)$/); 24 var node = result.snapshotItem(i); 25 if (!types[r[1] || ''](node, r[2])) throw error(); 26 } 27 return true; 28 }; 29 window.onload = function() { 30 var ul = document.createElement('ul'); 31 for (var i = 0, l = data.length; i < l; i ++) { 32 var li = document.createElement('li'); 33 try { 34 test.apply(null, data[i]); 35 li.appendChild(document.createTextNode('[ok]' + data[i][0])); 36 li.className = 'ok'; 37 li.style.color = 'green'; 38 } 39 catch (e) { 40 li.appendChild(document.createTextNode('[ng]' + data[i][0])); 41 li.className = 'ng'; 42 li.style.color = 'red'; 43 } 44 ul.appendChild(li); 45 } 46 document.body.insertBefore(ul, document.body.firstChild); 47 }; 48 var types = { 49 a: function(node, expect) { 50 var r = expect.split(':'); 51 return r[0] == node.nodeName && r[1] == node.nodeValue; 52 }, 53 t: function(node, expect) { 54 return expect == node.nodeValue; 55 }, 56 p: function(node, expect) { 57 return expect == node.nodeName; 58 }, 59 c: function(node, expect) { 60 return expect == node.nodeValue; 61 }, 62 '': function(node, expect) { 63 return expect.toLowerCase() == node.nodeName.toLowerCase(); 64 } 65 }; 66 var data = [ 67 ['.//blockquote/*', 'br p font'], 68 ['.//blockquote/child::*', 'br p font'], 69 ['.//blockquote/parent::*', 'center'], 70 ['.//blockquote/descendant::*', 'br p del ins font'], 71 ['.//blockquote/descendant-or-self::*', 'blockquote br p del ins font'], 72 ['.//blockquote/ancestor::*', 'html body div center'], 73 ['.//blockquote/ancestor-or-self::*', 'html body div center blockquote'], 74 ['.//blockquote/following-sibling::*', 'h3 h4'], 75 ['.//blockquote/preceding-sibling::*', 'h1 h2'], 76 ['.//blockquote/following::*', 'h3 dfn a h4 sub sup span abbr q'], 77 ['.//blockquote/preceding::*', 'head title script dl dt dd h1 em strong h2 b s'], 78 ['.//blockquote/self::*', 'blockquote'], 79 ['.//blockquote/attribute::id/parent::*', 'blockquote'], 80 ['.//blockquote/@id/parent::*', 'blockquote'], 81 82 83 ['.//*[blockquote]', 'center'], 84 ['.//*[child::blockquote]', 'center'], 85 ['.//*[parent::blockquote]', 'br p font'], 86 ['.//*[descendant::blockquote]', 'div center'], 87 ['.//*[descendant-or-self::blockquote]', 'div center blockquote'], 88 ['.//*[ancestor::blockquote]', 'br p del ins font'], 89 ['.//*[ancestor-or-self::blockquote]', 'blockquote br p del ins font'], 90 ['.//*[following-sibling::blockquote]', 'h1 h2'], 91 ['.//*[preceding-sibling::blockquote]', 'h3 h4'], 92 ['.//*[following::blockquote]', 'dl dt dd h1 em strong h2 b s'], 93 ['.//*[preceding::blockquote]', 'h3 dfn a h4 sub sup span abbr q'], 94 ['.//*[self::blockquote]', 'blockquote'], 95 ['.//*[@id]', 'div dl dt dd center h1 em strong h2 b s blockquote br p del ins font h3 dfn a h4 sub sup span abbr q'], 96 ['.//*[attribute::id]', 'div dl dt dd center h1 em strong h2 b s blockquote br p del ins font h3 dfn a h4 sub sup span abbr q'], 97 98 99 ['.//blockquote/text()', 't:blockquoteText1: t:blockquoteText2'], 100 ['.//blockquote/comment()', 'c:blockquoteComment'], 101 ['.//blockquote/processing-instruction()', 'p:pi'], 102 ['.//blockquote/processing-instruction("pi")', 'p:pi'], 103 ['.//blockquote/node()', 'c:blockquoteComment t:blockquoteText1: br t:blockquoteText2 p p:pi font'], 104 ['.//blockquote/p', 'p'], 105 ['.//blockquote/*', 'br p font'], 106 107 108 ['.//*[child::* and preceding::font]', 'h3 h4 span'], 109 ['.//*[not(child::*) and preceding::font]', 'dfn a sub sup abbr q'], 110 ['.//*[preceding::blockquote or following::blockquote]', 111 'dl dt dd h1 em strong h2 b s h3 dfn a h4 sub sup span abbr q'], 112 ['.//blockquote/ancestor::* | .//blockquote/descendant::*', 'html body div center br p del ins font'], 113 ['.//*[.="sub"]', 'sub'], 114 ['.//*[@title > 12 and @class < 15]', 'br p del ins font'], 115 ['.//*[@title != @class]', 116 'div dl dt dd center em strong b s blockquote br p del ins font dfn a sub sup span abbr q'], 117 ['.//*[((@class * @class + @title * @title) div (@class + @title)) > ((@class - @title) * (@class - @title))]', 118 'dl h1 h2 s blockquote br p font h3 dfn a h4 sub sup span abbr q'], 119 ['.//*[@title mod 2 = 0]', 'dl dd h1 strong b blockquote p ins h3 a sub span q'], 120 121 122 ['.//blockquote/child::*[last()]', 'font'], 123 ['.//blockquote/descendant::*[position() < 4]', 'br p del'], 124 ['id(.//font/@face)', 'strong q'], 125 ['.//*[name(.) = "sub"]', 'sub'], 126 ['.//*[name() = "sub"]', 'sub'], 127 128 129 ['.//blockquote/child::*[2]', 'p'], 130 ['.//blockquote/descendant::*[4]', 'ins'], 131 ['.//blockquote/descendant-or-self::*[4]', 'del'], 132 ['.//blockquote/ancestor::*[2]', 'div'], 133 ['.//blockquote/ancestor-or-self::*[2]', 'center'], 134 ['.//blockquote/following-sibling::*[1]', 'h3'], 135 ['.//blockquote/preceding-sibling::*[1]', 'h2'], 136 ['.//blockquote/following::*[4]', 'h4'], 137 ['.//blockquote/preceding::*[4]', 'strong'], 138 139 140 ['.//*[starts-with(.,"s")]', 'strong s h4 sub sup'], 141 ['.//*[string(@title - 1) = "0"]', 'div'], 142 ['.//*[string() = "sub"]', 'sub'], 143 ['.//*[string(.) = "sub"]', 'sub'], 144 ['.//*[concat(.,..) = "subsubsup"]', 'sub'], 145 ['.//node()[concat(.,..,../..) = "bbbs"]', 't:b'], 146 ['.//*[starts-with(.,"s")]', 'strong s h4 sub sup'], 147 ['.//*[substring-before(.,"u") = "s"]', 'h4 sub sup'], 148 ['.//*[substring-after(.,"on") = "t"]', 'blockquote font'], 149 ['.//*[substring(.,2,1) = "u"]', 'h4 sub sup'], 150 ['.//*[substring(.,2) = "up"]', 'sup'], 151 ['.//*[contains(.,"b")]', 'div center h2 b blockquote h4 sub span abbr'], 152 ['.//*[string-length() = 3]', 'del ins dfn sub sup'], 153 ['.//*[string-length(.) = 3]', 'del ins dfn sub sup'], 154 ['.//*[.=translate(normalize-space(" s u b ")," ","")]', 'sub'], 155 ['.//*[normalize-space()="q"]', 'q'], 156 157 158 ['.//*[boolean(@title - 1) = false()]', 'div'], 159 ['.//*[not(@title - 1) = true()]', 'div'], 160 ['.//*[lang("it")]', 'q'], 161 162 163 ['.//*[number(@title) < number(@class)]', 'div dl center blockquote span'], 164 ['.//*[sum(ancestor::*/@title) < sum(descendant::*/@title)]', 165 'div dl center h1 h2 blockquote p h3 h4 span'], 166 ['.//*[floor(@title div @class) = 1]', 167 'h1 em strong h2 b s br p del ins font h3 dfn a h4 sub sup abbr q'], 168 ['.//*[ceiling(@title div @class) = 1]', 'div dl center h1 h2 blockquote h3 h4 span'], 169 ['.//*[round(@title div @class) = 1]', 170 'dl h1 h2 b s blockquote br p del ins font h3 dfn a h4 sub sup span abbr q'], 171 172 173 ['.//*[blockquote]', 'center'] 174 ]; 175 </script> 176 </head> 177 <body><div id="n1" title="1" class="26" xml:lang="en"><dl id="n2" title="2" class="3"><dt id="n3" title="3" class="1">dt</dt><dd id="n4" title="4" class="2">dd</dd></dl><center id="n5" title="5" class="22"><h1 id="n6" title="6" class="6"><em id="n7" title="7" class="4">em</em><strong id="n8" title="8" class="5">strong</strong></h1><h2 id="n9" title="9" class="9"><b id="n10" title="10" class="7">b</b><s id="n11" title="11" class="8">s</s></h2><blockquote id="n12" title="12" class="15"><!--blockquoteComment-->blockquoteText1:<br id="n13" title="13" class="10"/>blockquoteText2<p id="n14" title="14" class="13"><del id="n15" title="15" class="11">del</del><ins id="n16" title="16" class="12">ins</ins></p><?pi name="value"?><font id="n17" title="17" class="14" face="n8 n26">font</font></blockquote><h3 id="n18" title="18" class="18"><dfn id="n19" title="19" class="16">dfn</dfn><a id="n20" title="20" class="17">a</a></h3><h4 id="n21" title="21" class="21"><sub id="n22" title="22" class="19">sub</sub><sup id="n23" title="23" class="20">sup</sup></h4></center><span id="n24" title="24" class="25"><abbr id="n25" title="25" class="23">abbr</abbr><q id="n26" title="26" class="24" cite="n8 n17" xml:lang="it">q</q></span></div></body> 178 </html> 179