<!DOCTYPE HTML>
<meta charset=utf-8>
<html>
 <head>
  <title>domparsing Test: XMLSerializer.serializeToString</title>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
 </head>
 <body>
    <h1>domparsing_XMLSerializer_serializeToString</h1>
  <script>
const XMLNS_URI = 'http://www.w3.org/2000/xmlns/';

function createXmlDoc(){
  var input = '<?xml version="1.0" encoding="UTF-8"?><root><child1>value1</child1></root>';
  var parser = new DOMParser();
  return parser.parseFromString(input, 'text/xml');
}

// Returns the root element.
function parse(xmlString) {
  return (new DOMParser()).parseFromString(xmlString, 'text/xml').documentElement;
}

function serialize(node) {
  return (new XMLSerializer()).serializeToString(node);
}

test(function() {
  var root = createXmlDoc().documentElement;
  assert_equals(serialize(root), '<root><child1>value1</child1></root>');
}, 'check XMLSerializer.serializeToString method could parsing xmldoc to string');

test(function() {
  var root = parse('<html><head></head><body><div></div><span></span></body></html>');
  assert_equals(serialize(root.ownerDocument), '<html><head/><body><div/><span/></body></html>');
}, 'check XMLSerializer.serializeToString method could parsing document to string');

test(function() {
  var root = createXmlDoc().documentElement;
  var element = root.ownerDocument.createElementNS('urn:foo', 'another');
  var child1 = root.firstChild;
  root.replaceChild(element, child1);
  element.appendChild(child1);
  assert_equals(serialize(root), '<root><another xmlns="urn:foo"><child1 xmlns="">value1</child1></another></root>');
}, 'Check if the default namespace is correctly reset.');

test(function() {
  var root = parse('<root xmlns="urn:bar"><outer xmlns=""><inner>value1</inner></outer></root>');
  assert_equals(serialize(root), '<root xmlns="urn:bar"><outer xmlns=""><inner>value1</inner></outer></root>');
}, 'Check if there is no redundant empty namespace declaration.');

// https://github.com/w3c/DOM-Parsing/issues/47
test(function() {
  assert_equals(serialize(parse('<root><child xmlns=""/></root>')),
                '<root><child/></root>');
  assert_equals(serialize(parse('<root xmlns=""><child xmlns=""/></root>')),
                '<root><child/></root>');
  assert_equals(serialize(parse('<root xmlns="u1"><child xmlns="u1"/></root>')),
                '<root xmlns="u1"><child/></root>');
}, 'Check if redundant xmlns="..." is dropped.');

test(function() {
  const root = parse('<root xmlns="uri1"/>');
  const child = root.ownerDocument.createElement('child');
  child.setAttributeNS(XMLNS_URI, 'xmlns', 'FAIL1');
  root.appendChild(child);
  const child2 = root.ownerDocument.createElementNS('uri2', 'child2');
  child2.setAttributeNS(XMLNS_URI, 'xmlns', 'FAIL2');
  root.appendChild(child2);
  const child3 = root.ownerDocument.createElementNS('uri1', 'child3');
  child3.setAttributeNS(XMLNS_URI, 'xmlns', 'FAIL3');
  root.appendChild(child3);
  const child4 = root.ownerDocument.createElementNS('uri4', 'child4');
  child4.setAttributeNS(XMLNS_URI, 'xmlns', 'uri4');
  root.appendChild(child4);
  const child5 = root.ownerDocument.createElement('child5');
  child5.setAttributeNS(XMLNS_URI, 'xmlns', '');
  root.appendChild(child5);
  assert_equals(serialize(root), '<root xmlns="uri1"><child xmlns=""/><child2 xmlns="uri2"/><child3/><child4 xmlns="uri4"/><child5 xmlns=""/></root>');
}, 'Check if inconsistent xmlns="..." is dropped.');

