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.html;
16  
17  import org.htmlunit.WebDriverTestCase;
18  import org.htmlunit.junit.BrowserRunner;
19  import org.htmlunit.junit.annotation.Alerts;
20  import org.htmlunit.junit.annotation.HtmlUnitNYI;
21  import org.junit.Test;
22  import org.junit.runner.RunWith;
23  import org.openqa.selenium.By;
24  import org.openqa.selenium.WebDriver;
25  
26  /**
27   * Unit tests for {@link HTMLDialogElement}.
28   *
29   * @author Ronald Brill
30   */
31  @RunWith(BrowserRunner.class)
32  public class HTMLDialogElementTest extends WebDriverTestCase {
33  
34      private static final String DUMP_EVENT_FUNCTION = "  function dump(event) {\n"
35              + "    log(event);\n"
36              + "    log(event.type);\n"
37              + "    log(event.bubbles);\n"
38              + "    log(event.cancelable);\n"
39              + "    log(event.composed);\n"
40              + "    log(event.target);\n"
41              + "  }\n";
42  
43      /**
44       * @throws Exception if an error occurs
45       */
46      @Test
47      @Alerts({"false", "null", "true", "", "false", "null", "true", "",
48               "true", "", "true", "TrUE", "false", "null"})
49      public void open() throws Exception {
50          final String html = DOCTYPE_HTML
51              + "<html>\n"
52              + "  <head>\n"
53              + "    <script>\n"
54              + LOG_TITLE_FUNCTION
55              + DUMP_EVENT_FUNCTION
56              + "      function test() {\n"
57              + "        var dia = document.getElementById('tester');\n"
58              + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
59  
60              + "        dia.addEventListener('close', (event) => {\n"
61              + "          dump(event);\n"
62              + "        });\n"
63  
64              + "        log(dia.open);\n"
65              + "        log(dia.getAttribute('open'));\n"
66  
67              + "        dia.open = true;\n"
68              + "        log(dia.open);\n"
69              + "        log(dia.getAttribute('open'));\n"
70  
71              + "        dia.open = false;\n"
72              + "        log(dia.open);\n"
73              + "        log(dia.getAttribute('open'));\n"
74  
75              + "        dia.open = 'true';\n"
76              + "        log(dia.open);\n"
77              + "        log(dia.getAttribute('open'));\n"
78  
79              + "        dia.open = 'faLSE';\n"
80              + "        log(dia.open);\n"
81              + "        log(dia.getAttribute('open'));\n"
82  
83              + "        dia.setAttribute('open', 'TrUE');\n"
84              + "        log(dia.open);\n"
85              + "        log(dia.getAttribute('open'));\n"
86  
87              + "        dia.removeAttribute('open');\n"
88              + "        log(dia.open);\n"
89              + "        log(dia.getAttribute('open'));\n"
90              + "      }\n"
91              + "    </script>\n"
92              + "  </head>\n"
93              + "  <body onload='test()'>\n"
94              + "    <dialog id='tester'>\n"
95              + "      <p>HtmlUNit dialog</p>\n"
96              + "    </dialog>\n"
97              + "  </body>\n"
98              + "</html>";
99  
100         loadPageVerifyTitle2(html);
101     }
102 
103     /**
104      * @throws Exception if an error occurs
105      */
106     @Test
107     @Alerts({"false", "null", "false", "null", "true", "", "true", "blah", "false", "null"})
108     public void openString() throws Exception {
109         final String html = DOCTYPE_HTML
110             + "<html>\n"
111             + "  <head>\n"
112             + "    <script>\n"
113             + LOG_TITLE_FUNCTION
114             + DUMP_EVENT_FUNCTION
115             + "      function test() {\n"
116             + "        var dia = document.getElementById('tester');\n"
117             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
118 
119             + "        dia.addEventListener('close', (event) => {\n"
120             + "          dump(event);\n"
121             + "        });\n"
122 
123             + "        log(dia.open);\n"
124             + "        log(dia.getAttribute('open'));\n"
125 
126             + "        dia.open = '';\n"
127             + "        log(dia.open);\n"
128             + "        log(dia.getAttribute('open'));\n"
129 
130             + "        dia.open = 'abc';\n"
131             + "        log(dia.open);\n"
132             + "        log(dia.getAttribute('open'));\n"
133 
134             + "        dia.setAttribute('open', 'blah');\n"
135             + "        log(dia.open);\n"
136             + "        log(dia.getAttribute('open'));\n"
137 
138             + "        dia.removeAttribute('open');\n"
139             + "        log(dia.open);\n"
140             + "        log(dia.getAttribute('open'));\n"
141             + "      }\n"
142             + "    </script>\n"
143             + "  </head>\n"
144             + "  <body onload='test()'>\n"
145             + "    <dialog id='tester'>\n"
146             + "      <p>HtmlUNit dialog</p>\n"
147             + "    </dialog>\n"
148             + "  </body>\n"
149             + "</html>";
150 
151         loadPageVerifyTitle2(html);
152     }
153 
154     /**
155      * @throws Exception if an error occurs
156      */
157     @Test
158     @Alerts({"false", "null", "true", "", "true", ""})
159     public void show() throws Exception {
160         final String html = DOCTYPE_HTML
161             + "<html>\n"
162             + "  <head>\n"
163             + "    <script>\n"
164             + LOG_TITLE_FUNCTION
165             + DUMP_EVENT_FUNCTION
166             + "      function test() {\n"
167             + "        var dia = document.getElementById('tester');\n"
168             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
169 
170             + "        dia.addEventListener('close', (event) => {\n"
171             + "          dump(event);\n"
172             + "        });\n"
173 
174             + "        log(dia.open);\n"
175             + "        log(dia.getAttribute('open'));\n"
176 
177             + "        dia.show();\n"
178             + "        log(dia.open);\n"
179             + "        log(dia.getAttribute('open'));\n"
180 
181             + "        dia.show();\n"
182             + "        log(dia.open);\n"
183             + "        log(dia.getAttribute('open'));\n"
184             + "      }\n"
185             + "    </script>\n"
186             + "  </head>\n"
187             + "  <body onload='test()'>\n"
188             + "    <dialog id='tester'>\n"
189             + "      <p>HtmlUNit dialog</p>\n"
190             + "    </dialog>\n"
191             + "  </body>\n"
192             + "</html>";
193 
194         loadPageVerifyTitle2(html);
195     }
196 
197     /**
198      * @throws Exception if an error occurs
199      */
200     @Test
201     @Alerts({"true", "", "true", ""})
202     public void showAlreadyOpend() throws Exception {
203         final String html = DOCTYPE_HTML
204             + "<html>\n"
205             + "  <head>\n"
206             + "    <script>\n"
207             + LOG_TITLE_FUNCTION
208             + DUMP_EVENT_FUNCTION
209             + "      function test() {\n"
210             + "        var dia = document.getElementById('tester');\n"
211             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
212 
213             + "        dia.addEventListener('close', (event) => {\n"
214             + "          dump(event);\n"
215             + "        });\n"
216 
217             + "        log(dia.open);\n"
218             + "        log(dia.getAttribute('open'));\n"
219 
220             + "        dia.show();\n"
221             + "        log(dia.open);\n"
222             + "        log(dia.getAttribute('open'));\n"
223             + "      }\n"
224             + "    </script>\n"
225             + "  </head>\n"
226             + "  <body onload='test()'>\n"
227             + "    <dialog id='tester' open>\n"
228             + "      <p>HtmlUNit dialog</p>\n"
229             + "    </dialog>\n"
230             + "  </body>\n"
231             + "</html>";
232 
233         loadPageVerifyTitle2(html);
234     }
235 
236     /**
237      * @throws Exception if an error occurs
238      */
239     @Test
240     @Alerts({"false", "null", "true", "", "true", ""})
241     public void showModal() throws Exception {
242         final String html = DOCTYPE_HTML
243             + "<html>\n"
244             + "  <head>\n"
245             + "    <script>\n"
246             + LOG_TITLE_FUNCTION
247             + DUMP_EVENT_FUNCTION
248             + "      function test() {\n"
249             + "        var dia = document.getElementById('tester');\n"
250             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
251 
252             + "        dia.addEventListener('close', (event) => {\n"
253             + "          dump(event);\n"
254             + "        });\n"
255 
256             + "        log(dia.open);\n"
257             + "        log(dia.getAttribute('open'));\n"
258 
259             + "        dia.showModal();\n"
260             + "        log(dia.open);\n"
261             + "        log(dia.getAttribute('open'));\n"
262 
263             + "        try {\n"
264             + "          dia.showModal();\n"
265             + "        } catch(e) { log('InvalidStateError'); }"
266             + "        log(dia.open);\n"
267             + "        log(dia.getAttribute('open'));\n"
268             + "      }\n"
269             + "    </script>\n"
270             + "  </head>\n"
271             + "  <body onload='test()'>\n"
272             + "    <dialog id='tester'>\n"
273             + "      <p>HtmlUNit dialog</p>\n"
274             + "    </dialog>\n"
275             + "  </body>\n"
276             + "</html>";
277 
278         loadPageVerifyTitle2(html);
279     }
280 
281     /**
282      * @throws Exception if an error occurs
283      */
284     @Test
285     @Alerts({"true", "", "InvalidStateError", "true", ""})
286     public void showModalAlreadyOpend() throws Exception {
287         final String html = DOCTYPE_HTML
288             + "<html>\n"
289             + "  <head>\n"
290             + "    <script>\n"
291             + LOG_TITLE_FUNCTION
292             + DUMP_EVENT_FUNCTION
293             + "      function test() {\n"
294             + "        var dia = document.getElementById('tester');\n"
295             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
296 
297             + "        dia.addEventListener('close', (event) => {\n"
298             + "          dump(event);\n"
299             + "        });\n"
300 
301             + "        log(dia.open);\n"
302             + "        log(dia.getAttribute('open'));\n"
303 
304             + "        try {\n"
305             + "          dia.showModal();\n"
306             + "        } catch(e) { log('InvalidStateError'); }"
307             + "        log(dia.open);\n"
308             + "        log(dia.getAttribute('open'));\n"
309             + "      }\n"
310             + "    </script>\n"
311             + "  </head>\n"
312             + "  <body onload='test()'>\n"
313             + "    <dialog id='tester' open>\n"
314             + "      <p>HtmlUNit dialog</p>\n"
315             + "    </dialog>\n"
316             + "  </body>\n"
317             + "</html>";
318 
319         loadPageVerifyTitle2(html);
320     }
321 
322     /**
323      * @throws Exception if an error occurs
324      */
325     @Test
326     @Alerts({"false", "null", "true", "", "true", ""})
327     public void showAfterShow() throws Exception {
328         final String html = DOCTYPE_HTML
329             + "<html>\n"
330             + "  <head>\n"
331             + "    <script>\n"
332             + LOG_TITLE_FUNCTION
333             + DUMP_EVENT_FUNCTION
334             + "      function test() {\n"
335             + "        var dia = document.getElementById('tester');\n"
336             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
337 
338             + "        dia.addEventListener('close', (event) => {\n"
339             + "          dump(event);\n"
340             + "        });\n"
341 
342             + "        log(dia.open);\n"
343             + "        log(dia.getAttribute('open'));\n"
344 
345             + "        dia.show();\n"
346             + "        log(dia.open);\n"
347             + "        log(dia.getAttribute('open'));\n"
348 
349             + "        try {\n"
350             + "          dia.show();\n"
351             + "        } catch(e) { log('InvalidStateError'); }"
352             + "        log(dia.open);\n"
353             + "        log(dia.getAttribute('open'));\n"
354             + "      }\n"
355             + "    </script>\n"
356             + "  </head>\n"
357             + "  <body onload='test()'>\n"
358             + "    <dialog id='tester'>\n"
359             + "      <p>HtmlUNit dialog</p>\n"
360             + "    </dialog>\n"
361             + "  </body>\n"
362             + "</html>";
363 
364         loadPageVerifyTitle2(html);
365     }
366 
367     /**
368      * @throws Exception if an error occurs
369      */
370     @Test
371     @Alerts({"false", "null", "true", "", "InvalidStateError", "true", ""})
372     public void showAfterShowModal() throws Exception {
373         final String html = DOCTYPE_HTML
374             + "<html>\n"
375             + "  <head>\n"
376             + "    <script>\n"
377             + LOG_TITLE_FUNCTION
378             + DUMP_EVENT_FUNCTION
379             + "      function test() {\n"
380             + "        var dia = document.getElementById('tester');\n"
381             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
382 
383             + "        dia.addEventListener('close', (event) => {\n"
384             + "          dump(event);\n"
385             + "        });\n"
386 
387             + "        log(dia.open);\n"
388             + "        log(dia.getAttribute('open'));\n"
389 
390             + "        dia.showModal();\n"
391             + "        log(dia.open);\n"
392             + "        log(dia.getAttribute('open'));\n"
393 
394             + "        try {\n"
395             + "          dia.show();\n"
396             + "        } catch(e) { log('InvalidStateError'); }"
397             + "        log(dia.open);\n"
398             + "        log(dia.getAttribute('open'));\n"
399             + "      }\n"
400             + "    </script>\n"
401             + "  </head>\n"
402             + "  <body onload='test()'>\n"
403             + "    <dialog id='tester'>\n"
404             + "      <p>HtmlUNit dialog</p>\n"
405             + "    </dialog>\n"
406             + "  </body>\n"
407             + "</html>";
408 
409         loadPageVerifyTitle2(html);
410     }
411 
412     /**
413      * @throws Exception if an error occurs
414      */
415     @Test
416     @Alerts({"false", "null", "true", "", "InvalidStateError", "true", ""})
417     public void showModalAfterShow() throws Exception {
418         final String html = DOCTYPE_HTML
419             + "<html>\n"
420             + "  <head>\n"
421             + "    <script>\n"
422             + LOG_TITLE_FUNCTION
423             + DUMP_EVENT_FUNCTION
424             + "      function test() {\n"
425             + "        var dia = document.getElementById('tester');\n"
426             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
427 
428             + "        dia.addEventListener('close', (event) => {\n"
429             + "          dump(event);\n"
430             + "        });\n"
431 
432             + "        log(dia.open);\n"
433             + "        log(dia.getAttribute('open'));\n"
434 
435             + "        dia.show();\n"
436             + "        log(dia.open);\n"
437             + "        log(dia.getAttribute('open'));\n"
438 
439             + "        try {\n"
440             + "          dia.showModal();\n"
441             + "        } catch(e) { log('InvalidStateError'); }"
442             + "        log(dia.open);\n"
443             + "        log(dia.getAttribute('open'));\n"
444             + "      }\n"
445             + "    </script>\n"
446             + "  </head>\n"
447             + "  <body onload='test()'>\n"
448             + "    <dialog id='tester'>\n"
449             + "      <p>HtmlUNit dialog</p>\n"
450             + "    </dialog>\n"
451             + "  </body>\n"
452             + "</html>";
453 
454         loadPageVerifyTitle2(html);
455     }
456 
457     /**
458      * @throws Exception if an error occurs
459      */
460     @Test
461     @Alerts({"false", "null", "true", "", "true", ""})
462     public void showModalAfterShowModal() throws Exception {
463         final String html = DOCTYPE_HTML
464             + "<html>\n"
465             + "  <head>\n"
466             + "    <script>\n"
467             + LOG_TITLE_FUNCTION
468             + DUMP_EVENT_FUNCTION
469             + "      function test() {\n"
470             + "        var dia = document.getElementById('tester');\n"
471             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
472 
473             + "        dia.addEventListener('close', (event) => {\n"
474             + "          dump(event);\n"
475             + "        });\n"
476 
477             + "        log(dia.open);\n"
478             + "        log(dia.getAttribute('open'));\n"
479 
480             + "        dia.showModal();\n"
481             + "        log(dia.open);\n"
482             + "        log(dia.getAttribute('open'));\n"
483 
484             + "        try {\n"
485             + "          dia.showModal();\n"
486             + "        } catch(e) { log('InvalidStateError'); }"
487             + "        log(dia.open);\n"
488             + "        log(dia.getAttribute('open'));\n"
489             + "      }\n"
490             + "    </script>\n"
491             + "  </head>\n"
492             + "  <body onload='test()'>\n"
493             + "    <dialog id='tester'>\n"
494             + "      <p>HtmlUNit dialog</p>\n"
495             + "    </dialog>\n"
496             + "  </body>\n"
497             + "</html>";
498 
499         loadPageVerifyTitle2(html);
500     }
501 
502     /**
503      * @throws Exception if an error occurs
504      */
505     @Test
506     @Alerts({"false", "null", "", "true", "", "",
507              "false", "null", "", "false", "null", "",
508              "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]"})
509     public void close() throws Exception {
510         final String html = DOCTYPE_HTML
511             + "<html>\n"
512             + "  <head>\n"
513             + "    <script>\n"
514             + LOG_TITLE_FUNCTION
515             + DUMP_EVENT_FUNCTION
516             + "      function test() {\n"
517             + "        var dia = document.getElementById('tester');\n"
518             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
519 
520             + "        dia.addEventListener('close', (event) => {\n"
521             + "          dump(event);\n"
522             + "        });\n"
523 
524             + "        log(dia.open);\n"
525             + "        log(dia.getAttribute('open'));\n"
526             + "        log(dia.returnValue);\n"
527 
528             + "        dia.show();\n"
529             + "        log(dia.open);\n"
530             + "        log(dia.getAttribute('open'));\n"
531             + "        log(dia.returnValue);\n"
532 
533             + "        dia.close();\n"
534             + "        log(dia.open);\n"
535             + "        log(dia.getAttribute('open'));\n"
536             + "        log(dia.returnValue);\n"
537 
538             + "        dia.close();\n"
539             + "        log(dia.open);\n"
540             + "        log(dia.getAttribute('open'));\n"
541             + "        log(dia.returnValue);\n"
542             + "      }\n"
543             + "    </script>\n"
544             + "  </head>\n"
545             + "  <body onload='test()'>\n"
546             + "    <dialog id='tester'>\n"
547             + "      <p>HtmlUNit dialog</p>\n"
548             + "    </dialog>\n"
549             + "  </body>\n"
550             + "</html>";
551 
552         loadPageVerifyTitle2(html);
553     }
554 
555     /**
556      * @throws Exception if an error occurs
557      */
558     @Test
559     @Alerts({"false", "null", "", "true", "", "",
560              "false", "null", "", "false", "null", "", "closed"})
561     public void closeOnclose() throws Exception {
562         final String html = DOCTYPE_HTML
563             + "<html>\n"
564             + "  <head>\n"
565             + "    <script>\n"
566             + LOG_TITLE_FUNCTION
567             + DUMP_EVENT_FUNCTION
568             + "      function test() {\n"
569             + "        var dia = document.getElementById('tester');\n"
570             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
571 
572             + "        log(dia.open);\n"
573             + "        log(dia.getAttribute('open'));\n"
574             + "        log(dia.returnValue);\n"
575 
576             + "        dia.show();\n"
577             + "        log(dia.open);\n"
578             + "        log(dia.getAttribute('open'));\n"
579             + "        log(dia.returnValue);\n"
580 
581             + "        dia.close();\n"
582             + "        log(dia.open);\n"
583             + "        log(dia.getAttribute('open'));\n"
584             + "        log(dia.returnValue);\n"
585 
586             + "        dia.close();\n"
587             + "        log(dia.open);\n"
588             + "        log(dia.getAttribute('open'));\n"
589             + "        log(dia.returnValue);\n"
590             + "      }\n"
591             + "    </script>\n"
592             + "  </head>\n"
593             + "  <body onload='test()'>\n"
594             + "    <dialog id='tester' onclose='log(\"closed\")'>\n"
595             + "      <p>HtmlUNit dialog</p>\n"
596             + "    </dialog>\n"
597             + "  </body>\n"
598             + "</html>";
599 
600         loadPageVerifyTitle2(html);
601     }
602 
603     /**
604      * @throws Exception if an error occurs
605      */
606     @Test
607     @Alerts({"false", "null", "", "true", "", "",
608              "false", "null", "Html", "false", "null", "Html",
609              "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]"})
610     public void closeReturnValue() throws Exception {
611         final String html = DOCTYPE_HTML
612             + "<html>\n"
613             + "  <head>\n"
614             + "    <script>\n"
615             + LOG_TITLE_FUNCTION
616             + DUMP_EVENT_FUNCTION
617             + "      function test() {\n"
618             + "        var dia = document.getElementById('tester');\n"
619             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
620 
621             + "        dia.addEventListener('close', (event) => {\n"
622             + "          dump(event);\n"
623             + "        });\n"
624 
625             + "        log(dia.open);\n"
626             + "        log(dia.getAttribute('open'));\n"
627             + "        log(dia.returnValue);\n"
628 
629             + "        dia.show();\n"
630             + "        log(dia.open);\n"
631             + "        log(dia.getAttribute('open'));\n"
632             + "        log(dia.returnValue);\n"
633 
634             + "        dia.close('Html');\n"
635             + "        log(dia.open);\n"
636             + "        log(dia.getAttribute('open'));\n"
637             + "        log(dia.returnValue);\n"
638 
639             + "        dia.close('unit');\n"
640             + "        log(dia.open);\n"
641             + "        log(dia.getAttribute('open'));\n"
642             + "        log(dia.returnValue);\n"
643             + "      }\n"
644             + "    </script>\n"
645             + "  </head>\n"
646             + "  <body onload='test()'>\n"
647             + "    <dialog id='tester'>\n"
648             + "      <p>HtmlUNit dialog</p>\n"
649             + "    </dialog>\n"
650             + "  </body>\n"
651             + "</html>";
652 
653         loadPageVerifyTitle2(html);
654     }
655 
656     /**
657      * @throws Exception if an error occurs
658      */
659     @Test
660     @Alerts({"false", "", "1", "true", "1", "2", "false", "3", "4",
661              "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]"})
662     public void returnValue() throws Exception {
663         final String html = DOCTYPE_HTML
664             + "<html>\n"
665             + "  <head>\n"
666             + "    <script>\n"
667             + LOG_TITLE_FUNCTION
668             + DUMP_EVENT_FUNCTION
669             + "      function test() {\n"
670             + "        var dia = document.getElementById('tester');\n"
671             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
672 
673             + "        dia.addEventListener('close', (event) => {\n"
674             + "          dump(event);\n"
675             + "        });\n"
676 
677             + "        log(dia.open);\n"
678             + "        log(dia.returnValue);\n"
679 
680             + "        dia.returnValue = '1';\n"
681             + "        log(dia.returnValue);\n"
682 
683             + "        dia.show();\n"
684             + "        log(dia.open);\n"
685             + "        log(dia.returnValue);\n"
686 
687             + "        dia.returnValue = '2';\n"
688             + "        log(dia.returnValue);\n"
689 
690             + "        dia.close('3');\n"
691             + "        log(dia.open);\n"
692             + "        log(dia.returnValue);\n"
693 
694             + "        dia.returnValue = '4';\n"
695             + "        log(dia.returnValue);\n"
696             + "      }\n"
697             + "    </script>\n"
698             + "  </head>\n"
699             + "  <body onload='test()'>\n"
700             + "    <dialog id='tester'>\n"
701             + "      <p>HtmlUNit dialog</p>\n"
702             + "    </dialog>\n"
703             + "  </body>\n"
704             + "</html>";
705 
706         loadPageVerifyTitle2(html);
707     }
708 
709     /**
710      * @throws Exception if an error occurs
711      */
712     @Test
713     @Alerts({"false", "string ", "string null", "string undefined", "string 4", "string [object Object]"})
714     public void returnValueSpecial() throws Exception {
715         final String html = DOCTYPE_HTML
716             + "<html>\n"
717             + "  <head>\n"
718             + "    <script>\n"
719             + LOG_TITLE_FUNCTION
720             + DUMP_EVENT_FUNCTION
721             + "      function test() {\n"
722             + "        var dia = document.getElementById('tester');\n"
723             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
724 
725             + "        dia.addEventListener('close', (event) => {\n"
726             + "          dump(event);\n"
727             + "        });\n"
728 
729             + "        log(dia.open);\n"
730             + "        log(typeof dia.returnValue + ' ' + dia.returnValue);\n"
731 
732             + "        dia.returnValue = null;\n"
733             + "        log(typeof dia.returnValue + ' ' + dia.returnValue);\n"
734 
735             + "        dia.returnValue = undefined;\n"
736             + "        log(typeof dia.returnValue + ' ' + dia.returnValue);\n"
737 
738             + "        dia.returnValue = 4;\n"
739             + "        log(typeof dia.returnValue + ' ' + dia.returnValue);\n"
740 
741             + "        dia.returnValue = { a: '#' };\n"
742             + "        log(typeof dia.returnValue + ' ' + dia.returnValue);\n"
743             + "      }\n"
744             + "    </script>\n"
745             + "  </head>\n"
746             + "  <body onload='test()'>\n"
747             + "    <dialog id='tester'>\n"
748             + "      <p>HtmlUNit dialog</p>\n"
749             + "    </dialog>\n"
750             + "  </body>\n"
751             + "</html>";
752 
753         loadPageVerifyTitle2(html);
754     }
755 
756     /**
757      * @throws Exception if an error occurs
758      */
759     @Test
760     @Alerts({"false", "true", "false",
761              "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]"})
762     @HtmlUnitNYI(CHROME = {"false", "true",
763                            "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
764                            "false"},
765             EDGE = {"false", "true",
766                     "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
767                     "false"},
768             FF = {"false", "true",
769                   "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
770                   "false"},
771             FF_ESR = {"false", "true",
772                       "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
773                       "false"})
774     public void formClosesDialog() throws Exception {
775         final String html = DOCTYPE_HTML
776             + "<html>\n"
777             + "  <head>\n"
778             + "    <script>\n"
779             + LOG_TITLE_FUNCTION
780             + DUMP_EVENT_FUNCTION
781             + "      function test() {\n"
782             + "        var dia = document.getElementById('tester');\n"
783             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
784 
785             + "        dia.addEventListener('close', (event) => {\n"
786             + "          dump(event);\n"
787             + "        });\n"
788 
789             + "        log(dia.open);\n"
790 
791             + "        dia.show();\n"
792             + "        log(dia.open);\n"
793 
794             + "        document.getElementById('close').click();\n"
795             + "        log(dia.open);\n"
796             + "      }\n"
797             + "    </script>\n"
798             + "  </head>\n"
799             + "  <body onload='test()'>\n"
800             + "    <dialog id='tester'>\n"
801             + "      <p>HtmlUNit dialog</p>\n"
802             + "      <form method='dialog'>\n"
803             + "        <button id='close'>OK</button>\n"
804             + "      </form>\n"
805             + "    </dialog>\n"
806             + "  </body>\n"
807             + "</html>";
808 
809         loadPageVerifyTitle2(html);
810     }
811 
812     /**
813      * @throws Exception if an error occurs
814      */
815     @Test
816     @Alerts({"false", "true", "false",
817              "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]"})
818     @HtmlUnitNYI(CHROME = {"false", "true",
819                            "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
820                            "false"},
821             EDGE = {"false", "true",
822                     "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
823                     "false"},
824             FF = {"false", "true",
825                   "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
826                   "false"},
827             FF_ESR = {"false", "true",
828                       "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
829                       "false"})
830     public void formClosesDialogWithoutJs() throws Exception {
831         final String html = DOCTYPE_HTML
832             + "<html>\n"
833             + "  <head>\n"
834             + "    <script>\n"
835             + LOG_TITLE_FUNCTION
836             + DUMP_EVENT_FUNCTION
837             + "      function test() {\n"
838             + "        var dia = document.getElementById('tester');\n"
839             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
840 
841             + "        dia.addEventListener('close', (event) => {\n"
842             + "          dump(event);\n"
843             + "        });\n"
844 
845             + "        log(dia.open);\n"
846 
847             + "        dia.show();\n"
848             + "        log(dia.open);\n"
849 
850             + "        document.getElementById('close').click();\n"
851             + "        log(dia.open);\n"
852             + "      }\n"
853             + "    </script>\n"
854             + "  </head>\n"
855             + "  <body onload='test()'>\n"
856             + "    <dialog id='tester'>\n"
857             + "      <p>HtmlUNit dialog</p>\n"
858             + "      <form method='dialog'>\n"
859             + "        <button id='close'>OK</button>\n"
860             + "      </form>\n"
861             + "    </dialog>\n"
862             + "  </body>\n"
863             + "</html>";
864 
865         loadPageVerifyTitle2(html);
866     }
867 
868     /**
869      * @throws Exception if an error occurs
870      */
871     @Test
872     @Alerts({"false", "true", "true"})
873     public void formGet() throws Exception {
874         final String html = DOCTYPE_HTML
875             + "<html>\n"
876             + "  <head>\n"
877             + "    <script>\n"
878             + LOG_WINDOW_NAME_FUNCTION
879             + "      function test() {\n"
880             + "        var dia = document.getElementById('tester');\n"
881             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
882 
883             + "        dia.addEventListener('close', (event) => {\n"
884             + "          dump(event);\n"
885             + "        });\n"
886 
887             + "        log(dia.open);\n"
888 
889             + "        dia.show();\n"
890             + "        log(dia.open);\n"
891 
892             + "        document.getElementById('close').click();\n"
893             + "        log(dia.open);\n"
894             + "      }\n"
895             + "    </script>\n"
896             + "  </head>\n"
897             + "  <body onload='test()'>\n"
898             + "    <dialog id='tester'>\n"
899             + "      <p>HtmlUNit dialog</p>\n"
900             + "      <form method='get' action='" + URL_SECOND + "'>\n"
901             + "        <button id='close'>OK</button>\n"
902             + "      </form>\n"
903             + "    </dialog>\n"
904             + "  </body>\n"
905             + "</html>";
906 
907         final String secondContent = DOCTYPE_HTML
908             + "<html><head><title>second</title></head><body>\n"
909             + "<p>hello world</p>\n"
910             + "</body></html>";
911         getMockWebConnection().setDefaultResponse(secondContent);
912 
913         loadPage2(html);
914         Thread.sleep(DEFAULT_WAIT_TIME.toMillis() / 20); // FF
915         verifyWindowName2(getWebDriver(), getExpectedAlerts());
916     }
917 
918     /**
919      * @throws Exception if an error occurs
920      */
921     @Test
922     @Alerts({"false", "true", "true"})
923     public void formOutsideDialog() throws Exception {
924         final String html = DOCTYPE_HTML
925             + "<html>\n"
926             + "  <head>\n"
927             + "    <script>\n"
928             + LOG_TITLE_FUNCTION
929             + DUMP_EVENT_FUNCTION
930             + "      function test() {\n"
931             + "        var dia = document.getElementById('tester');\n"
932             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
933 
934             + "        dia.addEventListener('close', (event) => {\n"
935             + "          dump(event);\n"
936             + "        });\n"
937 
938             + "        log(dia.open);\n"
939 
940             + "        dia.show();\n"
941             + "        log(dia.open);\n"
942 
943             + "        document.getElementById('close').click();\n"
944             + "        log(dia.open);\n"
945             + "      }\n"
946             + "    </script>\n"
947             + "  </head>\n"
948             + "  <body onload='test()'>\n"
949             + "    <dialog id='tester'>\n"
950             + "      <p>HtmlUNit dialog</p>\n"
951             + "    </dialog>\n"
952 
953             + "    <form method='dialog'>\n"
954             + "      <button id='close'>OK</button>\n"
955             + "    </form>\n"
956 
957             + "  </body>\n"
958             + "</html>";
959 
960         loadPageVerifyTitle2(html);
961     }
962 
963     /**
964      * @throws Exception if an error occurs
965      */
966     @Test
967     @Alerts({"Show dialog", "false",
968              "Show dialog\nHello World\nDismiss", "true",
969              "Show dialog", "false"})
970     public void useCaseIssue598() throws Exception {
971         final String html = DOCTYPE_HTML
972             + "<html>\n"
973             + "  <body>\n"
974             + "    <button id='showMyDialog'>Show dialog</button><br/>\n"
975             + "    <dialog id='mydialog'>\n"
976             + "      Hello World<br/>\n"
977             + "      <button id='dismiss'>Dismiss</button>\n"
978             + "    </dialog>\n"
979 
980             + "    <script>\n"
981             + "      showButton = document.getElementById('showMyDialog');\n"
982             + "      showButton.addEventListener('click', showMyDialog);\n"
983 
984             + "      dismissButton = document.getElementById('dismiss');\n"
985             + "      dismissButton.addEventListener('click', closeMyDialog);\r\n"
986 
987             + "      function showMyDialog() {\n"
988             + "        mydialog = document.getElementById('mydialog');\n"
989             + "        mydialog.showModal();\n"
990             + "      }\n"
991 
992             + "      function closeMyDialog() {\n"
993             + "        mydialog = document.getElementById('mydialog');\n"
994             + "        mydialog.close();\n"
995             + "      }\n"
996             + "    </script>\n"
997             + "  </body>\n"
998             + "</html>";
999 
1000         final WebDriver driver = loadPage2(html);
1001 
1002         assertEquals(getExpectedAlerts()[0], driver.findElement(By.tagName("body")).getText().trim());
1003         assertEquals(Boolean.parseBoolean(getExpectedAlerts()[1]), driver.findElement(By.id("mydialog")).isDisplayed());
1004 
1005         driver.findElement(By.id("showMyDialog")).click();
1006         assertEquals(getExpectedAlerts()[2], driver.findElement(By.tagName("body")).getText().trim());
1007         assertEquals(Boolean.parseBoolean(getExpectedAlerts()[3]), driver.findElement(By.id("mydialog")).isDisplayed());
1008 
1009         driver.findElement(By.id("dismiss")).click();
1010         assertEquals(getExpectedAlerts()[4], driver.findElement(By.tagName("body")).getText().trim());
1011         assertEquals(Boolean.parseBoolean(getExpectedAlerts()[5]), driver.findElement(By.id("mydialog")).isDisplayed());
1012     }
1013 }