summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/dom/nodes/Node-cloneNode.html
blob: 9fb939f7e657fc73f62694c56fd23a3495116957 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
<!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",        HTMLTableCellElement);
    create_element_and_check("template",  HTMLTemplateElement);
    create_element_and_check("textarea",  HTMLTextAreaElement);
    create_element_and_check("th",        HTMLTableCellElement);
    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>