test(function() {
  const root1 = parse('<package></package>');
  root1.setAttribute('xmlns', 'http://www.idpf.org/2007/opf');
  const manifest1 = root1.appendChild(root1.ownerDocument.createElement('manifest'));
  manifest1.setAttribute('xmlns', 'http://www.idpf.org/2007/opf');
  assert_equals(serialize(root1), '<package><manifest/></package>');

  const root2 = parse('<package xmlns="http://www.idpf.org/2007/opf"></package>');
  const manifest2 = root2.appendChild(root2.ownerDocument.createElement('manifest'));
  manifest2.setAttribute('xmlns', 'http://www.idpf.org/2007/opf');
  assert_equals(serialize(root2),
                '<package xmlns="http://www.idpf.org/2007/opf"><manifest xmlns=""/></package>');

  const root3 = parse('<package xmlns="http://www.idpf.org/2007/opf"></package>');
  const manifest3 = root3.appendChild(root3.ownerDocument.createElement('manifest'));
  assert_equals(serialize(root3),
                '<package xmlns="http://www.idpf.org/2007/opf"><manifest xmlns=""/></package>');
}, 'Drop inconsistent xmlns="..." by matching on local name');

test(function() {
  let root = parse('<r xmlns:xx="uri"></r>');
  root.setAttributeNS('uri', 'name', 'v');
  assert_equals(serialize(root), '<r xmlns:xx="uri" xx:name="v"/>');

  let root2 = parse('<r xmlns:xx="uri"><b/></r>');
  let child = root2.firstChild;
  child.setAttributeNS('uri', 'name', 'v');
  assert_equals(serialize(root2), '<r xmlns:xx="uri"><b xx:name="v"/></r>');

  let root3 = parse('<r xmlns:x0="uri" xmlns:x2="uri"><b xmlns:x1="uri"/></r>');
  let child3 = root3.firstChild;
  child3.setAttributeNS('uri', 'name', 'v');
  assert_equals(serialize(root3),
                '<r xmlns:x0="uri" xmlns:x2="uri"><b xmlns:x1="uri" x1:name="v"/></r>',
                'Should choose the nearest prefix');
}, 'Check if an attribute with namespace and no prefix is serialized with the nearest-declared prefix');

// https://github.com/w3c/DOM-Parsing/issues/45
test(function() {
  let root = parse('<el1 xmlns:p="u1" xmlns:q="u1"><el2 xmlns:q="u2"/></el1>');
  root.firstChild.setAttributeNS('u1', 'name', 'v');
  assert_equals(serialize(root),
                '<el1 xmlns:p="u1" xmlns:q="u1"><el2 xmlns:q="u2" q:name="v"/></el1>');
}, 'Check if an attribute with namespace and no prefix is serialized with the nearest-declared prefix even if the prefix is assigned to another namespace.');

test(function() {
  let root = parse('<r xmlns:xx="uri"></r>');
  root.setAttributeNS('uri', 'p:name', 'v');
  assert_equals(serialize(root), '<r xmlns:xx="uri" xx:name="v"/>');

  let root2 = parse('<r xmlns:xx="uri"><b/></r>');
  let child = root2.firstChild;
  child.setAttributeNS('uri', 'p:name', 'value');
  assert_equals(serialize(root2),
                '<r xmlns:xx="uri"><b xx:name="value"/></r>');
}, 'Check if the prefix of an attribute is replaced with another existing prefix mapped to the same namespace URI.');

// https://github.com/w3c/DOM-Parsing/issues/29
test(function() {
  let root = parse('<r xmlns:xx="uri"></r>');
  root.setAttributeNS('uri2', 'p:name', 'value');
  assert_equals(serialize(root),
                '<r xmlns:xx="uri" xmlns:ns1="uri2" ns1:name="value"/>');
}, 'Check if the prefix of an attribute is NOT preserved in a case where neither its prefix nor its namespace URI is not already used.');

test(function() {
  let root = parse('<r xmlns:xx="uri"></r>');
  root.setAttributeNS('uri2', 'xx:name', 'value');
  assert_equals(serialize(root),
                '<r xmlns:xx="uri" xmlns:ns1="uri2" ns1:name="value"/>');
}, 'Check if the prefix of an attribute is replaced with a generated one in a case where the prefix is already mapped to a different namespace URI.');

