| <!DOCTYPE html> |
| <meta charset=utf-8> |
| <title>Node.cloneNode</title> |
| <link rel=help href="https://dom.spec.whatwg.org/#dom-node-clonenode"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <div id=log></div> |
| <script> |
| function assert_equal_node(nodeA, nodeB) { |
| assert_equals(nodeB.nodeType, nodeA.nodeType, "nodeType"); |
| assert_equals(nodeB.nodeName, nodeA.nodeName, "nodeName"); |
| |
| if (nodeA.nodeType === Node.ELEMENT_NODE) { |
| assert_equals(nodeB.prefix, nodeA.prefix); |
| assert_equals(nodeB.namespaceURI, nodeA.namespaceURI); |
| assert_equals(nodeB.localName, nodeA.localName); |
| assert_equals(nodeB.tagName, nodeA.tagName); |
| assert_not_equals(nodeB.attributes != nodeA.attributes); |
| assert_equals(nodeB.attributes.length, nodeA.attributes.length); |
| for (var i = 0, il = nodeA.attributes.length; i < il; ++i) { |
| assert_not_equals(nodeB.attributes[i], nodeA.attributes[i]); |
| assert_equals(nodeB.attributes[i].name, nodeA.attributes[i].name); |
| assert_equals(nodeB.attributes[i].prefix, nodeA.attributes[i].prefix); |
| assert_equals(nodeB.attributes[i].namespaceURI, nodeA.attributes[i].namespaceURI); |
| assert_equals(nodeB.attributes[i].value, nodeA.attributes[i].value); |
| } |
| } |
| } |
| |
| function check_copy(orig, copy, type) { |
| assert_not_equals(orig, copy); |
| assert_equal_node(orig, copy); |
| assert_true(orig instanceof type, "Should be type"); |
| assert_true(copy instanceof type, "Should be type"); |
| } |
| |
| function create_element_and_check(localName, type) { |
| test(function() { |
| var element = document.createElement(localName); |
| var copy = element.cloneNode(); |
| check_copy(element, copy, type); |
| }, "createElement(" + localName + ")"); |
| } |
| |
| // test1: createElement |
| test(function() { |
| create_element_and_check("a", HTMLAnchorElement); |
| create_element_and_check("abbr", HTMLElement); |
| create_element_and_check("acronym", HTMLElement); |
| create_element_and_check("address", HTMLElement); |
| create_element_and_check("applet", HTMLAppletElement); |
| create_element_and_check("area", HTMLAreaElement); |
| create_element_and_check("article", HTMLElement); |
| create_element_and_check("aside", HTMLElement); |
| create_element_and_check("audio", HTMLAudioElement); |
| create_element_and_check("b", HTMLElement); |
| create_element_and_check("base", HTMLBaseElement); |
| create_element_and_check("bdi", HTMLElement); |
| create_element_and_check("bdo", HTMLElement); |
| create_element_and_check("bgsound", HTMLElement); |
| create_element_and_check("big", HTMLElement); |
| create_element_and_check("blockquote",HTMLElement); |
| create_element_and_check("body", HTMLBodyElement); |
| create_element_and_check("br", HTMLBRElement); |
| create_element_and_check("button", HTMLButtonElement); |
| create_element_and_check("canvas", HTMLCanvasElement); |
| create_element_and_check("caption", HTMLTableCaptionElement); |
| create_element_and_check("center", HTMLElement); |
| create_element_and_check("cite", HTMLElement); |
| create_element_and_check("code", HTMLElement); |
| create_element_and_check("col", HTMLTableColElement); |
| create_element_and_check("colgroup", HTMLTableColElement); |
| create_element_and_check("data", HTMLDataElement); |
| create_element_and_check("datalist", HTMLDataListElement); |
| create_element_and_check("dialog", HTMLDialogElement); |
| create_element_and_check("dd", HTMLElement); |
| create_element_and_check("del", HTMLModElement); |
| create_element_and_check("details", HTMLElement); |
| create_element_and_check("dfn", HTMLElement); |
| create_element_and_check("dir", HTMLDirectoryElement); |
| create_element_and_check("div", HTMLDivElement); |
| create_element_and_check("dl", HTMLDListElement); |
| create_element_and_check("dt", HTMLElement); |
| create_element_and_check("embed", HTMLEmbedElement); |
| create_element_and_check("fieldset", HTMLFieldSetElement); |
| create_element_and_check("figcaption",HTMLElement); |
| create_element_and_check("figure", HTMLElement); |
| create_element_and_check("font", HTMLFontElement); |
| create_element_and_check("footer", HTMLElement); |
| create_element_and_check("form", HTMLFormElement); |
| create_element_and_check("frame", HTMLFrameElement); |
| create_element_and_check("frameset", HTMLFrameSetElement); |
| create_element_and_check("h1", HTMLHeadingElement); |
| create_element_and_check("h2", HTMLHeadingElement); |
| create_element_and_check("h3", HTMLHeadingElement); |
| create_element_and_check("h4", HTMLHeadingElement); |
| create_element_and_check("h5", HTMLHeadingElement); |
| create_element_and_check("h6", HTMLHeadingElement); |
| create_element_and_check("head", HTMLHeadElement); |
| create_element_and_check("header", HTMLElement); |
| create_element_and_check("hgroup", HTMLElement); |
| create_element_and_check("hr", HTMLHRElement); |
| create_element_and_check("html", HTMLHtmlElement); |
| create_element_and_check("i", HTMLElement); |
| create_element_and_check("iframe", HTMLIFrameElement); |
| create_element_and_check("img", HTMLImageElement); |
| create_element_and_check("input", HTMLInputElement); |
| create_element_and_check("ins", HTMLModElement); |
| create_element_and_check("isindex", HTMLElement); |
| create_element_and_check("kbd", HTMLElement); |
| create_element_and_check("label", HTMLLabelElement); |
| create_element_and_check("legend", HTMLLegendElement); |
| create_element_and_check("li", HTMLLIElement); |
| create_element_and_check("link", HTMLLinkElement); |
| create_element_and_check("main", HTMLElement); |
| create_element_and_check("map", HTMLMapElement); |
| create_element_and_check("mark", HTMLElement); |
| create_element_and_check("marquee", HTMLElement); |
| create_element_and_check("meta", HTMLMetaElement); |
| create_element_and_check("meter", HTMLMeterElement); |
| create_element_and_check("nav", HTMLElement); |
| create_element_and_check("nobr", HTMLElement); |
| create_element_and_check("noframes", HTMLElement); |
| create_element_and_check("noscript", HTMLElement); |
| create_element_and_check("object", HTMLObjectElement); |
| create_element_and_check("ol", HTMLOListElement); |
| create_element_and_check("optgroup", HTMLOptGroupElement); |
| create_element_and_check("option", HTMLOptionElement); |
| create_element_and_check("output", HTMLOutputElement); |
| create_element_and_check("p", HTMLParagraphElement); |
| create_element_and_check("param", HTMLParamElement); |
| create_element_and_check("pre", HTMLPreElement); |
| create_element_and_check("progress", HTMLProgressElement); |
| create_element_and_check("q", HTMLQuoteElement); |
| create_element_and_check("rp", HTMLElement); |
| create_element_and_check("rt", HTMLElement); |
| create_element_and_check("ruby", HTMLElement); |
| create_element_and_check("s", HTMLElement); |
| create_element_and_check("samp", HTMLElement); |
| create_element_and_check("script", HTMLScriptElement); |
| create_element_and_check("section", HTMLElement); |
| create_element_and_check("select", HTMLSelectElement); |
| create_element_and_check("small", HTMLElement); |
| create_element_and_check("source", HTMLSourceElement); |
| create_element_and_check("spacer", HTMLElement); |
| create_element_and_check("span", HTMLSpanElement); |
| create_element_and_check("strike", HTMLElement); |
| create_element_and_check("style", HTMLStyleElement); |
| create_element_and_check("sub", HTMLElement); |
| create_element_and_check("summary", HTMLElement); |
| create_element_and_check("sup", HTMLElement); |
| create_element_and_check("table", HTMLTableElement); |
| create_element_and_check("tbody", HTMLTableSectionElement); |
| create_element_and_check("td", HTMLTableDataCellElement); |
| create_element_and_check("template", HTMLTemplateElement); |
| create_element_and_check("textarea", HTMLTextAreaElement); |
| create_element_and_check("th", HTMLTableHeaderCellElement); |
| create_element_and_check("time", HTMLTimeElement); |
| create_element_and_check("title", HTMLTitleElement); |
| create_element_and_check("tr", HTMLTableRowElement); |
| create_element_and_check("tt", HTMLElement); |
| create_element_and_check("track", HTMLTrackElement); |
| create_element_and_check("u", HTMLElement); |
| create_element_and_check("ul", HTMLUListElement); |
| create_element_and_check("var", HTMLElement); |
| create_element_and_check("video", HTMLVideoElement); |
| create_element_and_check("unknown", HTMLUnknownElement); |
| create_element_and_check("wbr", HTMLElement); |
| }, ""); |
| |
| test(function() { |
| var fragment = document.createDocumentFragment(); |
| var copy = fragment.cloneNode(); |
| check_copy(fragment, copy, DocumentFragment); |
| }, "createDocumentFragment"); |
| |
| test(function() { |
| var text = document.createTextNode("hello world"); |
| var copy = text.cloneNode(); |
| check_copy(text, copy, Text); |
| assert_equals(text.data, copy.data); |
| assert_equals(text.wholeText, copy.wholeText); |
| }, "createTextNode"); |
| |
| test(function() { |
| var comment = document.createComment("a comment"); |
| var copy = comment.cloneNode(); |
| check_copy(comment, copy, Comment); |
| assert_equals(comment.data, copy.data); |
| }, "createComment"); |
| |
| test(function() { |
| var el = document.createElement("foo"); |
| el.setAttribute("a", "b"); |
| el.setAttribute("c", "d"); |
| var c = el.cloneNode(); |
| check_copy(el, c, Element); |
| }, "createElement with attributes") |
| |
| test(function() { |
| var el = document.createElementNS("http://www.w3.org/1999/xhtml", "foo:div"); |
| var c = el.cloneNode(); |
| check_copy(el, c, HTMLDivElement); |
| }, "createElementNS HTML") |
| |
| test(function() { |
| var el = document.createElementNS("http://www.example.com/", "foo:div"); |
| var c = el.cloneNode(); |
| check_copy(el, c, Element); |
| }, "createElementNS non-HTML") |
| |
| test(function() { |
| var pi = document.createProcessingInstruction("target", "data"); |
| var copy = pi.cloneNode(); |
| check_copy(pi, copy, ProcessingInstruction); |
| assert_equals(pi.data, copy.data); |
| assert_equals(pi.target, pi.target); |
| }, "createProcessingInstruction"); |
| |
| test(function() { |
| var doctype = document.implementation.createDocumentType("html", "public", "system"); |
| var copy = doctype.cloneNode(); |
| check_copy(doctype, copy, DocumentType); |
| assert_equals(doctype.name, copy.name); |
| assert_equals(doctype.publicId, copy.publicId); |
| assert_equals(doctype.systemId, copy.systemId); |
| }, "implementation.createDocumentType"); |
| |
| test(function() { |
| var doc = document.implementation.createDocument(null, null); |
| var copy = doc.cloneNode(); |
| check_copy(doc, copy, Document); |
| assert_equals(doc.contentType, copy.contentType); |
| }, "implementation.createDocument"); |
| |
| test(function() { |
| var html = document.implementation.createHTMLDocument("title"); |
| var copy = html.cloneNode(); |
| check_copy(html, copy, Document); |
| assert_equals(copy.title, ""); |
| }, "implementation.createHTMLDocument"); |
| |
| test(function() { |
| var parent = document.createElement("div"); |
| var child1 = document.createElement("div"); |
| var child2 = document.createElement("div"); |
| var grandChild = document.createElement("div"); |
| |
| child2.appendChild(grandChild); |
| parent.appendChild(child1); |
| parent.appendChild(child2); |
| |
| var deep = true; |
| var copy = parent.cloneNode(deep); |
| |
| check_copy(parent, copy, HTMLDivElement); |
| assert_equals(copy.childNodes.length, 2); |
| |
| check_copy(child1, copy.childNodes[0], HTMLDivElement); |
| assert_equals(copy.childNodes[0].childNodes.length, 0); |
| |
| check_copy(child2, copy.childNodes[1], HTMLDivElement); |
| assert_equals(copy.childNodes[1].childNodes.length, 1); |
| check_copy(grandChild, copy.childNodes[1].childNodes[0], HTMLDivElement); |
| |
| deep = false; |
| copy = parent.cloneNode(deep); |
| |
| check_copy(parent, copy, HTMLDivElement); |
| assert_equals(copy.childNodes.length, 0); |
| }, "node with children"); |
| </script> |