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