test(function() {
  var root = parse('<root />');
  root.setAttribute('attr', '\t');
  assert_in_array(serialize(root), [
    '<root attr="&#9;"/>', '<root attr="&#x9;"/>']);
  root.setAttribute('attr', '\n');
  assert_in_array(serialize(root), [
    '<root attr="&#xA;"/>', '<root attr="&#10;"/>']);
  root.setAttribute('attr', '\r');
  assert_in_array(serialize(root), [
    '<root attr="&#xD;"/>', '<root attr="&#13;"/>']);
}, 'check XMLSerializer.serializeToString escapes attribute values for roundtripping');

test(function() {
  const root = (new Document()).createElement('root');
  root.setAttributeNS('uri1', 'p:foobar', 'value1');
  root.setAttributeNS(XMLNS_URI, 'xmlns:p', 'uri2');
  assert_equals(serialize(root), '<root xmlns:ns1="uri1" ns1:foobar="value1" xmlns:p="uri2"/>');
}, 'Check if attribute serialization takes into account of following xmlns:* attributes');

test(function() {
  const root = parse('<root xmlns:p="uri1"><child/></root>');
  root.firstChild.setAttributeNS('uri2', 'p:foobar', 'v');
  assert_equals(serialize(root), '<root xmlns:p="uri1"><child xmlns:ns1="uri2" ns1:foobar="v"/></root>');
}, 'Check if attribute serialization takes into account of the same prefix declared in an ancestor element');

test(function() {
  assert_equals(serialize(parse('<root><child/></root>')), '<root><child/></root>');
  assert_equals(serialize(parse('<root xmlns="u1"><p:child xmlns:p="u1"/></root>')), '<root xmlns="u1"><child xmlns:p="u1"/></root>');
}, 'Check if start tag serialization drops element prefix if the namespace is same as inherited default namespace.');

test(function() {
  const root = parse('<root xmlns:p1="u1"><child xmlns:p2="u1"/></root>');
  const child2 = root.ownerDocument.createElementNS('u1', 'child2');
  root.firstChild.appendChild(child2);
  assert_equals(serialize(root), '<root xmlns:p1="u1"><child xmlns:p2="u1"><p2:child2/></child></root>');
}, 'Check if start tag serialization finds an appropriate prefix.');

test(function() {
  const root = parse('<root xmlns:p1="u1"><child xmlns:p2="u1"/></root>');
  const child2 = root.ownerDocument.createElementNS('u1', 'child2');
  const grandchild = root.ownerDocument.createElementNS('u1', 'grandchild');
  child2.appendChild(grandchild);
  root.firstChild.appendChild(child2);
  assert_equals(serialize(root), '<root xmlns:p1="u1"><child xmlns:p2="u1"><p2:child2><p2:grandchild/></p2:child2></child></root>');
}, 'Check if end tag serialization matches start tag when an appropriate prefix is found.');

test(function() {
  const root = (new Document()).createElementNS('uri1', 'p:root');
  root.setAttributeNS(XMLNS_URI, 'xmlns:p', 'uri2');
  assert_equals(serialize(root), '<ns1:root xmlns:ns1="uri1" xmlns:p="uri2"/>');
}, 'Check if start tag serialization takes into account of its xmlns:* attributes');

test(function() {
  const root = (new Document()).createElement('root');
  root.setAttributeNS(XMLNS_URI, 'xmlns:p', 'uri2');
  const child = root.ownerDocument.createElementNS('uri1', 'p:child');
  root.appendChild(child);
  assert_equals(serialize(root), '<root xmlns:p="uri2"><p:child xmlns:p="uri1"/></root>');
}, 'Check if start tag serialization applied the original prefix even if it is declared in an ancestor element.');

