View Javadoc
1   /*
2    * Copyright (c) 2002-2025 Gargoyle Software Inc.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * https://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  package org.htmlunit.javascript.host;
16  
17  import org.htmlunit.WebDriverTestCase;
18  import org.htmlunit.javascript.host.xml.XMLDocumentTest;
19  import org.htmlunit.junit.annotation.Alerts;
20  import org.htmlunit.junit.annotation.HtmlUnitNYI;
21  import org.htmlunit.util.MimeType;
22  import org.junit.jupiter.api.Test;
23  
24  /**
25   * Tests for {@link Element}.
26   *
27   * @author Ahmed Ashour
28   * @author Marc Guillemot
29   * @author Ronald Brill
30   * @author Frank Danek
31   * @author Anton Demydenko
32   */
33  public class ElementTest extends WebDriverTestCase {
34  
35      /**
36       * @throws Exception if the test fails
37       */
38      @Test
39      @Alerts({"1", "attrName attrValue", "attrValue", "null", "anotherValue",
40               "1", "4", "<span id='label'>changed</span>"})
41      public void attributes() throws Exception {
42          final String html = DOCTYPE_HTML
43              + "<html><head><script>\n"
44              + LOG_TITLE_FUNCTION
45              + "  function test() {\n"
46              + "    var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'foo.xml'") + ";\n"
47              + "    var attributes = doc.documentElement.attributes;\n"
48              + "    log(attributes.length);\n"
49              + "    log(attributes[0].name + ' ' + attributes[0].value);\n"
50              + "    var root = doc.documentElement;\n"
51              + "    log(root.getAttribute('attrName'));\n"
52              + "    log(root.getAttribute('notExisting'));\n"
53              + "    root.setAttribute('attrName', 'anotherValue');\n"
54              + "    log(root.getAttribute('attrName'));\n"
55              + "    log(root.getElementsByTagName('book').length);\n"
56              + "    var description = root.getElementsByTagName('description')[0];\n"
57              + "    log(description.firstChild.nodeType);\n"
58              + "    log(description.firstChild.nodeValue);\n"
59              + "  }\n"
60              + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_FILE_FUNCTION
61              + "</script></head><body onload='test()'>\n"
62              + "</body></html>";
63  
64          final String xml
65              = "<books attrName=\"attrValue\">\n"
66              + "  <book>\n"
67              + "    <title>Immortality</title>\n"
68              + "    <author>John Smith</author>\n"
69              + "    <description><![CDATA[<span id='label'>changed</span>]]></description>\n"
70              + "  </book>\n"
71              + "</books>";
72  
73          getMockWebConnection().setDefaultResponse(xml, MimeType.TEXT_XML);
74          loadPageVerifyTitle2(html);
75      }
76  
77      /**
78       * @throws Exception if the test fails
79       */
80      @Test
81      @Alerts("TypeError")
82      public void selectNodes() throws Exception {
83          final String html = DOCTYPE_HTML
84              + "<html><head><script>\n"
85              + LOG_TITLE_FUNCTION
86              + "  function test() {\n"
87              + "    var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n"
88              + "    try {\n"
89              + "      var nodes = doc.documentElement.selectNodes('//title');\n"
90              + "      log(nodes.length);\n"
91              + "      log(nodes[0].tagName);\n"
92              + "    } catch(e) { logEx(e); }\n"
93              + "  }\n"
94              + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_FILE_FUNCTION
95              + "</script></head><body onload='test()'>\n"
96              + "</body></html>";
97  
98          final String xml
99              = "<books>\n"
100             + "  <book>\n"
101             + "    <title>Immortality</title>\n"
102             + "    <author>John Smith</author>\n"
103             + "  </book>\n"
104             + "</books>";
105 
106         getMockWebConnection().setDefaultResponse(xml, MimeType.TEXT_XML);
107         loadPageVerifyTitle2(html);
108     }
109 
110     /**
111      * @throws Exception if the test fails
112      */
113     @Test
114     @Alerts({"2", "1"})
115     public void removeChild() throws Exception {
116         final String html = DOCTYPE_HTML
117             + "<html><head><script>\n"
118             + LOG_TITLE_FUNCTION
119             + "  function test() {\n"
120             + "    var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n"
121             + "    var parent = doc.documentElement.firstChild;\n"
122             + "    log(parent.childNodes.length);\n"
123             + "    parent.removeChild(parent.firstChild);\n"
124             + "    log(parent.childNodes.length);\n"
125             + "  }\n"
126             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_FILE_FUNCTION
127             + "</script></head><body onload='test()'>\n"
128             + "</body></html>";
129 
130         final String xml = "<books><book><title>Immortality</title><author>John Smith</author></book></books>";
131 
132         getMockWebConnection().setDefaultResponse(xml, MimeType.TEXT_XML);
133         loadPageVerifyTitle2(html);
134     }
135 
136     /**
137      * @throws Exception if the test fails
138      */
139     @Test
140     @Alerts({"lbl_SettingName", "outerHTML", "undefined"})
141     public void getAttributeNode() throws Exception {
142         final String html = DOCTYPE_HTML
143             + "<html><head><script>\n"
144             + LOG_TITLE_FUNCTION
145             + "  function test() {\n"
146             + "    var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n"
147             + "    parseXML(doc);\n"
148             + "  }\n"
149             + "  function parseXML(xml) {\n"
150             + "    if (xml.documentElement.hasChildNodes()) {\n"
151             + "      for (var i = 0; i < xml.documentElement.childNodes.length; i++) {\n"
152             + "        var elem = xml.documentElement.childNodes.item(i);\n"
153             + "        if (elem.nodeName == 'control') {\n"
154             + "          var target = elem.getAttributeNode('id').value;\n"
155             + "          if(document.all(target) != null) {\n"
156             + "            for (var j = 0; j < elem.childNodes.length; j++) {\n"
157             + "              var node = elem.childNodes.item(j);\n"
158             + "              if (node.nodeName == 'tag') {\n"
159             + "                var type = node.getAttributeNode('type').value;\n"
160             + "                log(target);\n"
161             + "                log(type);\n"
162             + "                log(node.text);\n"
163             + "                eval('document.all(\"' + target + '\").' + type + '=\"' + node.text + '\"');\n"
164             + "              }\n"
165             + "            }\n"
166             + "          }\n"
167             + "        }\n"
168             + "      }\n"
169             + "    }\n"
170             + "  }\n"
171             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_FILE_FUNCTION
172             + "</script></head><body onload='test()'>\n"
173             + "  <div id='lbl_SettingName'/>\n"
174             + "</body></html>";
175 
176         final String xml
177             = "<responsexml>\n"
178             + "  <control id='lbl_SettingName'>\n"
179             + "    <tag type='outerHTML'><span id='lbl_SettingName' class='lbl-white-001'>Item</span></tag>\n"
180             + "  </control>\n"
181             + "</responsexml>";
182 
183         getMockWebConnection().setDefaultResponse(xml, MimeType.TEXT_XML);
184         loadPageVerifyTitle2(html);
185     }
186 
187     /**
188      * @throws Exception if the test fails
189      */
190     @Test
191     @Alerts({"book", "TypeError"})
192     public void selectNode_root() throws Exception {
193         final String html = DOCTYPE_HTML
194             + "<html><head><script>\n"
195             + LOG_TITLE_FUNCTION
196             + "  function test() {\n"
197             + "    var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'" + URL_SECOND + "'") + ";\n"
198             + "    var child = doc.documentElement.firstChild;\n"
199             + "    log(child.tagName);\n"
200             + "    try {\n"
201             + "      log(child.selectNodes('/title').length);\n"
202             + "      log(child.selectNodes('title').length);\n"
203             + "    } catch(e) { logEx(e); }\n"
204             + "  }\n"
205             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_FILE_FUNCTION
206             + "</script></head><body onload='test()'>\n"
207             + "</body></html>";
208 
209         final String xml = "<books><book><title>Immortality</title><author>John Smith</author></book></books>";
210 
211         getMockWebConnection().setDefaultResponse(xml, MimeType.TEXT_XML);
212         loadPageVerifyTitle2(html);
213     }
214 
215     /**
216      * @throws Exception if the test fails
217      */
218     @Test
219     @Alerts({"1", "1"})
220     public void getElementsByTagNameNS() throws Exception {
221         final String html = DOCTYPE_HTML
222             + "<html><head><script>\n"
223             + LOG_TITLE_FUNCTION
224             + "  function test() {\n"
225             + "    var text='<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\\n';\n"
226             + "    text += '<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://myNS\">\\n';\n"
227             + "    text += '  <xsl:template match=\"/\">\\n';\n"
228             + "    text += '  <html>\\n';\n"
229             + "    text += '    <body>\\n';\n"
230             + "    text += '    </body>\\n';\n"
231             + "    text += '  </html>\\n';\n"
232             + "    text += '  </xsl:template>\\n';\n"
233             + "    text += '</xsl:stylesheet>';\n"
234             + "    var doc = " + XMLDocumentTest.callLoadXMLDocumentFromString("text") + ";\n"
235             + "    try {\n"
236             + "      log(doc.documentElement.getElementsByTagNameNS('http://myNS', 'template').length);\n"
237             + "      log(doc.documentElement.getElementsByTagNameNS(null, 'html').length);\n"
238             + "    } catch(e) { logEx(e); }\n"
239             + "  }\n"
240             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_STRING_FUNCTION
241             + "</script></head><body onload='test()'>\n"
242             + "</body></html>";
243 
244         loadPageVerifyTitle2(html);
245     }
246 
247     /**
248      * @throws Exception if the test fails
249      */
250     @Test
251     @Alerts({"1", "2", "3"})
252     public void getElementsByTagNameNSAsterisk() throws Exception {
253         final String html = DOCTYPE_HTML
254             + "<html><head><script>\n"
255             + LOG_TITLE_FUNCTION
256             + "  function test() {\n"
257             + "    var text='<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\\n';\n"
258             + "    text += '<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://myNS\">\\n';\n"
259             + "    text += '  <xsl:template match=\"/\">\\n';\n"
260             + "    text += '  <html>\\n';\n"
261             + "    text += '    <body>\\n';\n"
262             + "    text += '    </body>\\n';\n"
263             + "    text += '  </html>\\n';\n"
264             + "    text += '  </xsl:template>\\n';\n"
265             + "    text += '</xsl:stylesheet>';\n"
266             + "    var doc = " + XMLDocumentTest.callLoadXMLDocumentFromString("text") + ";\n"
267             + "    try {\n"
268             + "      log(doc.documentElement.getElementsByTagNameNS('http://myNS', '*').length);\n"
269             + "      log(doc.documentElement.getElementsByTagNameNS(null, '*').length);\n"
270             + "      log(doc.documentElement.getElementsByTagNameNS('*', '*').length);\n"
271             + "    } catch(e) { logEx(e); }\n"
272             + "  }\n"
273             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_STRING_FUNCTION
274             + "</script></head><body onload='test()'>\n"
275             + "</body></html>";
276 
277         loadPageVerifyTitle2(html);
278     }
279 
280     /**
281      * @throws Exception if an error occurs
282      */
283     @Test
284     @Alerts({"2", "<nested>Three</nested>", "Four", "1", "Two", "0", "0"})
285     public void getElementsByTagNameXml() throws Exception {
286         final String html = DOCTYPE_HTML
287             + "<html><head>\n"
288             + "<meta http-equiv='X-UA-Compatible' content='IE=edge'>\n"
289             + "</head><body>\n"
290             + "<script>\n"
291             + LOG_TITLE_FUNCTION
292             + "  var xmlString = [\n"
293             + "                 '<ResultSet>',\n"
294             + "                 '<Result>One</Result>',\n"
295             + "                 '<RESULT>Two</RESULT>',\n"
296             + "                 '<result><nested>Three</nested></result>',\n"
297             + "                 '<result>Four</result>',\n"
298             + "                 '</ResultSet>'\n"
299             + "                ].join('');\n"
300             + "  var parser = new DOMParser();\n"
301             + "  xml = parser.parseFromString(xmlString, 'text/xml');\n"
302             + "  var xmlDoc = parser.parseFromString(xmlString, 'text/xml');\n"
303             + "  var de = xmlDoc.documentElement;\n"
304             + "  try {\n"
305 
306             + "    var res = de.getElementsByTagName('result');\n"
307             + "    log(res.length);\n"
308             + "    log(res[0].innerHTML);\n"
309             + "    log(res[1].innerHTML);\n"
310 
311             + "    res = de.getElementsByTagName('RESULT');\n"
312             + "    log(res.length);\n"
313             + "    log(res[0].innerHTML);\n"
314 
315             + "    res = de.getElementsByTagName('resulT');\n"
316             + "    log(res.length);\n"
317 
318             + "    res = de.getElementsByTagName('rEsulT');\n"
319             + "    log(res.length);\n"
320             + "  } catch(e) { logEx(e); }\n"
321             + "</script></body></html>";
322 
323         loadPageVerifyTitle2(html);
324     }
325 
326     /**
327      * @throws Exception if the test fails
328      */
329     @Test
330     @Alerts("false")
331     public void hasAttribute() throws Exception {
332         final String html = DOCTYPE_HTML
333             + "<html><head><script>\n"
334             + LOG_TITLE_FUNCTION
335             + "  function test() {\n"
336             + "    var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'foo.xml'") + ";\n"
337             + "    if (!doc.documentElement.hasAttribute) { log('hasAttribute not available'); return }\n"
338             + "    log(doc.documentElement.hasAttribute('something'));\n"
339             + "  }\n"
340             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_FILE_FUNCTION
341             + "</script></head><body onload='test()'>\n"
342             + "</body></html>";
343 
344         final String xml
345             = "<books>\n"
346             + "  <book>\n"
347             + "    <title>Immortality</title>\n"
348             + "    <author>John Smith</author>\n"
349             + "  </book>\n"
350             + "</books>";
351 
352         getMockWebConnection().setDefaultResponse(xml, MimeType.TEXT_XML);
353         loadPageVerifyTitle2(html);
354     }
355 
356     /**
357      * @throws Exception if the test fails
358      */
359     @Test
360     @Alerts("true")
361     public void attributes2() throws Exception {
362         final String html = DOCTYPE_HTML
363             + "<html><head><script>\n"
364             + LOG_TITLE_FUNCTION
365             + "  function test() {\n"
366             + "    var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'foo.xml'") + ";\n"
367             + "    log(doc.documentElement.attributes.getNamedItem('library') != undefined);\n"
368             + "  }\n"
369             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_FILE_FUNCTION
370             + "</script></head><body onload='test()'>\n"
371             + "</body></html>";
372 
373         final String xml
374             = "<books library=\"Hope\">\n"
375             + "  <book>\n"
376             + "    <title>Immortality</title>\n"
377             + "    <author>John Smith</author>\n"
378             + "  </book>\n"
379             + "</books>";
380 
381         getMockWebConnection().setDefaultResponse(xml, MimeType.TEXT_XML);
382         loadPageVerifyTitle2(html);
383     }
384 
385     /**
386      * @throws Exception if the test fails
387      */
388     @Test
389     @Alerts({"undefined", "undefined"})
390     public void xml() throws Exception {
391         final String html = DOCTYPE_HTML
392             + "<html><head><script>\n"
393             + LOG_TITLE_FUNCTION
394             + "function test() {\n"
395             + "  var text = '<a><b c=\"d\">e</b></a>';\n"
396             + "  var doc = " + XMLDocumentTest.callLoadXMLDocumentFromString("text") + ";\n"
397             + "  log(doc.xml);\n"
398             + "  log(doc.documentElement.xml);\n"
399             + "}\n"
400             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_STRING_FUNCTION
401             + "</script></head><body onload='test()'>\n"
402             + "</body></html>";
403 
404         loadPageVerifyTitle2(html);
405     }
406 
407     /**
408      * @throws Exception if the test fails
409      */
410     @Test
411     @Alerts({"[object HTMLDivElement],DIV",
412                 "[object HTMLUnknownElement],APP:DIV",
413                 "[object Element],app:dIv",
414                 "[object HTMLDivElement],DIV",
415                 "[object HTMLUnknownElement],APP:DIV"})
416     public void html_nodeName() throws Exception {
417         html("nodeName");
418     }
419 
420     /**
421      * @throws Exception if the test fails
422      */
423     @Test
424     @Alerts({"[object HTMLDivElement],DIV",
425                 "[object HTMLUnknownElement],APP:DIV",
426                 "[object Element],app:dIv",
427                 "[object HTMLDivElement],DIV",
428                 "[object HTMLUnknownElement],APP:DIV"})
429     public void html_tagName() throws Exception {
430         html("tagName");
431     }
432 
433     /**
434      * @throws Exception if the test fails
435      */
436     @Test
437     @Alerts({"[object HTMLDivElement],null",
438                 "[object HTMLUnknownElement],null",
439                 "[object Element],app",
440                 "[object HTMLDivElement],null",
441                 "[object HTMLUnknownElement],null"})
442     public void html_prefix() throws Exception {
443         html("prefix");
444     }
445 
446     /**
447      * @throws Exception if the test fails
448      */
449     @Test
450     @Alerts({"[object HTMLDivElement],div",
451                 "[object HTMLUnknownElement],app:div",
452                 "[object Element],dIv",
453                 "[object HTMLDivElement],div",
454                 "[object HTMLUnknownElement],app:div"})
455     public void html_localName() throws Exception {
456         html("localName");
457     }
458 
459     /**
460      * @throws Exception if the test fails
461      */
462     @Test
463     @Alerts({"[object HTMLDivElement],undefined",
464                 "[object HTMLUnknownElement],undefined",
465                 "[object Element],undefined",
466                 "[object HTMLDivElement],undefined",
467                 "[object HTMLUnknownElement],undefined"})
468     public void html_baseName() throws Exception {
469         html("baseName");
470     }
471 
472     /**
473      * @throws Exception if the test fails
474      */
475     @Test
476     @Alerts({"[object HTMLDivElement],http://www.w3.org/1999/xhtml",
477                 "[object HTMLUnknownElement],http://www.w3.org/1999/xhtml",
478                 "[object Element],http://www.appcelerator.org",
479                 "[object HTMLDivElement],http://www.w3.org/1999/xhtml",
480                 "[object HTMLUnknownElement],http://www.w3.org/1999/xhtml"})
481     public void html_namespaceURI() throws Exception {
482         html("namespaceURI");
483     }
484 
485     private void html(final String methodName) throws Exception {
486         final String html = DOCTYPE_HTML
487             + "<html>\n"
488             + "<script>\n"
489             + LOG_TITLE_FUNCTION
490             + "  function test() {\n"
491             + "    debug(document.createElement('dIv'));\n"
492             + "    debug(document.createElement('app:dIv'));\n"
493             + "    debug(document.createElementNS('http://www.appcelerator.org', 'app:dIv'));\n"
494             + "    debug(document.getElementById('dIv1'));\n"
495             + "    debug(document.getElementById('dIv2'));\n"
496             + "  }\n"
497             + "  function debug(e) {\n"
498             + "    log(e + ',' + e." + methodName + ");\n"
499             + "  }\n"
500             + "</script>\n"
501             + "</head>\n"
502             + "<body onload='test()'>\n"
503             + "<dIv id='dIv1'></dIv>\n"
504             + "<app:dIv id='dIv2'>log(2)</app:dIv>\n"
505             + "</body></html>";
506 
507         loadPageVerifyTitle2(html);
508     }
509 
510     /**
511      * @throws Exception if the test fails
512      */
513     @Test
514     @Alerts({"[object HTMLDivElement],DIV",
515                 "[object HTMLUnknownElement],APP:DIV",
516                 "[object HTMLUnknownElement],ANOTHER:DIV",
517                 "[object Element],app:dIv",
518                 "[object HTMLDivElement],DIV",
519                 "[object HTMLUnknownElement],APP:DIV",
520                 "[object HTMLUnknownElement],ANOTHER:DIV"})
521     public void namespace_nodeName() throws Exception {
522         namespace("nodeName");
523     }
524 
525     /**
526      * @throws Exception if the test fails
527      */
528     @Test
529     @Alerts({"[object HTMLDivElement],DIV",
530                 "[object HTMLUnknownElement],APP:DIV",
531                 "[object HTMLUnknownElement],ANOTHER:DIV",
532                 "[object Element],app:dIv",
533                 "[object HTMLDivElement],DIV",
534                 "[object HTMLUnknownElement],APP:DIV",
535                 "[object HTMLUnknownElement],ANOTHER:DIV"})
536     public void namespace_tagName() throws Exception {
537         namespace("tagName");
538     }
539 
540     /**
541      * @throws Exception if the test fails
542      */
543     @Test
544     @Alerts({"[object HTMLDivElement],null",
545                 "[object HTMLUnknownElement],null",
546                 "[object HTMLUnknownElement],null",
547                 "[object Element],app",
548                 "[object HTMLDivElement],null",
549                 "[object HTMLUnknownElement],null",
550                 "[object HTMLUnknownElement],null"})
551     public void namespace_prefix() throws Exception {
552         namespace("prefix");
553     }
554 
555     /**
556      * @throws Exception if the test fails
557      */
558     @Test
559     @Alerts({"[object HTMLDivElement],div",
560                 "[object HTMLUnknownElement],app:div",
561                 "[object HTMLUnknownElement],another:div",
562                 "[object Element],dIv",
563                 "[object HTMLDivElement],div",
564                 "[object HTMLUnknownElement],app:div",
565                 "[object HTMLUnknownElement],another:div"})
566     public void namespace_localName() throws Exception {
567         namespace("localName");
568     }
569 
570     /**
571      * @throws Exception if the test fails
572      */
573     @Test
574     @Alerts({"[object HTMLDivElement],http://www.w3.org/1999/xhtml",
575                 "[object HTMLUnknownElement],http://www.w3.org/1999/xhtml",
576                 "[object HTMLUnknownElement],http://www.w3.org/1999/xhtml",
577                 "[object Element],http://www.appcelerator.org",
578                 "[object HTMLDivElement],http://www.w3.org/1999/xhtml",
579                 "[object HTMLUnknownElement],http://www.w3.org/1999/xhtml",
580                 "[object HTMLUnknownElement],http://www.w3.org/1999/xhtml"})
581     public void namespace_namespaceURI() throws Exception {
582         namespace("namespaceURI");
583     }
584 
585     private void namespace(final String methodName) throws Exception {
586         final String html
587             = "<html xmlns='http://www.w3.org/1999/xhtml' xmlns:app='http://www.appcelerator.org'>\n"
588             + "<script>\n"
589             + LOG_TITLE_FUNCTION
590             + "  function test() {\n"
591             + "    debug(document.createElement('dIv'));\n"
592             + "    debug(document.createElement('app:dIv'));\n"
593             + "    debug(document.createElement('another:dIv'));\n"
594             + "    debug(document.createElementNS('http://www.appcelerator.org', 'app:dIv'));\n"
595             + "    debug(document.getElementById('dIv1'));\n"
596             + "    debug(document.getElementById('dIv2'));\n"
597             + "    debug(document.getElementById('dIv3'));\n"
598             + "  }\n"
599             + "  function debug(e) {\n"
600             + "    log(e + ',' + e." + methodName + ");\n"
601             + "  }\n"
602             + "</script>\n"
603             + "</head>\n"
604             + "<body onload='test()'>\n"
605             + "<dIv id='dIv1'></dIv>\n"
606             + "<app:dIv id='dIv2'></app:dIv>\n"
607             + "<another:dIv id='dIv3'></another:dIv>\n"
608             + "</body></html>";
609 
610         loadPageVerifyTitle2(html);
611     }
612 
613     /**
614      * @throws Exception if the test fails
615      */
616     @Test
617     @Alerts({"[object Element]", "dIv",
618                 "[object HTMLHtmlElement]", "html",
619                 "[object HTMLDivElement]", "div",
620                 "[object HTMLUnknownElement]", "dIv"})
621     public void xml_nodeName() throws Exception {
622         xml("nodeName");
623     }
624 
625     /**
626      * @throws Exception if the test fails
627      */
628     @Test
629     @Alerts({"[object Element]", "dIv",
630                 "[object HTMLHtmlElement]", "html",
631                 "[object HTMLDivElement]", "div",
632                 "[object HTMLUnknownElement]", "dIv"})
633     public void xml_tagName() throws Exception {
634         xml("tagName");
635     }
636 
637     /**
638      * @throws Exception if the test fails
639      */
640     @Test
641     @Alerts({"[object Element]", "null",
642                 "[object HTMLHtmlElement]", "null",
643                 "[object HTMLDivElement]", "null",
644                 "[object HTMLUnknownElement]", "null"})
645     public void xml_prefix() throws Exception {
646         xml("prefix");
647     }
648 
649     /**
650      * @throws Exception if the test fails
651      */
652     @Test
653     @Alerts({"[object Element]", "dIv",
654                 "[object HTMLHtmlElement]", "html",
655                 "[object HTMLDivElement]", "div",
656                 "[object HTMLUnknownElement]", "dIv"})
657     public void xml_localName() throws Exception {
658         xml("localName");
659     }
660 
661     /**
662      * @throws Exception if the test fails
663      */
664     @Test
665     @Alerts({"[object Element]", "undefined",
666                 "[object HTMLHtmlElement]", "undefined",
667                 "[object HTMLDivElement]", "undefined",
668                 "[object HTMLUnknownElement]", "undefined"})
669     public void xml_baseName() throws Exception {
670         xml("baseName");
671     }
672 
673     /**
674      * @throws Exception if the test fails
675      */
676     @Test
677     @Alerts({"[object Element]", "null",
678                 "[object HTMLHtmlElement]", "http://www.w3.org/1999/xhtml",
679                 "[object HTMLDivElement]", "http://www.w3.org/1999/xhtml",
680                 "[object HTMLUnknownElement]", "http://www.w3.org/1999/xhtml"})
681     public void xml_namespaceURI() throws Exception {
682         xml("namespaceURI");
683     }
684 
685     private void xml(final String methodName) throws Exception {
686         final String html = DOCTYPE_HTML
687             + "<html>\n"
688             + "  <head>\n"
689             + "    <script>\n"
690             + LOG_TITLE_FUNCTION
691             + "      function test() {\n"
692             + "        var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'foo.xml'") + ";\n"
693             + "        debug(doc.documentElement.childNodes[0]);\n"
694             + "        debug(doc.documentElement.childNodes[1]);\n"
695             + "        debug(doc.documentElement.childNodes[1].childNodes[0]);\n"
696             + "        debug(doc.documentElement.childNodes[1].childNodes[1]);\n"
697             + "      }\n"
698             + "      function debug(e) {\n"
699             + "        try {\n"
700             + "          log(e);\n"
701             + "        } catch(ex) {log(ex)}\n"
702             + "        log(e." + methodName + ");\n"
703             + "      }\n"
704             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_FILE_FUNCTION
705             + "    </script>\n"
706             + "  </head>\n"
707             + "  <body onload='test()'>\n"
708             + "  </body>\n"
709             + "</html>";
710 
711         final String xml =
712               "<xml>"
713             + "<dIv></dIv>"
714             + "<html xmlns='http://www.w3.org/1999/xhtml'>"
715             + "<div></div>"
716             + "<dIv></dIv>"
717             + "</html>"
718             + "</xml>";
719 
720         getMockWebConnection().setDefaultResponse(xml, MimeType.TEXT_XML);
721         loadPageVerifyTitle2(html);
722     }
723 
724     /**
725      * @throws Exception if the test fails
726      */
727     @Test
728     @Alerts({"prototype found", ""
729                     + "ELEMENT_NODE, ATTRIBUTE_NODE, TEXT_NODE, CDATA_SECTION_NODE, ENTITY_REFERENCE_NODE, "
730                     + "ENTITY_NODE, PROCESSING_INSTRUCTION_NODE, COMMENT_NODE, DOCUMENT_NODE, DOCUMENT_TYPE_NODE, "
731                     + "DOCUMENT_FRAGMENT_NODE, NOTATION_NODE, DOCUMENT_POSITION_DISCONNECTED, "
732                     + "DOCUMENT_POSITION_PRECEDING, "
733                     + "DOCUMENT_POSITION_FOLLOWING, DOCUMENT_POSITION_CONTAINS, DOCUMENT_POSITION_CONTAINED_BY, "
734                     + "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC, "})
735     public void enumeratedProperties() throws Exception {
736         final String html = DOCTYPE_HTML
737             + "<html><head>\n"
738             + "<script>\n"
739             + LOG_TITLE_FUNCTION
740             + "  function test() {\n"
741             + "    var str = '';\n"
742             + "    try {\n"
743             + "      log(Element.prototype ? 'prototype found' : 'prototype not found');\n"
744             + "      var str = '';\n"
745             + "      for (var i in Element)\n"
746             + "        str += i + ', ';\n"
747             + "      log(str);\n"
748             + "    } catch(e) { log('exception occured')}\n"
749             + "  }\n"
750             + "</script>\n"
751             + "</head>\n"
752             + "<body onload='test()'>\n"
753             + "</body></html>";
754 
755         loadPageVerifyTitle2(html);
756     }
757 
758     /**
759      * @throws Exception if the test fails
760      */
761     @Test
762     @Alerts("finished")
763     public void removeAttribute() throws Exception {
764         final String html = DOCTYPE_HTML
765             + "<html>\n"
766             + "  <head>\n"
767             + "    <script>\n"
768             + LOG_TITLE_FUNCTION
769             + "      function test() {\n"
770             + "        var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'foo.xml'") + ";\n"
771             + "        var e = doc.getElementsByTagName('title');\n"
772             + "        e[0].removeAttribute('hello');\n"
773             + "        log('finished');\n"
774             + "      }\n"
775             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_FILE_FUNCTION
776             + "    </script>\n"
777             + "  </head>\n"
778             + "  <body onload='test()'>\n"
779             + "  </body>\n"
780             + "</html>";
781 
782         final String xml
783             = "<books>\n"
784             + "  <book>\n"
785             + "    <title>Immortality</title>\n"
786             + "    <author>John Smith</author>\n"
787             + "  </book>\n"
788             + "</books>";
789 
790         getMockWebConnection().setDefaultResponse(xml, MimeType.TEXT_XML);
791         loadPageVerifyTitle2(html);
792     }
793 
794     /**
795      * @throws Exception if the test fails
796      */
797     @Test
798     @Alerts("function")
799     public void getBoundingClientRect() throws Exception {
800         final String html = DOCTYPE_HTML
801             + "<html><body><script>\n"
802             + LOG_TITLE_FUNCTION
803             + "try {\n"
804             + "  log(typeof Element.prototype.getBoundingClientRect);\n"
805             + "} catch(e) { logEx(e);}\n"
806             + "</script></body></html>";
807         loadPageVerifyTitle2(html);
808     }
809 
810     /**
811      * @throws Exception if the test fails
812      */
813     @Test
814     @Alerts("0")
815     public void commentIsElement() throws Exception {
816         final String html = DOCTYPE_HTML
817             + "<html><body>\n"
818             + "<div id='myId'><!-- --></div>\n"
819             + "<script>\n"
820             + LOG_TITLE_FUNCTION
821             + "  log(myId.getElementsByTagName('*').length);\n"
822             + "</script></body></html>";
823         loadPageVerifyTitle2(html);
824     }
825 
826     /**
827      * Node should not have 'innerText', however HTMLElement should have.
828      * The below case checks if Element (which is Node) doesn't define it.
829      *
830      * @throws Exception if the test fails
831      */
832     @Test
833     @Alerts("undefined")
834     public void nodeHasUndefinedInnerText() throws Exception {
835         final String html = DOCTYPE_HTML
836             + "<html><head>\n"
837             + "<script>\n"
838             + LOG_TITLE_FUNCTION
839             + "  function test() {\n"
840             + "    var data = \"<?xml version='1.0' encoding='UTF-8'?>\\\n"
841             + "        <dashboard> \\\n"
842             + "          <locations class='foo'> \\\n"
843             + "            <location for='bar' checked='different'> \\\n"
844             + "              <infowindowtab normal='ab' mixedCase='yes'> \\\n"
845             + "                <tab title='Location'><![CDATA[blabla]]></tab> \\\n"
846             + "                <tab title='Users'><![CDATA[blublu]]></tab> \\\n"
847             + "              </infowindowtab> \\\n"
848             + "            </location> \\\n"
849             + "          </locations> \\\n"
850             + "        </dashboard>\";\n"
851             + "    var xml, tmp;\n"
852             + "    try {\n"
853             + "      tmp = new DOMParser();\n"
854             + "      xml = tmp.parseFromString(data, 'text/xml');\n"
855             + "    } catch(e) {\n"
856             + "      xml = undefined;\n"
857             + "    }\n"
858             + "\n"
859             + "    log(xml.getElementsByTagName('tab')[0].innerText);\n"
860             + "  }\n"
861             + "</script>\n"
862             + "</head>\n"
863             + "<body onload='test()'/></html>";
864 
865         loadPageVerifyTitle2(html);
866     }
867 
868     /**
869      * @throws Exception if the test fails
870      */
871     @Test
872     @Alerts({"3", "first", "third", "second", "second"})
873     public void firstElementChild() throws Exception {
874         final String html = DOCTYPE_HTML
875             + "<html><head>\n"
876             + "<script>\n"
877             + LOG_TITLE_FUNCTION
878             + "  function test() {\n"
879             + "    var e = document.getElementById('myDiv');\n"
880             + "    if (e.firstElementChild) {\n"
881             + "      log(e.childElementCount);\n"
882             + "      log(e.firstElementChild.id);\n"
883             + "      log(e.lastElementChild.id);\n"
884             + "      log(e.firstElementChild.nextElementSibling.id);\n"
885             + "      log(e.lastElementChild.previousElementSibling.id);\n"
886             + "    }\n"
887             + "  }\n"
888             + "</script>\n"
889             + "</head>\n"
890             + "<body onload='test()'>\n"
891             + "  <div id='myDiv'>\n"
892             + "    <input id='first' type='button' value='someValue'>\n"
893             + "    <br id='second'/>\n"
894             + "    <input id='third' type=button' value='something'>\n"
895             + "  </div>\n"
896             + "</body></html>";
897 
898         loadPageVerifyTitle2(html);
899     }
900 
901     /**
902      * @throws Exception if the test fails
903      */
904     @Test
905     @Alerts({"0", "null", "null"})
906     public void firstElementChildTextNode() throws Exception {
907         final String html
908             = "<html><head>\n"
909             + "<script>\n"
910             + LOG_TITLE_FUNCTION
911             + "  function test() {\n"
912             + "    var e = document.getElementById('myDiv');\n"
913             + "    if (e.childElementCount !== undefined) {\n"
914             + "      log(e.childElementCount);\n"
915             + "      log(e.firstElementChild);\n"
916             + "      log(e.lastElementChild);\n"
917             + "    }\n"
918             + "  }\n"
919             + "</script>\n"
920             + "</head>\n"
921             + "<body onload='test()'>\n"
922             + "  <div id='myDiv'>HtmlUnit</div>\n"
923             + "</body></html>";
924 
925         loadPageVerifyTitle2(html);
926     }
927 
928     /**
929      * @throws Exception if the test fails
930      */
931     @Test
932     @Alerts({"§§URL§§", "§§URL§§"})
933     public void baseURI() throws Exception {
934         final String html = DOCTYPE_HTML
935             + "<html><head>\n"
936             + "<script>\n"
937             + LOG_TITLE_FUNCTION
938             + "function test() {\n"
939             + "  var text = '<hello><child></child></hello>';\n"
940             + "  var doc = " + XMLDocumentTest.callLoadXMLDocumentFromString("text") + ";\n"
941             + "  var e = doc.documentElement.firstChild;\n"
942             + "  log(e.baseURI);\n"
943             + "\n"
944             + "  e = document.getElementById('myId');\n"
945             + "  log(e.baseURI);\n"
946             + "}\n"
947             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_STRING_FUNCTION
948             + "</script></head><body onload='test()'>\n"
949             + "  <div id='myId'>abcd</div>\n"
950             + "</body></html>";
951 
952         expandExpectedAlertsVariables(URL_FIRST);
953         loadPageVerifyTitle2(html);
954     }
955 
956     /**
957      * @throws Exception if the test fails
958      */
959     @Test
960     @Alerts({"[object HTMLCollection] 1", "[object HTMLCollection] 2", "[object HTMLCollection] 0"})
961     public void children() throws Exception {
962         final String html = DOCTYPE_HTML
963             + "<html><head><script>\n"
964             + LOG_TITLE_FUNCTION
965             + "function test() {\n"
966             + "  var text = '<hello><child></child></hello>';\n"
967             + "  var doc = " + XMLDocumentTest.callLoadXMLDocumentFromString("text") + ";\n"
968 
969             + "  try {\n"
970             + "    var children = doc.documentElement.children;\n"
971             + "    log(children + ' ' + children.length);\n"
972             + "  } catch(e) { logEx(e); }\n"
973 
974             + "  try {\n"
975             + "    children = document.documentElement.children;\n"
976             + "    log(children + ' ' + children.length);\n"
977             + "  } catch(e) { logEx(e); }\n"
978 
979             + "  try {\n"
980             + "    children = document.getElementById('myId').children;\n"
981             + "    log(children + ' ' + children.length);\n"
982             + "  } catch(e) { logEx(e); }\n"
983             + "}\n"
984             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_STRING_FUNCTION
985             + "</script></head><body onload='test()'>\n"
986             + "  <div id='myId'>abcd</div>\n"
987             + "</body></html>";
988 
989         loadPageVerifyTitle2(html);
990     }
991 
992     /**
993      * @throws Exception if the test fails
994      */
995     @Test
996     @Alerts({"", "a b c"})
997     public void classList() throws Exception {
998         final String html = DOCTYPE_HTML
999             + "<html><head><script>\n"
1000             + LOG_TITLE_FUNCTION
1001             + "function test() {\n"
1002             + "  var text = '<hello><child></child></hello>';\n"
1003             + "  var doc = " + XMLDocumentTest.callLoadXMLDocumentFromString("text") + ";\n"
1004             + "  log(doc.documentElement.classList);\n"
1005             + "  log(document.body.classList);\n"
1006             + "}\n"
1007             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_STRING_FUNCTION
1008             + "</script></head><body onload='test()' class='a b c'>\n"
1009             + "  <div id='myId'>abcd</div>\n"
1010             + "</body></html>";
1011 
1012         loadPageVerifyTitle2(html);
1013     }
1014 
1015     /**
1016      * Tests the usage of getAttributeNS, setAttributeNS, removeAttributeNS
1017      * and hasAttributeNS methods.
1018      * @throws Exception if the test fails
1019      */
1020     @Test
1021     @Alerts({"test value", "true", "false", "finished"})
1022     public void attributeNS() throws Exception {
1023         final String html = DOCTYPE_HTML
1024             + "<html>\n"
1025             + "  <head>\n"
1026             + "    <script>\n"
1027             + LOG_TITLE_FUNCTION
1028             + "      function test() {\n"
1029             + "        var doc = document.implementation.createDocument(\"\", \"\", null);\n"
1030             + "        var element = doc.createElementNS(\'uri:test\', \'test:element\');\n"
1031             + "        element.setAttributeNS(\'uri:test\', \'test:attribute\', 'test value');\n"
1032             + "        log(element.getAttributeNS(\'uri:test\', \'attribute\'));\n"
1033             + "        log(element.hasAttributeNS(\'uri:test\', \'attribute\'));\n"
1034             + "        element.removeAttributeNS(\'uri:test\', \'attribute\');\n"
1035             + "        log(element.hasAttributeNS(\'uri:test\', \'attribute\'));\n"
1036             + "        log('finished');\n"
1037             + "      }\n"
1038             + "    </script>\n"
1039             + "  </head>\n"
1040             + "  <body onload='test()'>\n"
1041             + "  </body>\n"
1042             + "</html>";
1043 
1044         loadPageVerifyTitle2(html);
1045     }
1046 
1047     /**
1048      * @throws Exception if the test fails
1049      */
1050     @Test
1051     @Alerts({"ab", "ab"})
1052     public void removeAttribute_case_sensitive() throws Exception {
1053         final String html = DOCTYPE_HTML
1054             + "<html>\n"
1055             + "  <head>\n"
1056             + "    <script>\n"
1057             + LOG_TITLE_FUNCTION
1058             + "      function test() {\n"
1059             + "        var doc = " + XMLDocumentTest.callLoadXMLDocumentFromFile("'foo.xml'") + ";\n"
1060             + "        var e = doc.getElementsByTagName('title')[0];\n"
1061             + "        log(e.getAttribute('normal'));\n"
1062             + "        e.removeAttribute('Normal');\n"
1063             + "        log(e.getAttribute('normal'));\n"
1064             + "      }\n"
1065             + XMLDocumentTest.LOAD_XML_DOCUMENT_FROM_FILE_FUNCTION
1066             + "    </script>\n"
1067             + "  </head>\n"
1068             + "  <body onload='test()'>\n"
1069             + "  </body>\n"
1070             + "</html>";
1071 
1072         final String xml
1073             = "<books>\n"
1074             + "  <book>\n"
1075             + "    <title normal=\"ab\">Immortality</title>\n"
1076             + "    <author>John Smith</author>\n"
1077             + "  </book>\n"
1078             + "</books>";
1079 
1080         getMockWebConnection().setDefaultResponse(xml, MimeType.TEXT_XML);
1081         loadPageVerifyTitle2(html);
1082     }
1083 
1084     /**
1085      * @throws Exception if the test fails
1086      */
1087     @Test
1088     @Alerts("test")
1089     public void setAttributeNode() throws Exception {
1090         final String html = DOCTYPE_HTML
1091             + "<html>\n"
1092             + "  <head>\n"
1093             + "    <script>\n"
1094             + LOG_TITLE_FUNCTION
1095             + "      function test() {\n"
1096             + "        var doc = document.implementation.createDocument('', '', null);\n"
1097             + "        var element = doc.createElement('something');\n"
1098             + "        var attr = doc.createAttribute('name');\n"
1099             + "        attr.value = 'test';\n"
1100             + "        element.setAttributeNode(attr);\n"
1101             + "        log(element.getAttributeNode('name').value);\n"
1102             + "      }\n"
1103             + "    </script>\n"
1104             + "  </head>\n"
1105             + "  <body onload='test()'>\n"
1106             + "  </body>\n"
1107             + "</html>";
1108 
1109         loadPageVerifyTitle2(html);
1110     }
1111 
1112     /**
1113      * @throws Exception if an error occurs
1114      */
1115     @Test
1116     @Alerts({"undefined", "undefined"})
1117     public void currentStyle() throws Exception {
1118         final String html = DOCTYPE_HTML
1119             + "<html>\n"
1120             + "<head>\n"
1121             + "  <script>\n"
1122             + LOG_TITLE_FUNCTION
1123             + "    function test() {\n"
1124             + "      var e = document.getElementById('tester');\n"
1125             + "      log(e.currentStyle ? 'available' : e.currentStyle);\n"
1126             + "      e = document.createElement('div');\n"
1127             + "      log(e.currentStyle ? 'available' : e.currentStyle);\n"
1128             + "    }\n"
1129             + "  </script>\n"
1130             + "</head>\n"
1131             + "<body onload='test()'>\n"
1132             + "  <div id='tester'></div>\n"
1133             + "</body></html>";
1134         loadPageVerifyTitle2(html);
1135     }
1136 
1137     /**
1138      * @throws Exception if an error occurs
1139      */
1140     @Test
1141     @Alerts({"undefined", "undefined"})
1142     public void allowKeyboardInput() throws Exception {
1143         final String html = DOCTYPE_HTML
1144             + "<html>\n"
1145             + "<head>\n"
1146             + "  <script>\n"
1147             + LOG_TITLE_FUNCTION
1148             + "    function test() {\n"
1149             + "      log(Element.ALLOW_KEYBOARD_INPUT);\n"
1150             + "      log(typeof Element.ALLOW_KEYBOARD_INPUT);\n"
1151             + "    }\n"
1152             + "  </script>\n"
1153             + "</head>\n"
1154             + "<body onload='test()'>\n"
1155             + "</body></html>";
1156         loadPageVerifyTitle2(html);
1157     }
1158 
1159     /**
1160      * @throws Exception if an error occurs
1161      */
1162     @Test
1163     @Alerts("")
1164     public void enumeratedPropertiesForNativeFunction() throws Exception {
1165         final String html = DOCTYPE_HTML
1166             + "<html><head>\n"
1167             + "<script>\n"
1168             + LOG_TITLE_FUNCTION
1169             + "  function test() {\n"
1170             + "    var str = '';\n"
1171             + "    for (var i in test)\n"
1172             + "      str += i + ', ';\n"
1173             + "    log(str);\n"
1174             + "  }\n"
1175             + "</script>\n"
1176             + "</head>\n"
1177             + "<body onload='test()'>\n"
1178             + "</body></html>";
1179 
1180         loadPageVerifyTitle2(html);
1181     }
1182 
1183     /**
1184      * @throws Exception if an error occurs
1185      */
1186     @Test
1187     @Alerts({"function Element() { [native code] }", "[object Element]",
1188              "function Element() { [native code] }"})
1189     public void prototypConstructor() throws Exception {
1190         final String html = DOCTYPE_HTML
1191             + "<html><head>\n"
1192             + "<script>\n"
1193             + LOG_TITLE_FUNCTION
1194             + "  function test() {\n"
1195             + "    try {\n"
1196             + "      process(Element);\n"
1197             + "      process(Element.prototype);\n"
1198             + "      process(Element.prototype.constructor);\n"
1199             + "    } catch(e) { logEx(e) }\n"
1200             + "  }\n"
1201             + "  function process(obj) {\n"
1202             + "    try {\n"
1203             + "      log(obj);\n"
1204             + "    } catch(e) { logEx(e) }\n"
1205             + "   }\n"
1206             + "</script>\n"
1207             + "</head>\n"
1208             + "<body onload='test()'>\n"
1209             + "</body></html>";
1210 
1211         loadPageVerifyTitle2(html);
1212     }
1213 
1214     /**
1215      * @throws Exception if an error occurs
1216      */
1217     @Test
1218     @Alerts({"function Element() { [native code] }", "[object Element]",
1219              "function Element() { [native code] }"})
1220     public void prototypConstructorStandards() throws Exception {
1221         final String html = DOCTYPE_HTML
1222             + "<html><head>\n"
1223             + "<script>\n"
1224             + LOG_TITLE_FUNCTION
1225             + "  function test() {\n"
1226             + "    process(Element);\n"
1227             + "    process(Element.prototype);\n"
1228             + "    process(Element.prototype.constructor);\n"
1229             + "  }\n"
1230             + "  function process(obj) {\n"
1231             + "    log(obj);\n"
1232             + "  }\n"
1233             + "</script>\n"
1234             + "</head>\n"
1235             + "<body onload='test()'>\n"
1236             + "</body></html>";
1237 
1238         loadPageVerifyTitle2(html);
1239     }
1240 
1241     /**
1242      * @throws Exception if an error occurs
1243      */
1244     @Test
1245     @Alerts({"0-0", "0-1", "2-5"})
1246     public void childElementCount() throws Exception {
1247         final String html = DOCTYPE_HTML
1248             + "<html><head>\n"
1249             + "<script>\n"
1250             + LOG_TITLE_FUNCTION
1251             + "  function test() {\n"
1252             + "    info(document.getElementById('emptyDiv'));\n"
1253             + "    info(document.getElementById('whitespaceDiv'));\n"
1254             + "    info(document.getElementById('testDiv'));\n"
1255             + "  }\n"
1256             + "  function info(e) {\n"
1257             + "    log(e.childElementCount + '-' + e.childNodes.length);\n"
1258             + "  }\n"
1259             + "</script>\n"
1260             + "</head>\n"
1261             + "<body onload='test()'>\n"
1262             + "  <div id='emptyDiv'></div>\n"
1263             + "  <div id='whitespaceDiv'>\n"
1264             + "  </div>\n"
1265             + "  <div id='testDiv'>\n"
1266             + "    <div>first</div>\n"
1267             + "    <div>\n"
1268             + "      <span>second</span>\n"
1269             + "    </div>\n"
1270             + "  </div>\n"
1271             + "</body></html>";
1272 
1273         loadPageVerifyTitle2(html);
1274     }
1275 
1276     /**
1277      * @throws Exception if an error occurs
1278      */
1279     @Test
1280     @Alerts({"1-2", "3-7"})
1281     public void childElementCountTable() throws Exception {
1282         final String html = DOCTYPE_HTML
1283             + "<html><head>\n"
1284             + "<script>\n"
1285             + LOG_TITLE_FUNCTION
1286             + "  function test() {\n"
1287             + "    info(document.getElementById('myTable'));\n"
1288             + "    info(document.getElementById('myTr'));\n"
1289             + "  }\n"
1290             + "  function info(e) {\n"
1291             + "    log(e.childElementCount + '-' + e.childNodes.length);\n"
1292             + "  }\n"
1293             + "</script>\n"
1294             + "</head>\n"
1295             + "<body onload='test()'>\n"
1296             + "  <table id='myTable'>\n"
1297             + "    <tr id='myTr'>\n"
1298             + "      <td>first</td>\n"
1299             + "      <td><div>second</div></td>\n"
1300             + "      <td>\n"
1301             + "        third\n"
1302             + "      </td>\n"
1303             + "    </tr>\n"
1304             + "  </table>\n"
1305             + "</body></html>";
1306 
1307         loadPageVerifyTitle2(html);
1308     }
1309 
1310     /**
1311      * @throws Exception if an error occurs
1312      */
1313     @Test
1314     @Alerts({"true", "false"})
1315     public void hasAttributes() throws Exception {
1316         final String html = DOCTYPE_HTML
1317             + "<html><head>\n"
1318             + "<script>\n"
1319             + LOG_TITLE_FUNCTION
1320             + "  function test() {\n"
1321             + "    log(document.body.hasAttributes());\n"
1322             + "    log(document.body.childNodes.item(1).hasAttributes());\n"
1323             + "  }\n"
1324             + "</script>\n"
1325             + "</head>\n"
1326             + "<body onload='test()'>\n"
1327             + "  <div></div>\n"
1328             + "</body></html>";
1329 
1330         loadPageVerifyTitle2(html);
1331     }
1332 
1333     /**
1334      * @throws Exception if an error occurs
1335      */
1336     @Test
1337     @Alerts("Philippine eagle")
1338     public void matches() throws Exception {
1339         final String html = DOCTYPE_HTML
1340             + "<html><head>\n"
1341             + "<script>\n"
1342             + LOG_TITLE_FUNCTION
1343             + "  function test() {\n"
1344             + "    var birds = document.getElementsByTagName('li');\n"
1345             + "    var found = false;"
1346             + "    for (var i = 0; i < birds.length; i++) {\n"
1347             + "      if (birds[i].matches && birds[i].matches('.endangered')) {\n"
1348             + "        log(birds[i].textContent);\n"
1349             + "        found = true;"
1350             + "      }\n"
1351             + "    }\n"
1352             + "    if (!found) {\n"
1353             + "      log('not found');\n"
1354             + "    }\n"
1355             + "  }\n"
1356             + "</script>\n"
1357             + "</head>\n"
1358             + "<body onload='test()'>\n"
1359             + "  <ul id='birds'>\n"
1360             + "    <li>Orange-winged parrot</li>\n"
1361             + "    <li class='endangered'>Philippine eagle</li>\n"
1362             + "    <li>Great white pelican</li>\n"
1363             + "  </ul>\n"
1364             + "</body></html>";
1365 
1366         loadPageVerifyTitle2(html);
1367     }
1368 
1369     /**
1370      * @throws Exception if an error occurs
1371      */
1372     @Test
1373     @Alerts({"SyntaxError/DOMException", "done"})
1374     public void matchesInvalidSelector() throws Exception {
1375         final String html = DOCTYPE_HTML
1376             + "<html><head>\n"
1377             + "<script>\n"
1378             + LOG_TITLE_FUNCTION
1379             + "  function test() {\n"
1380             + "    var birds = document.getElementsByTagName('li');\n"
1381             + "    try {\n"
1382             + "      for (var i = 0; i < birds.length; i++) {\n"
1383             + "        if (birds[i].matches && birds[i].matches('invalidSelector!=:::x')) {\n"
1384             + "          log(birds[i].textContent);\n"
1385             + "        }\n"
1386             + "      }\n"
1387             + "    } catch(e) { logEx(e); }\n"
1388             + "    log('done');\n"
1389             + "  }\n"
1390             + "</script>\n"
1391             + "</head>\n"
1392             + "<body onload='test()'>\n"
1393             + "  <ul id='birds'>\n"
1394             + "    <li>Great white pelican</li>\n"
1395             + "  </ul>\n"
1396             + "</body></html>";
1397 
1398         loadPageVerifyTitle2(html);
1399     }
1400 
1401     /**
1402      * @throws Exception if an error occurs
1403      */
1404     @Test
1405     @Alerts({"TypeError", "done"})
1406     public void matchesWindow() throws Exception {
1407         final String html = DOCTYPE_HTML
1408             + "<html><head>\n"
1409             + "<script>\n"
1410             + LOG_TITLE_FUNCTION
1411             + "  function test() {\n"
1412             + "    var docElem = document.documentElement;\n"
1413             + "    var matches = docElem.matchesSelector\n"
1414             + "         || docElem.mozMatchesSelector\n"
1415             + "         || docElem.webkitMatchesSelector\n"
1416             + "         || docElem.msMatchesSelector;\n"
1417             + "    try {\n"
1418             + "      matches.call(window, ':visible')\n"
1419             + "    } catch(e) { logEx(e); }\n"
1420             + "    log('done');\n"
1421             + "  }\n"
1422             + "</script>\n"
1423             + "</head>\n"
1424             + "<body onload='test()'>\n"
1425             + "  <ul id='birds'>\n"
1426             + "    <li>Great white pelican</li>\n"
1427             + "  </ul>\n"
1428             + "</body></html>";
1429 
1430         loadPageVerifyTitle2(html);
1431     }
1432 
1433 
1434     /**
1435      * @throws Exception if an error occurs
1436      */
1437     @Test
1438     @Alerts({"div-02", "div-03", "div-01", "article-01", "null"})
1439     public void closest() throws Exception {
1440         final String html = DOCTYPE_HTML
1441             + "<html><head>\n"
1442             + "<script>\n"
1443             + LOG_TITLE_FUNCTION
1444             + "  function test() {\n"
1445             + "    var el = document.getElementById('div-03');\n"
1446             + "    if (!el.closest) { log('no closest'); return }\n"
1447 
1448             + "    log(el.closest('#div-02').id);\n"
1449             + "    log(el.closest('div div').id);\n"
1450             + "    log(el.closest('article > div').id);\n"
1451             + "    log(el.closest(':not(div)').id);\n"
1452 
1453             + "    log(el.closest('span'));\n"
1454             + "  }\n"
1455             + "</script>\n"
1456             + "</head>\n"
1457             + "<body onload='test()'>\n"
1458             + "  <article id='article-01'>\n"
1459             + "    <div id='div-01'>Here is div-01\n"
1460             + "      <div id='div-02'>Here is div-02\n"
1461             + "        <div id='div-03'>Here is div-03</div>\n"
1462             + "      </div>\n"
1463             + "    </div>\n"
1464             + "  </article>\n"
1465             + "</body></html>";
1466 
1467         loadPageVerifyTitle2(html);
1468     }
1469 
1470     /**
1471      * @throws Exception if the test fails
1472      */
1473     @Test
1474     @Alerts({"false", "true", "true", "true", "false", "false"})
1475     public void toggleAttribute() throws Exception {
1476         final String html = DOCTYPE_HTML
1477             + "<html><head><script>\n"
1478             + LOG_TITLE_FUNCTION
1479             + "  function test() {\n"
1480             + "    var d0 = document.getElementById('div0');\n"
1481 
1482             + "    if (!d0.toggleAttribute) { log('toggleAttribute missing'); return; }\n"
1483             + "    d0.toggleAttribute('hidden');"
1484             + "    log(d0.hidden);\n"
1485 
1486             + "    var d1 = document.getElementById('div1');"
1487             + "    d1.toggleAttribute('hidden');"
1488             + "    log(d1.hidden);\n"
1489             + "    var d2 = document.getElementById('div2');"
1490             + "    d2.toggleAttribute('hidden', true);"
1491             + "    log(d2.hidden);\n"
1492             + "    var d3 = document.getElementById('div3');"
1493             + "    d3.toggleAttribute('hidden', true);"
1494             + "    log(d3.hidden);\n"
1495             + "    var d4 = document.getElementById('div4');"
1496             + "    d4.toggleAttribute('hidden', false);"
1497             + "    log(d4.hidden);\n"
1498             + "    var d5 = document.getElementById('div5');"
1499             + "    d5.toggleAttribute('hidden', false);"
1500             + "    log(d5.hidden);\n"
1501             + "  }\n"
1502             + "</script></head>\n"
1503             + "<body onload='test()'>\n"
1504             + "  <div id='div0' hidden />\n"
1505             + "  <div id='div1' />\n"
1506             + "  <div id='div2' hidden/>\n"
1507             + "  <div id='div3' />\n"
1508             + "  <div id='div4' hidden />\n"
1509             + "  <div id='div5' />\n"
1510             + "</body></html>";
1511 
1512         loadPageVerifyTitle2(html);
1513     }
1514 
1515     /**
1516      * @throws Exception if the test fails
1517      */
1518     @Test
1519     @Alerts({"1", "1", "<div id=\"div1\"></div>"})
1520     public void after_noArgs_empty() throws Exception {
1521         modifySiblings("after", "after();", "");
1522     }
1523 
1524     /**
1525      * @throws Exception if the test fails
1526      */
1527     @Test
1528     @Alerts({"1", "1", "#HtmlUnit"})
1529     public void after_noArgs_notEmpty() throws Exception {
1530         modifySiblings("after", "after();", "HtmlUnit");
1531     }
1532 
1533     /**
1534      * @throws Exception if the test fails
1535      */
1536     @Test
1537     @Alerts({"1", "2", "<div id=\"div1\"></div>", "#HeHo",
1538              "childList", "1", "0", "[object HTMLDivElement]", "null"})
1539     @HtmlUnitNYI(CHROME = {"1", "2", "<div id=\"div1\"></div>", "#HeHo"},
1540             EDGE = {"1", "2", "<div id=\"div1\"></div>", "#HeHo"},
1541             FF = {"1", "2", "<div id=\"div1\"></div>", "#HeHo"},
1542             FF_ESR = {"1", "2", "<div id=\"div1\"></div>", "#HeHo"})
1543     public void after_text_empty() throws Exception {
1544         modifySiblings("after", "after('HeHo');", "");
1545     }
1546 
1547     /**
1548      * @throws Exception if the test fails
1549      */
1550     @Test
1551     @Alerts({"1", "2", "#HtmlUnit", "#HeHo",
1552              "childList", "1", "0", "[object HTMLDivElement]", "null"})
1553     @HtmlUnitNYI(CHROME = {"1", "2", "#HtmlUnit", "#HeHo"},
1554             EDGE = {"1", "2", "#HtmlUnit", "#HeHo"},
1555             FF = {"1", "2", "#HtmlUnit", "#HeHo"},
1556             FF_ESR = {"1", "2", "#HtmlUnit", "#HeHo"})
1557     public void after_text_notEmpty() throws Exception {
1558         modifySiblings("after", "after('HeHo');", "HtmlUnit");
1559     }
1560 
1561     /**
1562      * @throws Exception if the test fails
1563      */
1564     @Test
1565     @Alerts({"1", "2", "<div id=\"div1\"></div>", "<p></p>",
1566              "childList", "1", "0", "[object HTMLDivElement]", "null"})
1567     @HtmlUnitNYI(CHROME =  {"1", "2", "<div id=\"div1\"></div>", "<p></p>"},
1568             EDGE = {"1", "2", "<div id=\"div1\"></div>", "<p></p>"},
1569             FF = {"1", "2", "<div id=\"div1\"></div>", "<p></p>"},
1570             FF_ESR = {"1", "2", "<div id=\"div1\"></div>", "<p></p>"})
1571     public void after_p_empty() throws Exception {
1572         modifySiblings("after", "after(p0);", "");
1573     }
1574 
1575     /**
1576      * @throws Exception if the test fails
1577      */
1578     @Test
1579     @Alerts({"1", "2", "#HtmlUnit", "<p></p>",
1580              "childList", "1", "0", "[object HTMLDivElement]", "null"})
1581     @HtmlUnitNYI(CHROME = {"1", "2", "#HtmlUnit", "<p></p>"},
1582             EDGE = {"1", "2", "#HtmlUnit", "<p></p>"},
1583             FF = {"1", "2", "#HtmlUnit", "<p></p>"},
1584             FF_ESR = {"1", "2", "#HtmlUnit", "<p></p>"})
1585     public void after_p_notEmpty() throws Exception {
1586         modifySiblings("after", "after(p0);", "HtmlUnit");
1587     }
1588 
1589     /**
1590      * @throws Exception if the test fails
1591      */
1592     @Test
1593     @Alerts({"1", "2", "<div id=\"div1\"></div>", "#[object Object]",
1594              "childList", "1", "0", "[object HTMLDivElement]", "null"})
1595     @HtmlUnitNYI(CHROME = {"1", "2", "<div id=\"div1\"></div>", "#[object Object]"},
1596             EDGE = {"1", "2", "<div id=\"div1\"></div>", "#[object Object]"},
1597             FF = {"1", "2", "<div id=\"div1\"></div>", "#[object Object]"},
1598             FF_ESR = {"1", "2", "<div id=\"div1\"></div>", "#[object Object]"})
1599     public void after_o_empty() throws Exception {
1600         modifySiblings("after", "after({o: 1});", "");
1601     }
1602 
1603     /**
1604      * @throws Exception if the test fails
1605      */
1606     @Test
1607     @Alerts({"1", "2", "#HtmlUnit", "#[object Object]",
1608              "childList", "1", "0", "[object HTMLDivElement]", "null"})
1609     @HtmlUnitNYI(CHROME = {"1", "2", "#HtmlUnit", "#[object Object]"},
1610             EDGE = {"1", "2", "#HtmlUnit", "#[object Object]"},
1611             FF = {"1", "2", "#HtmlUnit", "#[object Object]"},
1612             FF_ESR = {"1", "2", "#HtmlUnit", "#[object Object]"})
1613     public void after_o_notEmpty() throws Exception {
1614         modifySiblings("after", "after({o: 1});", "HtmlUnit");
1615     }
1616 
1617     /**
1618      * @throws Exception if the test fails
1619      */
1620     @Test
1621     @Alerts({"1", "4", "#HtmlUnit", "#abcd", "<p></p>", "#[object Object]",
1622              "childList", "3", "0", "[object HTMLDivElement]", "null"})
1623     @HtmlUnitNYI(CHROME = {"1", "4", "#HtmlUnit", "#abcd", "<p></p>", "#[object Object]"},
1624             EDGE = {"1", "4", "#HtmlUnit", "#abcd", "<p></p>", "#[object Object]"},
1625             FF = {"1", "4", "#HtmlUnit", "#abcd", "<p></p>", "#[object Object]"},
1626             FF_ESR = {"1", "4", "#HtmlUnit", "#abcd", "<p></p>", "#[object Object]"})
1627     public void after_many_notEmpty() throws Exception {
1628         modifySiblings("after", "after(p0, 'abcd', p0, {o: 1});", "HtmlUnit");
1629     }
1630 
1631     /**
1632      * @throws Exception if the test fails
1633      */
1634     @Test
1635     @Alerts({"1", "1", "<div id=\"div1\"></div>"})
1636     public void before_noArgs_empty() throws Exception {
1637         modifySiblings("before", "before();", "");
1638     }
1639 
1640     /**
1641      * @throws Exception if the test fails
1642      */
1643     @Test
1644     @Alerts({"1", "1", "#HtmlUnit"})
1645     public void before_noArgs_notEmpty() throws Exception {
1646         modifySiblings("before", "before();", "HtmlUnit");
1647     }
1648 
1649     /**
1650      * @throws Exception if the test fails
1651      */
1652     @Test
1653     @Alerts({"1", "2",  "#HeHo", "<div id=\"div1\"></div>",
1654              "childList", "1", "0", "null", "[object HTMLDivElement]"})
1655     @HtmlUnitNYI(CHROME = {"1", "2",  "#HeHo", "<div id=\"div1\"></div>"},
1656             EDGE = {"1", "2",  "#HeHo", "<div id=\"div1\"></div>"},
1657             FF = {"1", "2",  "#HeHo", "<div id=\"div1\"></div>"},
1658             FF_ESR = {"1", "2",  "#HeHo", "<div id=\"div1\"></div>"})
1659     public void before_text_empty() throws Exception {
1660         modifySiblings("before", "before('HeHo');", "");
1661     }
1662 
1663     /**
1664      * @throws Exception if the test fails
1665      */
1666     @Test
1667     @Alerts({"1", "2", "#HeHo", "#HtmlUnit",
1668              "childList", "1", "0", "null", "[object HTMLDivElement]"})
1669     @HtmlUnitNYI(CHROME = {"1", "2", "#HeHo", "#HtmlUnit"},
1670             EDGE = {"1", "2", "#HeHo", "#HtmlUnit"},
1671             FF = {"1", "2", "#HeHo", "#HtmlUnit"},
1672             FF_ESR = {"1", "2", "#HeHo", "#HtmlUnit"})
1673     public void before_text_notEmpty() throws Exception {
1674         modifySiblings("before", "before('HeHo');", "HtmlUnit");
1675     }
1676 
1677     /**
1678      * @throws Exception if the test fails
1679      */
1680     @Test
1681     @Alerts({"1", "2",  "<p></p>", "<div id=\"div1\"></div>",
1682              "childList", "1", "0", "null", "[object HTMLDivElement]"})
1683     @HtmlUnitNYI(CHROME = {"1", "2",  "<p></p>", "<div id=\"div1\"></div>"},
1684             EDGE = {"1", "2",  "<p></p>", "<div id=\"div1\"></div>"},
1685             FF = {"1", "2",  "<p></p>", "<div id=\"div1\"></div>"},
1686             FF_ESR = {"1", "2",  "<p></p>", "<div id=\"div1\"></div>"})
1687     public void before_p_empty() throws Exception {
1688         modifySiblings("before", "before(p0);", "");
1689     }
1690 
1691     /**
1692      * @throws Exception if the test fails
1693      */
1694     @Test
1695     @Alerts({"1", "2", "<p></p>", "#HtmlUnit",
1696              "childList", "1", "0", "null", "[object HTMLDivElement]"})
1697     @HtmlUnitNYI(CHROME = {"1", "2", "<p></p>", "#HtmlUnit"},
1698             EDGE = {"1", "2", "<p></p>", "#HtmlUnit"},
1699             FF = {"1", "2", "<p></p>", "#HtmlUnit"},
1700             FF_ESR = {"1", "2", "<p></p>", "#HtmlUnit"})
1701     public void before_p_notEmpty() throws Exception {
1702         modifySiblings("before", "before(p0);", "HtmlUnit");
1703     }
1704 
1705     /**
1706      * @throws Exception if the test fails
1707      */
1708     @Test
1709     @Alerts({"1", "2", "#[object Object]", "<div id=\"div1\"></div>",
1710              "childList", "1", "0", "null", "[object HTMLDivElement]"})
1711     @HtmlUnitNYI(CHROME = {"1", "2", "#[object Object]", "<div id=\"div1\"></div>"},
1712             EDGE = {"1", "2", "#[object Object]", "<div id=\"div1\"></div>"},
1713             FF = {"1", "2", "#[object Object]", "<div id=\"div1\"></div>"},
1714             FF_ESR = {"1", "2", "#[object Object]", "<div id=\"div1\"></div>"})
1715     public void before_o_empty() throws Exception {
1716         modifySiblings("before", "before({o: 1});", "");
1717     }
1718 
1719     /**
1720      * @throws Exception if the test fails
1721      */
1722     @Test
1723     @Alerts({"1", "2", "#[object Object]", "#HtmlUnit",
1724              "childList", "1", "0", "null", "[object HTMLDivElement]"})
1725     @HtmlUnitNYI(CHROME = {"1", "2", "#[object Object]", "#HtmlUnit"},
1726             EDGE = {"1", "2", "#[object Object]", "#HtmlUnit"},
1727             FF = {"1", "2", "#[object Object]", "#HtmlUnit"},
1728             FF_ESR = {"1", "2", "#[object Object]", "#HtmlUnit"})
1729     public void before_o_notEmpty() throws Exception {
1730         modifySiblings("before", "before({o: 1});", "HtmlUnit");
1731     }
1732 
1733     /**
1734      * @throws Exception if the test fails
1735      */
1736     @Test
1737     @Alerts({"1", "4", "#abcd", "<p></p>", "#[object Object]", "#HtmlUnit",
1738              "childList", "3", "0", "null", "[object HTMLDivElement]"})
1739     @HtmlUnitNYI(CHROME = {"1", "4", "#abcd", "<p></p>", "#[object Object]", "#HtmlUnit"},
1740             EDGE = {"1", "4", "#abcd", "<p></p>", "#[object Object]", "#HtmlUnit"},
1741             FF = {"1", "4", "#abcd", "<p></p>", "#[object Object]", "#HtmlUnit"},
1742             FF_ESR = {"1", "4", "#abcd", "<p></p>", "#[object Object]", "#HtmlUnit"})
1743     public void before_many_notEmpty() throws Exception {
1744         modifySiblings("before", "before(p0, 'abcd', p0, {o: 1});", "HtmlUnit");
1745     }
1746 
1747     /**
1748      * @throws Exception if the test fails
1749      */
1750     @Test
1751     @Alerts({"1", "0",
1752              "childList", "0", "1", "null", "null"})
1753     @HtmlUnitNYI(CHROME = {"1", "0"},
1754             EDGE = {"1", "0"},
1755             FF = {"1", "0"},
1756             FF_ESR = {"1", "0"})
1757     public void replaceWith_noArgs_empty() throws Exception {
1758         modifySiblings("replaceWith", "replaceWith();", "");
1759     }
1760 
1761     /**
1762      * @throws Exception if the test fails
1763      */
1764     @Test
1765     @Alerts({"1", "1", "#HeHo",
1766              "childList", "1", "1", "null", "null"})
1767     @HtmlUnitNYI(CHROME = {"1", "1", "#HeHo"},
1768             EDGE = {"1", "1", "#HeHo"},
1769             FF = {"1", "1", "#HeHo"},
1770             FF_ESR = {"1", "1", "#HeHo"})
1771     public void replaceWith_text_notEmpty() throws Exception {
1772         modifySiblings("replaceWith", "replaceWith('HeHo');", "HtmlUnit");
1773     }
1774 
1775     /**
1776      * @throws Exception if the test fails
1777      */
1778     @Test
1779     @Alerts({"1", "1", "#HeHo",
1780              "childList", "1", "1", "null", "null"})
1781     @HtmlUnitNYI(CHROME = {"1", "1", "#HeHo"},
1782             EDGE = {"1", "1", "#HeHo"},
1783             FF = {"1", "1", "#HeHo"},
1784             FF_ESR = {"1", "1", "#HeHo"})
1785     public void replaceWith_text_empty() throws Exception {
1786         modifySiblings("replaceWith", "replaceWith('HeHo');", "");
1787     }
1788 
1789     /**
1790      * @throws Exception if the test fails
1791      */
1792     @Test
1793     @Alerts({"1", "1", "<p></p>",
1794              "childList", "1", "1", "null", "null"})
1795     @HtmlUnitNYI(CHROME = {"1", "1", "<p></p>"},
1796             EDGE = {"1", "1", "<p></p>"},
1797             FF = {"1", "1", "<p></p>"},
1798             FF_ESR = {"1", "1", "<p></p>"})
1799     public void replaceWith_p_notEmpty() throws Exception {
1800         modifySiblings("replaceWith", "replaceWith(p0);", "HtmlUnit");
1801     }
1802 
1803     /**
1804      * @throws Exception if the test fails
1805      */
1806     @Test
1807     @Alerts({"1", "1", "<p></p>",
1808              "childList", "1", "1", "null", "null"})
1809     @HtmlUnitNYI(CHROME = {"1", "1", "<p></p>"},
1810             EDGE = {"1", "1", "<p></p>"},
1811             FF = {"1", "1", "<p></p>"},
1812             FF_ESR = {"1", "1", "<p></p>"})
1813     public void replaceWith_p_empty() throws Exception {
1814         modifySiblings("replaceWith", "replaceWith(p0);", "");
1815     }
1816 
1817     /**
1818      * @throws Exception if the test fails
1819      */
1820     @Test
1821     @Alerts({"1", "1", "#[object Object]",
1822              "childList", "1", "1", "null", "null"})
1823     @HtmlUnitNYI(CHROME = {"1", "1", "#[object Object]"},
1824             EDGE = {"1", "1", "#[object Object]"},
1825             FF = {"1", "1", "#[object Object]"},
1826             FF_ESR = {"1", "1", "#[object Object]"})
1827     public void replaceWith_o_notEmpty() throws Exception {
1828         modifySiblings("replaceWith", "replaceWith({o: 1});", "HtmlUnit");
1829     }
1830 
1831     /**
1832      * @throws Exception if the test fails
1833      */
1834     @Test
1835     @Alerts({"1", "1", "#[object Object]",
1836              "childList", "1", "1", "null", "null"})
1837     @HtmlUnitNYI(CHROME = {"1", "1", "#[object Object]"},
1838             EDGE = {"1", "1", "#[object Object]"},
1839             FF = {"1", "1", "#[object Object]"},
1840             FF_ESR = {"1", "1", "#[object Object]"})
1841     public void replaceWith_o_empty() throws Exception {
1842         modifySiblings("replaceWith", "replaceWith({o: 1});", "");
1843     }
1844 
1845     /**
1846      * @throws Exception if the test fails
1847      */
1848     @Test
1849     @Alerts({"1", "4", "<p></p>", "#abcd", "<div></div>", "#[object Object]",
1850              "childList", "4", "1", "null", "null"})
1851     @HtmlUnitNYI(CHROME = {"1", "4", "<p></p>", "#abcd", "<div></div>", "#[object Object]"},
1852             EDGE = {"1", "4", "<p></p>", "#abcd", "<div></div>", "#[object Object]"},
1853             FF = {"1", "4", "<p></p>", "#abcd", "<div></div>", "#[object Object]"},
1854             FF_ESR = {"1", "4", "<p></p>", "#abcd", "<div></div>", "#[object Object]"})
1855     public void replaceWith_many_notEmpty() throws Exception {
1856         modifySiblings("replaceWith", "replaceWith(p0, 'abcd', div1, {o: 1});", "HtmlUnit");
1857     }
1858 
1859     /**
1860      * @throws Exception if the test fails
1861      */
1862     @Test
1863     @Alerts({"1", "3", "<p></p>", "#abcd", "<div></div>",
1864              "childList", "3", "1", "null", "null"})
1865     @HtmlUnitNYI(CHROME = {"1", "3", "<p></p>", "#abcd", "<div></div>"},
1866             EDGE = {"1", "3", "<p></p>", "#abcd", "<div></div>"},
1867             FF = {"1", "3", "<p></p>", "#abcd", "<div></div>"},
1868             FF_ESR = {"1", "3", "<p></p>", "#abcd", "<div></div>"})
1869     public void replaceWith_many_many() throws Exception {
1870         modifySiblings("replaceWith", "replaceWith(p0, 'abcd', div1);", "<p>a</p><p>b</p>");
1871     }
1872 
1873     private void modifySiblings(final String check, final String call, final String content) throws Exception {
1874         final String html = DOCTYPE_HTML
1875             + "<html><head></head>\n"
1876             + "<body>\n"
1877             + "  <div id='div0'><div id='div1'>" + content + "</div></div>\n"
1878 
1879             + "<script>\n"
1880             + LOG_TITLE_FUNCTION
1881 
1882             + "  function test() {\n"
1883 
1884             + "    var config = { attributes: true, childList: true, characterData: true, subtree: true };\n"
1885             + "    var observer = new MutationObserver(function(mutations) {\n"
1886             + "      mutations.forEach(function(mutation) {\n"
1887             + "        log(mutation.type);\n"
1888             + "        log(mutation.addedNodes ? mutation.addedNodes.length : mutation.addedNodes);\n"
1889             + "        log(mutation.removedNodes ? mutation.removedNodes.length : mutation.removedNodes);\n"
1890             + "        log(mutation.previousSibling);\n"
1891             + "        log(mutation.nextSibling);\n"
1892             + "      });\n"
1893             + "    });\n"
1894             + "    observer.observe(document.getElementById('div0'), config);\n"
1895 
1896             + "    var d0 = document.getElementById('div0');\n"
1897             + "    var d1 = document.getElementById('div1');\n"
1898 
1899             + "    if (!d1." + check + ") { log('" + check + " missing'); return; }\n"
1900 
1901             + "    var p0 = document.createElement('p');\n"
1902             + "    var div1 = document.createElement('div');\n"
1903 
1904             + "    var children = d0.childNodes;\n"
1905             + "    log(children.length);\n"
1906             + "    d1." + call + "\n"
1907             + "    log(children.length);\n"
1908             + "    for(var i = 0; i < children.length; i++) {\n"
1909             + "      var child = children[i];\n"
1910             + "      if (child.textContent) {\n"
1911             + "        log('#' + child.textContent);\n"
1912             + "      } else {"
1913             + "        log(child.outerHTML);\n"
1914             + "      }\n"
1915             + "    }\n"
1916 
1917             + "  }\n"
1918 
1919             + "  test();"
1920             + "</script>\n"
1921 
1922             + "</body></html>";
1923 
1924         loadPageVerifyTitle2(html);
1925     }
1926 
1927     /**
1928      * @throws Exception if the test fails
1929      */
1930     @Test
1931     @Alerts({"0", "0"})
1932     public void append_noArgs_empty() throws Exception {
1933         modifyChildren("append", "append();", "");
1934     }
1935 
1936     /**
1937      * @throws Exception if the test fails
1938      */
1939     @Test
1940     @Alerts({"1", "1", "#HtmlUnit"})
1941     public void append_noArgs_notEmpty() throws Exception {
1942         modifyChildren("append", "append();", "HtmlUnit");
1943     }
1944 
1945     /**
1946      * @throws Exception if the test fails
1947      */
1948     @Test
1949     @Alerts({"0", "1", "#HeHo",
1950              "childList", "1", "0", "null", "null"})
1951     @HtmlUnitNYI(CHROME = {"0", "1", "#HeHo"},
1952             EDGE = {"0", "1", "#HeHo"},
1953             FF = {"0", "1", "#HeHo"},
1954             FF_ESR = {"0", "1", "#HeHo"})
1955     public void append_text_empty() throws Exception {
1956         modifyChildren("append", "append('HeHo');", "");
1957     }
1958 
1959     /**
1960      * @throws Exception if the test fails
1961      */
1962     @Test
1963     @Alerts({"1", "2", "#HtmlUnit", "#HeHo",
1964              "childList", "1", "0", "[object Text]", "null"})
1965     @HtmlUnitNYI(CHROME = {"1", "2", "#HtmlUnit", "#HeHo"},
1966             EDGE = {"1", "2", "#HtmlUnit", "#HeHo"},
1967             FF = {"1", "2", "#HtmlUnit", "#HeHo"},
1968             FF_ESR = {"1", "2", "#HtmlUnit", "#HeHo"})
1969     public void append_text_notEmpty() throws Exception {
1970         modifyChildren("append", "append('HeHo');", "HtmlUnit");
1971     }
1972 
1973     /**
1974      * @throws Exception if the test fails
1975      */
1976     @Test
1977     @Alerts({"0", "1", "<p></p>",
1978              "childList", "1", "0", "null", "null"})
1979     @HtmlUnitNYI(CHROME = {"0", "1", "<p></p>"},
1980             EDGE = {"0", "1", "<p></p>"},
1981             FF = {"0", "1", "<p></p>"},
1982             FF_ESR = {"0", "1", "<p></p>"})
1983     public void append_p_empty() throws Exception {
1984         modifyChildren("append", "append(p0);", "");
1985     }
1986 
1987     /**
1988      * @throws Exception if the test fails
1989      */
1990     @Test
1991     @Alerts({"1", "2", "#HtmlUnit", "<p></p>",
1992              "childList", "1", "0", "[object Text]", "null"})
1993     @HtmlUnitNYI(CHROME = {"1", "2", "#HtmlUnit", "<p></p>"},
1994             EDGE = {"1", "2", "#HtmlUnit", "<p></p>"},
1995             FF = {"1", "2", "#HtmlUnit", "<p></p>"},
1996             FF_ESR = {"1", "2", "#HtmlUnit", "<p></p>"})
1997     public void append_p_notEmpty() throws Exception {
1998         modifyChildren("append", "append(p0);", "HtmlUnit");
1999     }
2000 
2001     /**
2002      * @throws Exception if the test fails
2003      */
2004     @Test
2005     @Alerts({"0", "1", "#[object Object]",
2006              "childList", "1", "0", "null", "null"})
2007     @HtmlUnitNYI(CHROME = {"0", "1", "#[object Object]"},
2008             EDGE = {"0", "1", "#[object Object]"},
2009             FF = {"0", "1", "#[object Object]"},
2010             FF_ESR = {"0", "1", "#[object Object]"})
2011     public void append_o_empty() throws Exception {
2012         modifyChildren("append", "append({o: 1});", "");
2013     }
2014 
2015     /**
2016      * @throws Exception if the test fails
2017      */
2018     @Test
2019     @Alerts({"1", "2", "#HtmlUnit", "#[object Object]",
2020              "childList", "1", "0", "[object Text]", "null"})
2021     @HtmlUnitNYI(CHROME = {"1", "2", "#HtmlUnit", "#[object Object]"},
2022             EDGE = {"1", "2", "#HtmlUnit", "#[object Object]"},
2023             FF = {"1", "2", "#HtmlUnit", "#[object Object]"},
2024             FF_ESR = {"1", "2", "#HtmlUnit", "#[object Object]"})
2025     public void append_o_notEmpty() throws Exception {
2026         modifyChildren("append", "append({o: 1});", "HtmlUnit");
2027     }
2028 
2029     /**
2030      * @throws Exception if the test fails
2031      */
2032     @Test
2033     @Alerts({"1", "4", "#HtmlUnit", "#abcd", "<p></p>", "#[object Object]",
2034              "childList", "3", "0", "[object Text]", "null"})
2035     @HtmlUnitNYI(CHROME = {"1", "4", "#HtmlUnit", "#abcd", "<p></p>", "#[object Object]"},
2036             EDGE = {"1", "4", "#HtmlUnit", "#abcd", "<p></p>", "#[object Object]"},
2037             FF = {"1", "4", "#HtmlUnit", "#abcd", "<p></p>", "#[object Object]"},
2038             FF_ESR = {"1", "4", "#HtmlUnit", "#abcd", "<p></p>", "#[object Object]"})
2039     public void append_many_notEmpty() throws Exception {
2040         modifyChildren("append", "append(p0, 'abcd', p0, {o: 1});", "HtmlUnit");
2041     }
2042 
2043     /**
2044      * @throws Exception if the test fails
2045      */
2046     @Test
2047     @Alerts({"0", "0"})
2048     public void prepend_noArgs_empty() throws Exception {
2049         modifyChildren("prepend", "prepend();", "");
2050     }
2051 
2052     /**
2053      * @throws Exception if the test fails
2054      */
2055     @Test
2056     @Alerts({"1", "1", "#HtmlUnit"})
2057     public void prepend_noArgs_notEmpty() throws Exception {
2058         modifyChildren("prepend", "prepend();", "HtmlUnit");
2059     }
2060 
2061     /**
2062      * @throws Exception if the test fails
2063      */
2064     @Test
2065     @Alerts({"0", "1", "#HeHo",
2066              "childList", "1", "0", "null", "null"})
2067     @HtmlUnitNYI(CHROME = {"0", "1", "#HeHo"},
2068             EDGE = {"0", "1", "#HeHo"},
2069             FF = {"0", "1", "#HeHo"},
2070             FF_ESR = {"0", "1", "#HeHo"})
2071     public void prepend_text_empty() throws Exception {
2072         modifyChildren("prepend", "prepend('HeHo');", "");
2073     }
2074 
2075     /**
2076      * @throws Exception if the test fails
2077      */
2078     @Test
2079     @Alerts({"1", "2", "#HeHo", "#HtmlUnit",
2080              "childList", "1", "0", "null", "[object Text]"})
2081     @HtmlUnitNYI(CHROME = {"1", "2", "#HeHo", "#HtmlUnit"},
2082             EDGE = {"1", "2", "#HeHo", "#HtmlUnit"},
2083             FF = {"1", "2", "#HeHo", "#HtmlUnit"},
2084             FF_ESR = {"1", "2", "#HeHo", "#HtmlUnit"})
2085     public void prepend_text_notEmpty() throws Exception {
2086         modifyChildren("prepend", "prepend('HeHo');", "HtmlUnit");
2087     }
2088 
2089     /**
2090      * @throws Exception if the test fails
2091      */
2092     @Test
2093     @Alerts({"0", "1", "<p></p>",
2094              "childList", "1", "0", "null", "null"})
2095     @HtmlUnitNYI(CHROME = {"0", "1", "<p></p>"},
2096             EDGE = {"0", "1", "<p></p>"},
2097             FF = {"0", "1", "<p></p>"},
2098             FF_ESR = {"0", "1", "<p></p>"})
2099     public void prepend_p_empty() throws Exception {
2100         modifyChildren("prepend", "prepend(p0);", "");
2101     }
2102 
2103     /**
2104      * @throws Exception if the test fails
2105      */
2106     @Test
2107     @Alerts({"1", "2", "<p></p>", "#HtmlUnit",
2108              "childList", "1", "0", "null", "[object Text]"})
2109     @HtmlUnitNYI(CHROME = {"1", "2", "<p></p>", "#HtmlUnit"},
2110             EDGE = {"1", "2", "<p></p>", "#HtmlUnit"},
2111             FF = {"1", "2", "<p></p>", "#HtmlUnit"},
2112             FF_ESR = {"1", "2", "<p></p>", "#HtmlUnit"})
2113     public void prepend_p_notEmpty() throws Exception {
2114         modifyChildren("prepend", "prepend(p0);", "HtmlUnit");
2115     }
2116 
2117     /**
2118      * @throws Exception if the test fails
2119      */
2120     @Test
2121     @Alerts({"0", "1", "#[object Object]",
2122              "childList", "1", "0", "null", "null"})
2123     @HtmlUnitNYI(CHROME = {"0", "1", "#[object Object]"},
2124             EDGE = {"0", "1", "#[object Object]"},
2125             FF = {"0", "1", "#[object Object]"},
2126             FF_ESR = {"0", "1", "#[object Object]"})
2127     public void prepend_o_empty() throws Exception {
2128         modifyChildren("prepend", "prepend({o: 1});", "");
2129     }
2130 
2131     /**
2132      * @throws Exception if the test fails
2133      */
2134     @Test
2135     @Alerts({"1", "2", "#[object Object]", "#HtmlUnit",
2136              "childList", "1", "0", "null", "[object Text]"})
2137     @HtmlUnitNYI(CHROME = {"1", "2", "#[object Object]", "#HtmlUnit"},
2138             EDGE = {"1", "2", "#[object Object]", "#HtmlUnit"},
2139             FF = {"1", "2", "#[object Object]", "#HtmlUnit"},
2140             FF_ESR = {"1", "2", "#[object Object]", "#HtmlUnit"})
2141     public void prepend_o_notEmpty() throws Exception {
2142         modifyChildren("prepend", "prepend({o: 1});", "HtmlUnit");
2143     }
2144 
2145     /**
2146      * @throws Exception if the test fails
2147      */
2148     @Test
2149     @Alerts({"1", "4", "#abcd", "<p></p>", "#[object Object]", "#HtmlUnit",
2150              "childList", "3", "0", "null", "[object Text]"})
2151     @HtmlUnitNYI(CHROME = {"1", "4", "#abcd", "<p></p>", "#[object Object]", "#HtmlUnit"},
2152             EDGE = {"1", "4", "#abcd", "<p></p>", "#[object Object]", "#HtmlUnit"},
2153             FF = {"1", "4", "#abcd", "<p></p>", "#[object Object]", "#HtmlUnit"},
2154             FF_ESR = {"1", "4", "#abcd", "<p></p>", "#[object Object]", "#HtmlUnit"})
2155     public void prepend_many_notEmpty() throws Exception {
2156         modifyChildren("prepend", "prepend(p0, 'abcd', p0, {o: 1});", "HtmlUnit");
2157     }
2158 
2159     /**
2160      * @throws Exception if the test fails
2161      */
2162     @Test
2163     @Alerts({"0", "0"})
2164     public void replaceChildren_noArgs_empty() throws Exception {
2165         modifyChildren("replaceChildren", "replaceChildren();", "");
2166     }
2167 
2168     /**
2169      * @throws Exception if the test fails
2170      */
2171     @Test
2172     @Alerts({"1", "1", "#HeHo",
2173              "childList", "1", "1", "null", "null"})
2174     @HtmlUnitNYI(CHROME = {"1", "1", "#HeHo"},
2175             EDGE = {"1", "1", "#HeHo"},
2176             FF = {"1", "1", "#HeHo"},
2177             FF_ESR = {"1", "1", "#HeHo"})
2178     public void replaceChildren_text_notEmpty() throws Exception {
2179         modifyChildren("replaceChildren", "replaceChildren('HeHo');", "HtmlUnit");
2180     }
2181 
2182     /**
2183      * @throws Exception if the test fails
2184      */
2185     @Test
2186     @Alerts({"0", "1", "#HeHo",
2187              "childList", "1", "0", "null", "null"})
2188     @HtmlUnitNYI(CHROME = {"0", "1", "#HeHo"},
2189             EDGE = {"0", "1", "#HeHo"},
2190             FF = {"0", "1", "#HeHo"},
2191             FF_ESR = {"0", "1", "#HeHo"})
2192     public void replaceChildren_text_empty() throws Exception {
2193         modifyChildren("replaceChildren", "replaceChildren('HeHo');", "");
2194     }
2195 
2196     /**
2197      * @throws Exception if the test fails
2198      */
2199     @Test
2200     @Alerts({"1", "1", "<p></p>",
2201              "childList", "1", "1", "null", "null"})
2202     @HtmlUnitNYI(CHROME = {"1", "1", "<p></p>"},
2203             EDGE = {"1", "1", "<p></p>"},
2204             FF = {"1", "1", "<p></p>"},
2205             FF_ESR = {"1", "1", "<p></p>"})
2206     public void replaceChildren_p_notEmpty() throws Exception {
2207         modifyChildren("replaceChildren", "replaceChildren(p0);", "HtmlUnit");
2208     }
2209 
2210     /**
2211      * @throws Exception if the test fails
2212      */
2213     @Test
2214     @Alerts({"0", "1", "<p></p>",
2215              "childList", "1", "0", "null", "null"})
2216     @HtmlUnitNYI(CHROME = {"0", "1", "<p></p>"},
2217             EDGE = {"0", "1", "<p></p>"},
2218             FF = {"0", "1", "<p></p>"},
2219             FF_ESR = {"0", "1", "<p></p>"})
2220     public void replaceChildren_p_empty() throws Exception {
2221         modifyChildren("replaceChildren", "replaceChildren(p0);", "");
2222     }
2223 
2224     /**
2225      * @throws Exception if the test fails
2226      */
2227     @Test
2228     @Alerts({"1", "1", "#[object Object]",
2229              "childList", "1", "1", "null", "null"})
2230     @HtmlUnitNYI(CHROME = {"1", "1", "#[object Object]"},
2231             EDGE = {"1", "1", "#[object Object]"},
2232             FF = {"1", "1", "#[object Object]"},
2233             FF_ESR = {"1", "1", "#[object Object]"})
2234     public void replaceChildren_o_notEmpty() throws Exception {
2235         modifyChildren("replaceChildren", "replaceChildren({o: 1});", "HtmlUnit");
2236     }
2237 
2238     /**
2239      * @throws Exception if the test fails
2240      */
2241     @Test
2242     @Alerts({"0", "1", "#[object Object]",
2243              "childList", "1", "0", "null", "null"})
2244     @HtmlUnitNYI(CHROME = {"0", "1", "#[object Object]"},
2245             EDGE = {"0", "1", "#[object Object]"},
2246             FF = {"0", "1", "#[object Object]"},
2247             FF_ESR = {"0", "1", "#[object Object]"})
2248     public void replaceChildren_o_empty() throws Exception {
2249         modifyChildren("replaceChildren", "replaceChildren({o: 1});", "");
2250     }
2251 
2252     /**
2253      * @throws Exception if the test fails
2254      */
2255     @Test
2256     @Alerts({"1", "4", "<p></p>", "#abcd", "<div></div>", "#[object Object]",
2257              "childList", "4", "1", "null", "null"})
2258     @HtmlUnitNYI(CHROME = {"1", "4", "<p></p>", "#abcd", "<div></div>", "#[object Object]"},
2259             EDGE = {"1", "4", "<p></p>", "#abcd", "<div></div>", "#[object Object]"},
2260             FF = {"1", "4", "<p></p>", "#abcd", "<div></div>", "#[object Object]"},
2261             FF_ESR = {"1", "4", "<p></p>", "#abcd", "<div></div>", "#[object Object]"})
2262     public void replaceChildren_many_notEmpty() throws Exception {
2263         modifyChildren("replaceChildren", "replaceChildren(p0, 'abcd', div1, {o: 1});", "HtmlUnit");
2264     }
2265 
2266     /**
2267      * @throws Exception if the test fails
2268      */
2269     @Test
2270     @Alerts({"2", "3", "<p></p>", "#abcd", "<div></div>",
2271              "childList", "3", "2", "null", "null"})
2272     @HtmlUnitNYI(CHROME = {"2", "3", "<p></p>", "#abcd", "<div></div>"},
2273             EDGE = {"2", "3", "<p></p>", "#abcd", "<div></div>"},
2274             FF = {"2", "3", "<p></p>", "#abcd", "<div></div>"},
2275             FF_ESR = {"2", "3", "<p></p>", "#abcd", "<div></div>"})
2276     public void replaceChildren_many_many() throws Exception {
2277         modifyChildren("replaceChildren", "replaceChildren(p0, 'abcd', div1);", "<p>a</p><p>b</p>");
2278     }
2279 
2280     /**
2281      * @throws Exception if the test fails
2282      */
2283     @Test
2284     @Alerts({"4", "3", "<p></p>", "#abcd", "<div></div>",
2285              "childList", "3", "4", "null", "null"})
2286     @HtmlUnitNYI(CHROME = {"4", "3", "<p></p>", "#abcd", "<div></div>"},
2287             EDGE = {"4", "3", "<p></p>", "#abcd", "<div></div>"},
2288             FF = {"4", "3", "<p></p>", "#abcd", "<div></div>"},
2289             FF_ESR = {"4", "3", "<p></p>", "#abcd", "<div></div>"})
2290     public void replaceChildren_many_many2() throws Exception {
2291         modifyChildren("replaceChildren", "replaceChildren(p0, 'abcd', div1);", "<p>a</p><p>b</p><p>c</p><p>d</p>");
2292     }
2293 
2294     private void modifyChildren(final String check, final String call, final String content) throws Exception {
2295         final String html = DOCTYPE_HTML
2296             + "<html><head></head>\n"
2297             + "<body>\n"
2298             + "  <div id='div0'>" + content + "</div>\n"
2299 
2300             + "<script>\n"
2301             + LOG_TITLE_FUNCTION
2302 
2303             + "  function test() {\n"
2304 
2305             + "    var config = { attributes: true, childList: true, characterData: true, subtree: true };\n"
2306             + "    var observer = new MutationObserver(function(mutations) {\n"
2307             + "      mutations.forEach(function(mutation) {\n"
2308             + "        log(mutation.type);\n"
2309             + "        log(mutation.addedNodes ? mutation.addedNodes.length : mutation.addedNodes);\n"
2310             + "        log(mutation.removedNodes ? mutation.removedNodes.length : mutation.removedNodes);\n"
2311             + "        log(mutation.previousSibling);\n"
2312             + "        log(mutation.nextSibling);\n"
2313             + "      });\n"
2314             + "    });\n"
2315             + "    observer.observe(document.getElementById('div0'), config);\n"
2316 
2317             + "    var d0 = document.getElementById('div0');\n"
2318 
2319             + "    if (!d0." + check + ") { log('" + check + " missing'); return; }\n"
2320 
2321             + "    var p0 = document.createElement('p');\n"
2322             + "    var div1 = document.createElement('div');\n"
2323 
2324             + "    var children = d0.childNodes;\n"
2325             + "    log(children.length);\n"
2326             + "    d0." + call + "\n"
2327             + "    log(children.length);\n"
2328             + "    for(var i = 0; i < children.length; i++) {\n"
2329             + "      var child = children[i];\n"
2330             + "      if (child.textContent) {\n"
2331             + "        log('#' + child.textContent);\n"
2332             + "      } else {"
2333             + "        log(child.outerHTML);\n"
2334             + "      }\n"
2335             + "    }\n"
2336 
2337             + "  }\n"
2338 
2339             + "  test();"
2340             + "</script>\n"
2341 
2342             + "</body></html>";
2343 
2344         loadPageVerifyTitle2(html);
2345     }
2346 
2347     /**
2348      * @throws Exception if the test fails
2349      */
2350     @Test
2351     @Alerts({"0,0", "10,30", "22,64", "5,0", "type error", "5,0", "onscroll 5,0"})
2352     @HtmlUnitNYI(CHROME = {"0,0", "onscroll 10,30", "10,30", "onscroll 22,64", "22,64",
2353                            "onscroll 5,0", "5,0", "type error", "5,0"},
2354             EDGE = {"0,0", "onscroll 10,30", "10,30", "onscroll 22,64", "22,64",
2355                     "onscroll 5,0", "5,0", "type error", "5,0"},
2356             FF = {"0,0", "onscroll 10,30", "10,30", "onscroll 22,64", "22,64",
2357                   "onscroll 5,0", "5,0", "type error", "5,0"},
2358             FF_ESR = {"0,0", "onscroll 10,30", "10,30", "onscroll 22,64", "22,64",
2359                       "onscroll 5,0", "5,0", "type error", "5,0"})
2360     public void scrollBy() throws Exception {
2361         final String html = DOCTYPE_HTML
2362             + "<html><body onload='test()'>\n"
2363             + "<div id='d' style='width: 100px;height: 99px;overflow: scroll;'>\n"
2364             + "<div style='width:10000px;height:10000px;background-color:blue;'></div>\n"
2365             + "</div>"
2366             + "<script>\n"
2367             + LOG_TITLE_FUNCTION
2368             + "function test() {\n"
2369             + "  var d = document.getElementById('d');\n"
2370             + "  d.onscroll = (event) => { log('onscroll ' + d.scrollLeft + ',' + d.scrollTop); };"
2371 
2372             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2373 
2374             + "  d.scrollBy(10, 30);\n"
2375             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2376 
2377             + "  d.scrollBy(12, 34);\n"
2378             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2379 
2380             + "  d.scrollBy(-17, -100);\n"
2381             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2382 
2383             + "  try { d.scrollBy(44); } catch(e) { log('type error'); }\n"
2384             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2385             + "}\n"
2386             + "</script></body></html>";
2387         loadPageVerifyTitle2(html);
2388     }
2389 
2390     /**
2391      * @throws Exception if the test fails
2392      */
2393     @Test
2394     @Alerts({"0,0", "10,30", "22,64", "5,0", "49,0", "49,0", "onscroll 49,0"})
2395     @HtmlUnitNYI(CHROME = {"0,0", "onscroll 10,30", "10,30", "onscroll 22,64", "22,64",
2396                            "onscroll 5,0", "5,0", "onscroll 49,0", "49,0", "onscroll 49,0", "49,0"},
2397             EDGE = {"0,0", "onscroll 10,30", "10,30", "onscroll 22,64", "22,64",
2398                     "onscroll 5,0", "5,0", "onscroll 49,0", "49,0", "onscroll 49,0", "49,0"},
2399             FF = {"0,0", "onscroll 10,30", "10,30", "onscroll 22,64", "22,64",
2400                   "onscroll 5,0", "5,0", "onscroll 49,0", "49,0", "onscroll 49,0", "49,0"},
2401             FF_ESR = {"0,0", "onscroll 10,30", "10,30", "onscroll 22,64", "22,64",
2402                       "onscroll 5,0", "5,0", "onscroll 49,0", "49,0", "onscroll 49,0", "49,0"})
2403     public void scrollByOptions() throws Exception {
2404         final String html = DOCTYPE_HTML
2405             + "<html><body onload='test()'>\n"
2406             + "<div id='d' style='width: 100px;height: 99px;overflow: scroll;'>\n"
2407             + "<div style='width:10000px;height:10000px;background-color:blue;'></div>\n"
2408             + "</div>"
2409             + "<script>\n"
2410             + LOG_TITLE_FUNCTION
2411             + "function test() {\n"
2412             + "  var d = document.getElementById('d');\n"
2413             + "  d.onscroll = (event) => { log('onscroll ' + d.scrollLeft + ',' + d.scrollTop); };"
2414 
2415             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2416 
2417             + "  d.scrollBy({left: 10, top: 30});\n"
2418             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2419 
2420             + "  d.scrollBy({left: 12, top: 34});\n"
2421             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2422 
2423             + "  d.scrollBy({left: -17, top: -100});\n"
2424             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2425 
2426             + "  d.scrollBy({left: 44});\n"
2427             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2428 
2429             + "  d.scrollBy({abcd: 7});\n"
2430             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2431             + "}\n"
2432             + "</script></body></html>";
2433         loadPageVerifyTitle2(html);
2434     }
2435 
2436     /**
2437      * @throws Exception if the test fails
2438      */
2439     @Test
2440     @Alerts({"0,0", "10,30", "12,34", "0,0", "type error", "0,0", "onscroll 0,0"})
2441     @HtmlUnitNYI(CHROME = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2442                            "onscroll 0,0", "0,0", "type error", "0,0"},
2443             EDGE = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2444                     "onscroll 0,0", "0,0", "type error", "0,0"},
2445             FF = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2446                   "onscroll 0,0", "0,0", "type error", "0,0"},
2447             FF_ESR = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2448                       "onscroll 0,0", "0,0", "type error", "0,0"})
2449     public void scrollTo() throws Exception {
2450         final String html = DOCTYPE_HTML
2451             + "<html><body onload='test()'>\n"
2452             + "<div id='d' style='width: 100px;height: 99px;overflow: scroll;'>\n"
2453             + "<div style='width:10000px;height:10000px;background-color:blue;'></div>\n"
2454             + "</div>"
2455             + "<script>\n"
2456             + LOG_TITLE_FUNCTION
2457             + "function test() {\n"
2458             + "  var d = document.getElementById('d');\n"
2459             + "  d.onscroll = (event) => { log('onscroll ' + d.scrollLeft + ',' + d.scrollTop); };"
2460 
2461             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2462 
2463             + "  d.scrollTo(10, 30);\n"
2464             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2465 
2466             + "  d.scrollTo(12, 34);\n"
2467             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2468 
2469             + "  d.scrollTo(-17, -100);\n"
2470             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2471 
2472             + "  try { d.scrollTo(44); } catch(e) { log('type error'); }\n"
2473             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2474             + "}\n"
2475             + "</script></body></html>";
2476         loadPageVerifyTitle2(html);
2477     }
2478 
2479     /**
2480      * @throws Exception if the test fails
2481      */
2482     @Test
2483     @Alerts({"0,0", "10,30", "12,34", "0,0", "44,0", "44,0", "onscroll 44,0"})
2484     @HtmlUnitNYI(CHROME = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2485                            "onscroll 0,0", "0,0", "onscroll 44,0", "44,0", "onscroll 44,0", "44,0"},
2486             EDGE = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2487                     "onscroll 0,0", "0,0", "onscroll 44,0", "44,0", "onscroll 44,0", "44,0"},
2488             FF = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2489                   "onscroll 0,0", "0,0", "onscroll 44,0", "44,0", "onscroll 44,0", "44,0"},
2490             FF_ESR = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2491                       "onscroll 0,0", "0,0", "onscroll 44,0", "44,0", "onscroll 44,0", "44,0"})
2492     public void scrollToOptions() throws Exception {
2493         final String html = DOCTYPE_HTML
2494             + "<html><body onload='test()'>\n"
2495             + "<div id='d' style='width: 100px;height: 99px;overflow: scroll;'>\n"
2496             + "<div style='width:10000px;height:10000px;background-color:blue;'></div>\n"
2497             + "</div>"
2498             + "<script>\n"
2499             + LOG_TITLE_FUNCTION
2500             + "function test() {\n"
2501             + "  var d = document.getElementById('d');\n"
2502             + "  d.onscroll = (event) => { log('onscroll ' + d.scrollLeft + ',' + d.scrollTop); };"
2503 
2504             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2505 
2506             + "  d.scrollTo({left: 10, top: 30});\n"
2507             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2508 
2509             + "  d.scrollTo({left: 12, top: 34});\n"
2510             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2511 
2512             + "  d.scrollTo({left: -17, top: -100});\n"
2513             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2514 
2515             + "  d.scrollTo({left: 44});\n"
2516             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2517 
2518             + "  d.scrollTo({abcd: 7});\n"
2519             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2520             + "}\n"
2521             + "</script></body></html>";
2522         loadPageVerifyTitle2(html);
2523     }
2524 
2525     /**
2526      * @throws Exception if the test fails
2527      */
2528     @Test
2529     @Alerts({"0,0", "10,30", "12,34", "0,0", "type error", "0,0", "onscroll 0,0"})
2530     @HtmlUnitNYI(CHROME = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2531                            "onscroll 0,0", "0,0", "type error", "0,0"},
2532             EDGE = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2533                     "onscroll 0,0", "0,0", "type error", "0,0"},
2534             FF = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2535                   "onscroll 0,0", "0,0", "type error", "0,0"},
2536             FF_ESR = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2537                       "onscroll 0,0", "0,0", "type error", "0,0"})
2538     public void scroll() throws Exception {
2539         final String html = DOCTYPE_HTML
2540             + "<html><body onload='test()'>\n"
2541             + "<div id='d' style='width: 100px;height: 99px;overflow: scroll;'>\n"
2542             + "<div style='width:10000px;height:10000px;background-color:blue;'></div>\n"
2543             + "</div>"
2544             + "<script>\n"
2545             + LOG_TITLE_FUNCTION
2546             + "function test() {\n"
2547             + "  var d = document.getElementById('d');\n"
2548             + "  d.onscroll = (event) => { log('onscroll ' + d.scrollLeft + ',' + d.scrollTop); };"
2549 
2550             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2551 
2552             + "  d.scroll(10, 30);\n"
2553             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2554 
2555             + "  d.scroll(12, 34);\n"
2556             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2557 
2558             + "  d.scroll(-17, -100);\n"
2559             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2560 
2561             + "  try { d.scroll(44); } catch(e) { log('type error'); }\n"
2562             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2563             + "}\n"
2564             + "</script></body></html>";
2565         loadPageVerifyTitle2(html);
2566     }
2567 
2568     /**
2569      * @throws Exception if the test fails
2570      */
2571     @Test
2572     @Alerts({"0,0", "10,30", "12,34", "0,0", "44,0", "44,0", "onscroll 44,0"})
2573     @HtmlUnitNYI(CHROME = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2574                            "onscroll 0,0", "0,0", "onscroll 44,0", "44,0", "onscroll 44,0", "44,0"},
2575             EDGE = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2576                     "onscroll 0,0", "0,0", "onscroll 44,0", "44,0", "onscroll 44,0", "44,0"},
2577             FF = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2578                   "onscroll 0,0", "0,0", "onscroll 44,0", "44,0", "onscroll 44,0", "44,0"},
2579             FF_ESR = {"0,0", "onscroll 10,30", "10,30", "onscroll 12,34", "12,34",
2580                       "onscroll 0,0", "0,0", "onscroll 44,0", "44,0", "onscroll 44,0", "44,0"})
2581     public void scrollOptions() throws Exception {
2582         final String html = DOCTYPE_HTML
2583             + "<html><body onload='test()'>\n"
2584             + "<div id='d' style='width: 100px;height: 99px;overflow: scroll;'>\n"
2585             + "<div style='width:10000px;height:10000px;background-color:blue;'></div>\n"
2586             + "</div>"
2587             + "<script>\n"
2588             + LOG_TITLE_FUNCTION
2589             + "function test() {\n"
2590             + "  var d = document.getElementById('d');\n"
2591             + "  d.onscroll = (event) => { log('onscroll ' + d.scrollLeft + ',' + d.scrollTop); };"
2592 
2593             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2594 
2595             + "  d.scroll({left: 10, top: 30});\n"
2596             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2597 
2598             + "  d.scroll({left: 12, top: 34});\n"
2599             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2600 
2601             + "  d.scroll({left: -17, top: -100});\n"
2602             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2603 
2604             + "  d.scroll({left: 44});\n"
2605             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2606 
2607             + "  d.scroll({abcd: 7});\n"
2608             + "  log(d.scrollLeft + ',' + d.scrollTop);\n"
2609             + "}\n"
2610             + "</script></body></html>";
2611         loadPageVerifyTitle2(html);
2612     }
2613 }