1 |
#!/usr/bin/perl |
2 |
use strict; |
3 |
|
4 |
my @create_target; |
5 |
for my $uri ( |
6 |
[null => 'null'], |
7 |
[absuri => '"http://test/"'], |
8 |
[xmluri => '"http://www.w3.org/XML/1998/namespace"'], |
9 |
[xmlnsuri => '"http://www.w3.org/2000/xmlns/"'], |
10 |
) { |
11 |
for my $prefix ( |
12 |
[null => '"localName"', 'null', '"localName"'], |
13 |
[xml10ncname => '"originalPrefix:localName"', |
14 |
'"originalPrefix"', '"localName"'], |
15 |
[xml => '"xml:lang"', '"xml"', '"lang"'], |
16 |
[xmlns => '"xmlns"', 'null', '"xmlns"'], |
17 |
[xmlnsprefix => '"xmlns:declaredPrefix"', '"xmlns"', '"declaredPrefix"'], |
18 |
) { |
19 |
push @create_target, ['Attr', $uri->[0], $prefix->[0], qq[ |
20 |
var el; |
21 |
try { |
22 |
el = document.createAttributeNS ($uri->[1], $prefix->[1]); |
23 |
} catch (e) { } |
24 |
if (!el) { |
25 |
try { |
26 |
el = document.createAttributeNS ($uri->[1], $prefix->[3]); |
27 |
el.prefix = $prefix->[2]; |
28 |
} catch (e) { } |
29 |
} |
30 |
var ok = (el && el.prefix == $prefix->[2] && |
31 |
el.namespaceURI == $uri->[1]); |
32 |
]]; |
33 |
push @create_target, ['Element', $uri->[0], $prefix->[0], qq[ |
34 |
var el; |
35 |
try { |
36 |
el = document.createAttributeNS ($uri->[1], $prefix->[1]); |
37 |
} catch (e) { } |
38 |
if (!el) { |
39 |
try { |
40 |
el = document.createAttributeNS ($uri->[1], $prefix->[3]); |
41 |
el.prefix = $prefix->[2]; |
42 |
} catch (e) { } |
43 |
} |
44 |
var ok = (el && el.prefix == $prefix->[2] && |
45 |
el.namespaceURI == $uri->[1]); |
46 |
]]; |
47 |
} |
48 |
} |
49 |
|
50 |
my @set_value = ( |
51 |
['null', 'null'], |
52 |
['undefined', 'undefined'], |
53 |
['empty', '""'], |
54 |
['nonxmlname', '"12345"'], |
55 |
['xml10name', '"new:Prefix"'], |
56 |
['xml10ncname', '"newPrefix"'], |
57 |
['xml', '"xml"'], |
58 |
['xmlns', '"xmlns"'], |
59 |
); |
60 |
|
61 |
my $table = q[<tbody>]; |
62 |
my @items; |
63 |
for my $create_target (@create_target) { |
64 |
$table .= qq[<tr><th scope="row">$create_target->[0]</th> |
65 |
<th scope="row">$create_target->[1]</th> |
66 |
<th scope="row">$create_target->[2]</th>]; |
67 |
for my $set_value (@set_value) { |
68 |
my $file_name = lc ($create_target->[0]) . '-' . $create_target->[1] . |
69 |
'-' . $create_target->[2] . '-' . $set_value->[0]; |
70 |
warn $file_name, "\n"; |
71 |
$table .= qq[<td><a href="$file_name.xhtml" id="$file_name" class="FAIL" |
72 |
title="@{[ ($create_target->[1] eq 'xmlnsuri' and |
73 |
$create_target->[2] !~ 'xmlns') ? 'noopera' : '' ]}">FAIL (not executed)</a></td>]; |
74 |
push @items, $file_name; |
75 |
my $file_content = qq[<head> |
76 |
<title>$create_target->[0].prefix = $set_value->[0]</title> |
77 |
</head><body> |
78 |
<p id="result" class="FAIL">FAIL (not executed)</p> |
79 |
<script type="text/javascript">// <![CDATA[ |
80 |
var result = document.getElementById ('result'); |
81 |
result.firstChild.data = 'FAIL (script error)'; |
82 |
$create_target->[3] |
83 |
if (ok) { |
84 |
try { |
85 |
el.prefix = $set_value->[1]; |
86 |
result.className = ''; |
87 |
result.firstChild.data = el.prefix + ', type ' + typeof (el.prefix); |
88 |
} catch (e) { |
89 |
result.className = ''; |
90 |
result.firstChild.data = e.toString (); |
91 |
} |
92 |
} else { |
93 |
result.className = 'NA'; |
94 |
result.firstChild.data = 'N/A'; |
95 |
} |
96 |
// ]]></script> |
97 |
</body></html> |
98 |
]; |
99 |
open my $file, '>', "$file_name.html" or die "$0: $file_name.html: $!"; |
100 |
print $file "<!DOCTYPE html><html>$file_content"; |
101 |
open $file, '>', "$file_name.xhtml" or die "$0: $file_name.xhtml: $!"; |
102 |
print $file qq'<html xmlns="http://www.w3.org/1999/xhtml">$file_content'; |
103 |
} |
104 |
$table .= q[</tr>]; |
105 |
} |
106 |
$table .= q[</tbody>]; |
107 |
|
108 |
for my $type ( |
109 |
['.html' => '<!DOCTYPE html><html>'], |
110 |
['.xhtml' => '<html xmlns="http://www.w3.org/1999/xhtml">'], |
111 |
) { |
112 |
my $table = $table; |
113 |
$table =~ s/\.xhtml\b/$type->[0]/g; |
114 |
open my $file, '>', "set-prefix-list$type->[0]" |
115 |
or die "$0: set-prefix-list$type->[0]: $!"; |
116 |
print $file qq[$type->[1] |
117 |
<head> |
118 |
<title>prefix Attribute Test Result</title> |
119 |
<style type="text/css"> |
120 |
a { |
121 |
color: blue; |
122 |
} |
123 |
a.NA { |
124 |
color: gray; |
125 |
} |
126 |
a.FAIL { |
127 |
color: red; |
128 |
} |
129 |
</style> |
130 |
</head> |
131 |
<body> |
132 |
<table> |
133 |
<thead> |
134 |
<tr> |
135 |
<th scope="col" colspan="3">Original</th> |
136 |
@{[ map { qq[<th scope="col">$_->[0]</th>] } @set_value ]} |
137 |
</tr> |
138 |
<tr> |
139 |
<th scope="col"><var>Node</var></th> |
140 |
<th scope="col"><code>namespaceURI</code></th> |
141 |
<th scope="col"><code>prefix</code></th> |
142 |
</tr> |
143 |
</thead> |
144 |
$table |
145 |
</table> |
146 |
<p><iframe></iframe></p> |
147 |
<script type="text/javascript">// <![CDATA[ |
148 |
window.testItems = ["@{[ join '", "', @items ]}"]; |
149 |
window.currentItem = window.testItems.pop (); |
150 |
var iframe = document.getElementsByTagName ('iframe')[0]; |
151 |
iframe.onload = function () { |
152 |
try { |
153 |
var result = this.contentWindow.document.getElementById ('result'); |
154 |
var resultCell = document.getElementById (window.currentItem); |
155 |
resultCell.className = result.className; |
156 |
resultCell.firstChild.data = result.firstChild.data; |
157 |
} catch (e) { } |
158 |
while (testItems.length > 0) { |
159 |
window.currentItem = window.testItems.pop (); |
160 |
var resultCell = document.getElementById (window.currentItem); |
161 |
if (window.opera && resultCell.title == 'noopera') { |
162 |
/* Don't test since Opera dies with create*NS |
163 |
<http://suika.fam.cx/gate/2005/sw/createAttributeNS> */ |
164 |
resultCell.className = 'NA'; |
165 |
resultCell.firstChild.data = 'N/A (skipped)'; |
166 |
} else { |
167 |
this.src = window.currentItem + "$type->[0]"; |
168 |
return; |
169 |
} |
170 |
} |
171 |
this.onload = null; |
172 |
this.style.display = 'none'; |
173 |
}; |
174 |
iframe.src = window.currentItem + "$type->[0]"; |
175 |
// ]]></script> |
176 |
</body> |
177 |
</html>]; |
178 |
} |