// https://github.com/w3c/DOM-Parsing/issues/52
test(function() {
  assert_equals(serialize(parse('<root xmlns:x="uri1"><table xmlns="uri1"></table></root>')),
      '<root xmlns:x="uri1"><x:table xmlns="uri1"/></root>');
}, 'Check if start tag serialization does NOT apply the default namespace if its namespace is declared in an ancestor.');

test(function() {
  const xmlNS = 'http://www.w3.org/XML/1998/namespace';
  const root = parse('<root/>');
  const child = root.ownerDocument.createElementNS(xmlNS, 'foo');
  const grandchild = root.ownerDocument.createElementNS(xmlNS, 'bar');
  child.appendChild(grandchild);
  root.appendChild(child);
  assert_equals(serialize(root), '<root><xml:foo><xml:bar/></xml:foo></root>');
}, 'Check if end tag serialization matches start tag for elements in the XML namespace.');

test(function() {
  const root = parse('<root><child1/><child2/></root>');
  root.firstChild.setAttributeNS('uri1', 'attr1', 'value1');
  root.firstChild.setAttributeNS('uri2', 'attr2', 'value2');
  root.lastChild.setAttributeNS('uri3', 'attr3', 'value3');
  assert_equals(serialize(root), '<root><child1 xmlns:ns1="uri1" ns1:attr1="value1" xmlns:ns2="uri2" ns2:attr2="value2"/><child2 xmlns:ns3="uri3" ns3:attr3="value3"/></root>');
}, 'Check if generated prefixes match to "ns${index}".');

// https://github.com/w3c/DOM-Parsing/issues/44
// According to 'DOM Parsing and Serialization' draft as of 2018-12-11,
// 'generate a prefix' result can conflict with an existing xmlns:ns* declaration.
test(function() {
  const root = parse('<root xmlns:ns2="uri2"><child xmlns:ns1="uri1"/></root>');
  root.firstChild.setAttributeNS('uri3', 'attr1', 'value1');
  assert_equals(serialize(root), '<root xmlns:ns2="uri2"><child xmlns:ns1="uri1" xmlns:ns1="uri3" ns1:attr1="value1"/></root>');
}, 'Check if "ns1" is generated even if the element already has xmlns:ns1.');

test(function() {
  const root = (new Document()).createElement('root');
  root.setAttributeNS('http://www.w3.org/1999/xlink', 'href', 'v');
  assert_equals(serialize(root), '<root xmlns:ns1="http://www.w3.org/1999/xlink" ns1:href="v"/>');

  const root2 = (new Document()).createElement('root');
  root2.setAttributeNS('http://www.w3.org/1999/xlink', 'xl:type', 'v');
  assert_equals(serialize(root2), '<root xmlns:xl="http://www.w3.org/1999/xlink" xl:type="v"/>');
}, 'Check if no special handling for XLink namespace unlike HTML serializer.');

test(function() {
  var root = new DocumentFragment;
  root.append(document.createElement('div'));
  root.append(document.createElement('span'));
  assert_equals(serialize(root), '<div xmlns="http://www.w3.org/1999/xhtml"></div><span xmlns="http://www.w3.org/1999/xhtml"></span>');
}, 'Check if document fragment serializes.');

test(function () {
  const root = document.createElement("img");
  root.append(document.createElement("style"));
  root.append(document.createElement("style"));
  assert_equals(serialize(root), '<img xmlns=\"http://www.w3.org/1999/xhtml\"><style></style><style></style></img>');
}, 'Check children were included for void elements');

test(function () {
  const root = parse('<root xmlns="" xmlns:foo="urn:bar"/>');
  root.setAttributeNS(XMLNS_URI, 'xmlns:foo', '');
  assert_equals(serialize(root), '<root xmlns="" xmlns:foo=""/>');
}, 'Check if a prefix bound to an empty namespace URI ("no namespace") serialize');

test(function() {
  assert_equals(serialize(document.createAttribute("foobar")), "")
}, 'Attribute nodes are serialized as the empty string')
</script>
 </body>
</html>
