2 // The xml serializer uses the default line break of the plateform.
3 // So we need to know the value of this default line break, in order
4 // to build correctly the reference strings for tests.
5 // This variable will contain this value.
10 if(("@mozilla.org/windows-registry-key;1" in C) || ("nsILocalFileOS2" in I))
15 for (var i = 0; i < tests.length && tests[i]; ++i) {
34 function testString(str) {
35 do_check_eq(roundtrip(str), str);
39 // Basic round-tripping which we expect to hand back the same text
40 // as we passed in (not strictly required for correctness in some of
41 // those cases, but best for readability of serializer output)
42 testString('<root/>');
43 testString('<root><child/></root>');
44 testString('<root xmlns=""/>');
45 testString('<root xml:lang="en"/>');
46 testString('<root xmlns="ns1"><child xmlns="ns2"/></root>')
47 testString('<root xmlns="ns1"><child xmlns=""/></root>')
48 testString('<a:root xmlns:a="ns1"><child/></a:root>')
49 testString('<a:root xmlns:a="ns1"><a:child/></a:root>')
50 testString('<a:root xmlns:a="ns1"><b:child xmlns:b="ns1"/></a:root>')
51 testString('<a:root xmlns:a="ns1"><a:child xmlns:a="ns2"/></a:root>')
52 testString('<a:root xmlns:a="ns1"><b:child xmlns:b="ns1" b:attr=""/></a:root>')
56 // Test setting of "xmlns" attribute in the null namespace
58 // XXXbz are these tests needed? What should happen here? These
61 // Setting random "xmlns" attribute
62 var doc = ParseXML('<root xmlns="ns1"/>');
63 doc.documentElement.setAttribute("xmlns", "ns2");
64 do_check_serialize(doc);
68 // Test basic appending of kids. Again, we're making assumptions
69 // about how our serializer will serialize simple DOMs.
70 var doc = ParseXML('<root xmlns="ns1"/>');
71 var root = doc.documentElement;
72 var child = doc.createElementNS("ns2", "child");
73 root.appendChild(child);
74 do_check_serialize(doc);
75 do_check_eq(SerializeXML(doc),
76 '<root xmlns="ns1"><child xmlns="ns2"/></root>');
78 doc = ParseXML('<root xmlns="ns1"/>');
79 root = doc.documentElement;
80 child = doc.createElementNS("ns2", "prefix:child");
81 root.appendChild(child);
82 do_check_serialize(doc);
83 do_check_eq(SerializeXML(doc),
84 '<root xmlns="ns1"><prefix:child xmlns:prefix="ns2"/></root>');
86 doc = ParseXML('<prefix:root xmlns:prefix="ns1"/>');
87 root = doc.documentElement;
88 child = doc.createElementNS("ns2", "prefix:child");
89 root.appendChild(child);
90 do_check_serialize(doc);
91 do_check_eq(SerializeXML(doc),
92 '<prefix:root xmlns:prefix="ns1"><a0:child xmlns:a0="ns2"/>'+
98 // setAttributeNS tests
100 var doc = ParseXML('<root xmlns="ns1"/>');
101 var root = doc.documentElement;
102 root.setAttributeNS("ns1", "prefix:local", "val");
103 do_check_serialize(doc);
104 do_check_eq(SerializeXML(doc),
105 '<root xmlns="ns1" prefix:local="val" xmlns:prefix="ns1"/>');
107 doc = ParseXML('<prefix:root xmlns:prefix="ns1"/>');
108 root = doc.documentElement;
109 root.setAttributeNS("ns1", "local", "val");
110 do_check_serialize(doc);
111 do_check_eq(SerializeXML(doc),
112 '<prefix:root xmlns:prefix="ns1" prefix:local="val"/>');
114 doc = ParseXML('<root xmlns="ns1"/>');
115 root = doc.documentElement;
116 root.setAttributeNS("ns2", "local", "val");
117 do_check_serialize(doc);
118 do_check_eq(SerializeXML(doc),
119 '<root xmlns="ns1" a0:local="val" xmlns:a0="ns2"/>');
121 // Handling of prefix-generation for non-null-namespace attributes
122 // which have the same namespace as the current default namespace
124 doc = ParseXML('<root xmlns="ns1"/>');
125 root = doc.documentElement;
126 root.setAttributeNS("ns1", "local", "val");
127 do_check_serialize(doc);
128 do_check_eq(SerializeXML(doc),
129 '<root xmlns="ns1" a0:local="val" xmlns:a0="ns1"/>');
132 doc = ParseXML('<root xmlns="ns1" xmlns:a="ns2">'+
133 '<child xmlns:b="ns2" xmlns:a="ns3">'+
134 '<child2/></child></root>');
135 root = doc.documentElement;
136 // Have to QI here -- no classinfo flattening in xpcshell, apparently
137 var node = root.firstChild.firstChild.QueryInterface(nsIDOMElement);
138 node.setAttributeNS("ns4", "l1", "v1");
139 node.setAttributeNS("ns4", "p2:l2", "v2");
140 node.setAttributeNS("", "l3", "v3");
141 node.setAttributeNS("ns3", "l4", "v4");
142 node.setAttributeNS("ns3", "p5:l5", "v5");
143 node.setAttributeNS("ns3", "a:l6", "v6");
144 node.setAttributeNS("ns2", "l7", "v7");
145 node.setAttributeNS("ns2", "p8:l8", "v8");
146 node.setAttributeNS("ns2", "b:l9", "v9");
147 node.setAttributeNS("ns2", "a:l10", "v10");
148 node.setAttributeNS("ns1", "a:l11", "v11");
149 node.setAttributeNS("ns1", "b:l12", "v12");
150 node.setAttributeNS("ns1", "l13", "v13");
151 do_check_serialize(doc);
152 // Note: we end up with "a2" as the prefix on "l11" and "l12" because we use
153 // "a1" earlier, and discard it in favor of something we get off the
154 // namespace stack, apparently
155 do_check_eq(SerializeXML(doc),
156 '<root xmlns="ns1" xmlns:a="ns2">'+
157 '<child xmlns:b="ns2" xmlns:a="ns3">'+
158 '<child2 a0:l1="v1" xmlns:a0="ns4"' +
168 ' a2:l11="v11" xmlns:a2="ns1"' +
170 ' a2:l13="v13"/></child></root>');
174 // Handling of kids in the null namespace when the default is a
175 // different namespace (bug 301260).
176 var doc = ParseXML('<root xmlns="ns1"/>')
177 var child = doc.createElement('child');
178 doc.documentElement.appendChild(child);
179 do_check_serialize(doc);
180 do_check_eq(SerializeXML(doc),
181 '<root xmlns="ns1"><child xmlns=""/></root>');
185 // Handling of not using a namespace prefix (or default namespace!)
186 // that's not bound to our namespace in our scope (bug 301260).
187 var doc = ParseXML('<prefix:root xmlns:prefix="ns1"/>');
188 var root = doc.documentElement;
189 var child1 = doc.createElementNS("ns2", "prefix:child1");
190 var child2 = doc.createElementNS("ns1", "prefix:child2");
191 child1.appendChild(child2);
192 root.appendChild(child1);
193 do_check_serialize(doc);
194 do_check_eq(SerializeXML(doc),
195 '<prefix:root xmlns:prefix="ns1"><a0:child1 xmlns:a0="ns2">'+
196 '<prefix:child2/></a0:child1></prefix:root>');
198 doc = ParseXML('<root xmlns="ns1"><prefix:child1 xmlns:prefix="ns2"/></root>');
199 root = doc.documentElement;
200 child1 = root.firstChild;
201 child2 = doc.createElementNS("ns1", "prefix:child2");
202 child1.appendChild(child2);
203 do_check_serialize(doc);
204 do_check_eq(SerializeXML(doc),
205 '<root xmlns="ns1"><prefix:child1 xmlns:prefix="ns2">'+
206 '<child2/></prefix:child1></root>');
208 doc = ParseXML('<prefix:root xmlns:prefix="ns1">'+
209 '<prefix:child1 xmlns:prefix="ns2"/></prefix:root>');
210 root = doc.documentElement;
211 child1 = root.firstChild;
212 child2 = doc.createElementNS("ns1", "prefix:child2");
213 child1.appendChild(child2);
214 do_check_serialize(doc);
215 do_check_eq(SerializeXML(doc),
216 '<prefix:root xmlns:prefix="ns1"><prefix:child1 xmlns:prefix="ns2">'+
217 '<a0:child2 xmlns:a0="ns1"/></prefix:child1></prefix:root>');
220 doc = ParseXML('<root xmlns="ns1"/>');
221 root = doc.documentElement;
222 child1 = doc.createElementNS("ns2", "child1");
223 child2 = doc.createElementNS("ns1", "child2");
224 child1.appendChild(child2);
225 root.appendChild(child1);
226 do_check_serialize(doc);
227 do_check_eq(SerializeXML(doc),
228 '<root xmlns="ns1"><child1 xmlns="ns2"><child2 xmlns="ns1"/>'+
233 // Handle xmlns attribute declaring a default namespace on a non-namespaced
234 // element (bug 326994).
235 var doc = ParseXML('<root xmlns=""/>')
236 var root = doc.documentElement;
237 root.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns",
238 "http://www.w3.org/1999/xhtml");
239 do_check_serialize(doc);
240 do_check_eq(SerializeXML(doc), '<root/>');
242 doc = ParseXML('<root xmlns=""><child1/></root>')
243 root = doc.documentElement;
244 root.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns",
245 "http://www.w3.org/1999/xhtml");
246 do_check_serialize(doc);
247 do_check_eq(SerializeXML(doc), '<root><child1/></root>');
249 doc = ParseXML('<root xmlns="http://www.w3.org/1999/xhtml">' +
250 '<child1 xmlns=""><child2/></child1></root>')
251 root = doc.documentElement;
253 // No interface flattening in xpcshell
254 var child1 = root.firstChild.QueryInterface(nsIDOMElement);
255 child1.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns",
256 "http://www.w3.org/1999/xhtml");
257 do_check_serialize(doc);
258 do_check_eq(SerializeXML(doc),
259 '<root xmlns="http://www.w3.org/1999/xhtml"><child1 xmlns="">' +
260 '<child2/></child1></root>');
262 doc = ParseXML('<root xmlns="http://www.w3.org/1999/xhtml">' +
263 '<child1 xmlns="">' +
264 '<child2 xmlns="http://www.w3.org/1999/xhtml"></child2>' +
266 root = doc.documentElement;
267 // No interface flattening in xpcshell
268 child1 = root.firstChild.QueryInterface(nsIDOMElement);
269 var child2 = child1.firstChild.QueryInterface(nsIDOMElement);
270 child1.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns",
271 "http://www.w3.org/1999/xhtml");
272 child2.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "");
273 do_check_serialize(doc);
274 do_check_eq(SerializeXML(doc),
275 '<root xmlns="http://www.w3.org/1999/xhtml"><child1 xmlns="">' +
276 '<a0:child2 xmlns:a0="http://www.w3.org/1999/xhtml" xmlns=""></a0:child2></child1></root>');
280 // Test behavior of serializing with a given charset.
281 var str1 = '<?xml version="1.0" encoding="ISO-8859-1"?>'+LB+'<root/>';
282 var str2 = '<?xml version="1.0" encoding="UTF8"?>'+LB+'<root/>';
283 var doc1 = ParseXML(str1);
284 var doc2 = ParseXML(str2);
287 DOMSerializer().serializeToStream(doc1, p.outputStream, "ISO-8859-1");
288 p.outputStream.close();
289 do_check_eq(ScriptableInput(p).read(-1), str1);
292 DOMSerializer().serializeToStream(doc2, p.outputStream, "ISO-8859-1");
293 p.outputStream.close();
294 do_check_eq(ScriptableInput(p).read(-1), str1);
297 DOMSerializer().serializeToStream(doc1, p.outputStream, "UTF8");
298 p.outputStream.close();
299 do_check_eq(ScriptableInput(p).read(-1), str2);
302 DOMSerializer().serializeToStream(doc2, p.outputStream, "UTF8");
303 p.outputStream.close();
304 do_check_eq(ScriptableInput(p).read(-1), str2);
308 // Test behavior of serializing between given charsets, using
309 // ISO-8859-1-representable text.
310 var contents = '<root>' +
311 '\u00BD + \u00BE == \u00BD\u00B2 + \u00BC + \u00BE' +
313 var str1 = '<?xml version="1.0" encoding="ISO-8859-1"?>'+ LB + contents;
314 var str2 = '<?xml version="1.0" encoding="UTF8"?>'+ LB + contents;
315 var str3 = '<?xml version="1.0" encoding="UTF-16"?>'+ LB + contents;
316 var doc1 = ParseXML(str1);
317 var doc2 = ParseXML(str2);
318 var doc3 = ParseXML(str3);
320 checkSerialization(doc1, "ISO-8859-1", str1);
321 checkSerialization(doc2, "ISO-8859-1", str1);
322 checkSerialization(doc3, "ISO-8859-1", str1);
324 checkSerialization(doc1, "UTF8", str2);
325 checkSerialization(doc2, "UTF8", str2);
326 checkSerialization(doc3, "UTF8", str2);
328 checkSerialization(doc1, "UTF-16", str3);
329 checkSerialization(doc2, "UTF-16", str3);
330 checkSerialization(doc3, "UTF-16", str3);
334 // Test behavior of serializing between given charsets, using
335 // Unicode characters (XXX but only BMP ones because I don't know
336 // how to create one with non-BMP characters, either with JS strings
337 // or using DOM APIs).
338 var contents = '<root>' +
339 'AZaz09 \u007F ' + // U+000000 to U+00007F
340 '\u0080 \u0398 \u03BB \u0725 ' + // U+000080 to U+0007FF
341 '\u0964 \u0F5F \u20AC \uFFFB' + // U+000800 to U+00FFFF
343 var str1 = '<?xml version="1.0" encoding="UTF8"?>'+ LB + contents;
344 var str2 = '<?xml version="1.0" encoding="UTF-16"?>'+ LB + contents;
345 var doc1 = ParseXML(str1);
346 var doc2 = ParseXML(str2);
348 checkSerialization(doc1, "UTF8", str1);
349 checkSerialization(doc2, "UTF8", str1);
351 checkSerialization(doc1, "UTF-16", str2);
352 checkSerialization(doc2, "UTF-16", str2);
355 function checkSerialization(doc, toCharset, expectedString) {
357 DOMSerializer().serializeToStream(doc, p.outputStream, toCharset);
358 p.outputStream.close();
360 var cin = C["@mozilla.org/intl/converter-input-stream;1"]
361 .createInstance(I.nsIConverterInputStream);
362 cin.init(p.inputStream, toCharset, 1024, 0x0);
364 // compare the first expectedString.length characters for equality
366 var count = cin.readString(expectedString.length, outString);
367 do_check_true(count == expectedString.length);
368 do_check_true(outString.value == expectedString);
370 // if there's anything more in the stream, it's a bug
371 do_check_eq(0, cin.readString(1, outString));
372 do_check_eq(outString.value, "");