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         loadPage2(html);
598         verifyTitle2(DEFAULT_WAIT_TIME, getWebDriver(), getExpectedAlerts());
599     }
600 
601     /**
602      * @throws Exception if an error occurs
603      */
604     @Test
605     @Alerts({"false", "null", "", "true", "", "",
606              "false", "null", "Html", "false", "null", "Html",
607              "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]"})
608     public void closeReturnValue() throws Exception {
609         final String html = DOCTYPE_HTML
610             + "<html>\n"
611             + "  <head>\n"
612             + "    <script>\n"
613             + LOG_TITLE_FUNCTION
614             + DUMP_EVENT_FUNCTION
615             + "      function test() {\n"
616             + "        var dia = document.getElementById('tester');\n"
617             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
618 
619             + "        dia.addEventListener('close', (event) => {\n"
620             + "          dump(event);\n"
621             + "        });\n"
622 
623             + "        log(dia.open);\n"
624             + "        log(dia.getAttribute('open'));\n"
625             + "        log(dia.returnValue);\n"
626 
627             + "        dia.show();\n"
628             + "        log(dia.open);\n"
629             + "        log(dia.getAttribute('open'));\n"
630             + "        log(dia.returnValue);\n"
631 
632             + "        dia.close('Html');\n"
633             + "        log(dia.open);\n"
634             + "        log(dia.getAttribute('open'));\n"
635             + "        log(dia.returnValue);\n"
636 
637             + "        dia.close('unit');\n"
638             + "        log(dia.open);\n"
639             + "        log(dia.getAttribute('open'));\n"
640             + "        log(dia.returnValue);\n"
641             + "      }\n"
642             + "    </script>\n"
643             + "  </head>\n"
644             + "  <body onload='test()'>\n"
645             + "    <dialog id='tester'>\n"
646             + "      <p>HtmlUNit dialog</p>\n"
647             + "    </dialog>\n"
648             + "  </body>\n"
649             + "</html>";
650 
651         loadPage2(html);
652         verifyTitle2(DEFAULT_WAIT_TIME, getWebDriver(), getExpectedAlerts());
653     }
654 
655     /**
656      * @throws Exception if an error occurs
657      */
658     @Test
659     @Alerts({"false", "", "1", "true", "1", "2", "false", "3", "4",
660              "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]"})
661     public void returnValue() throws Exception {
662         final String html = DOCTYPE_HTML
663             + "<html>\n"
664             + "  <head>\n"
665             + "    <script>\n"
666             + LOG_TITLE_FUNCTION
667             + DUMP_EVENT_FUNCTION
668             + "      function test() {\n"
669             + "        var dia = document.getElementById('tester');\n"
670             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
671 
672             + "        dia.addEventListener('close', (event) => {\n"
673             + "          dump(event);\n"
674             + "        });\n"
675 
676             + "        log(dia.open);\n"
677             + "        log(dia.returnValue);\n"
678 
679             + "        dia.returnValue = '1';\n"
680             + "        log(dia.returnValue);\n"
681 
682             + "        dia.show();\n"
683             + "        log(dia.open);\n"
684             + "        log(dia.returnValue);\n"
685 
686             + "        dia.returnValue = '2';\n"
687             + "        log(dia.returnValue);\n"
688 
689             + "        dia.close('3');\n"
690             + "        log(dia.open);\n"
691             + "        log(dia.returnValue);\n"
692 
693             + "        dia.returnValue = '4';\n"
694             + "        log(dia.returnValue);\n"
695             + "      }\n"
696             + "    </script>\n"
697             + "  </head>\n"
698             + "  <body onload='test()'>\n"
699             + "    <dialog id='tester'>\n"
700             + "      <p>HtmlUNit dialog</p>\n"
701             + "    </dialog>\n"
702             + "  </body>\n"
703             + "</html>";
704 
705         loadPageVerifyTitle2(html);
706     }
707 
708     /**
709      * @throws Exception if an error occurs
710      */
711     @Test
712     @Alerts({"false", "string ", "string null", "string undefined", "string 4", "string [object Object]"})
713     public void returnValueSpecial() throws Exception {
714         final String html = DOCTYPE_HTML
715             + "<html>\n"
716             + "  <head>\n"
717             + "    <script>\n"
718             + LOG_TITLE_FUNCTION
719             + DUMP_EVENT_FUNCTION
720             + "      function test() {\n"
721             + "        var dia = document.getElementById('tester');\n"
722             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
723 
724             + "        dia.addEventListener('close', (event) => {\n"
725             + "          dump(event);\n"
726             + "        });\n"
727 
728             + "        log(dia.open);\n"
729             + "        log(typeof dia.returnValue + ' ' + dia.returnValue);\n"
730 
731             + "        dia.returnValue = null;\n"
732             + "        log(typeof dia.returnValue + ' ' + dia.returnValue);\n"
733 
734             + "        dia.returnValue = undefined;\n"
735             + "        log(typeof dia.returnValue + ' ' + dia.returnValue);\n"
736 
737             + "        dia.returnValue = 4;\n"
738             + "        log(typeof dia.returnValue + ' ' + dia.returnValue);\n"
739 
740             + "        dia.returnValue = { a: '#' };\n"
741             + "        log(typeof dia.returnValue + ' ' + dia.returnValue);\n"
742             + "      }\n"
743             + "    </script>\n"
744             + "  </head>\n"
745             + "  <body onload='test()'>\n"
746             + "    <dialog id='tester'>\n"
747             + "      <p>HtmlUNit dialog</p>\n"
748             + "    </dialog>\n"
749             + "  </body>\n"
750             + "</html>";
751 
752         loadPageVerifyTitle2(html);
753     }
754 
755     /**
756      * @throws Exception if an error occurs
757      */
758     @Test
759     @Alerts({"false", "true", "false",
760              "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]"})
761     @HtmlUnitNYI(CHROME = {"false", "true",
762                            "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
763                            "false"},
764             EDGE = {"false", "true",
765                     "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
766                     "false"},
767             FF = {"false", "true",
768                   "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
769                   "false"},
770             FF_ESR = {"false", "true",
771                       "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
772                       "false"})
773     public void formClosesDialog() throws Exception {
774         final String html = DOCTYPE_HTML
775             + "<html>\n"
776             + "  <head>\n"
777             + "    <script>\n"
778             + LOG_TITLE_FUNCTION
779             + DUMP_EVENT_FUNCTION
780             + "      function test() {\n"
781             + "        var dia = document.getElementById('tester');\n"
782             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
783 
784             + "        dia.addEventListener('close', (event) => {\n"
785             + "          dump(event);\n"
786             + "        });\n"
787 
788             + "        log(dia.open);\n"
789 
790             + "        dia.show();\n"
791             + "        log(dia.open);\n"
792 
793             + "        document.getElementById('close').click();\n"
794             + "        log(dia.open);\n"
795             + "      }\n"
796             + "    </script>\n"
797             + "  </head>\n"
798             + "  <body onload='test()'>\n"
799             + "    <dialog id='tester'>\n"
800             + "      <p>HtmlUNit dialog</p>\n"
801             + "      <form method='dialog'>\n"
802             + "        <button id='close'>OK</button>\n"
803             + "      </form>\n"
804             + "    </dialog>\n"
805             + "  </body>\n"
806             + "</html>";
807 
808         loadPageVerifyTitle2(html);
809     }
810 
811     /**
812      * @throws Exception if an error occurs
813      */
814     @Test
815     @Alerts({"false", "true", "false",
816              "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]"})
817     @HtmlUnitNYI(CHROME = {"false", "true",
818                            "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
819                            "false"},
820             EDGE = {"false", "true",
821                     "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
822                     "false"},
823             FF = {"false", "true",
824                   "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
825                   "false"},
826             FF_ESR = {"false", "true",
827                       "[object Event]", "close", "false", "false", "false", "[object HTMLDialogElement]",
828                       "false"})
829     public void formClosesDialogWithoutJs() throws Exception {
830         final String html = DOCTYPE_HTML
831             + "<html>\n"
832             + "  <head>\n"
833             + "    <script>\n"
834             + LOG_TITLE_FUNCTION
835             + DUMP_EVENT_FUNCTION
836             + "      function test() {\n"
837             + "        var dia = document.getElementById('tester');\n"
838             + "        if (typeof HTMLDialogElement !== 'function') { log('No'); return; }\n"
839 
840             + "        dia.addEventListener('close', (event) => {\n"
841             + "          dump(event);\n"
842             + "        });\n"
843 
844             + "        log(dia.open);\n"
845 
846             + "        dia.show();\n"
847             + "        log(dia.open);\n"
848 
849             + "        document.getElementById('close').click();\n"
850             + "        log(dia.open);\n"
851             + "      }\n"
852             + "    </script>\n"
853             + "  </head>\n"
854             + "  <body onload='test()'>\n"
855             + "    <dialog id='tester'>\n"
856             + "      <p>HtmlUNit dialog</p>\n"
857             + "      <form method='dialog'>\n"
858             + "        <button id='close'>OK</button>\n"
859             + "      </form>\n"
860             + "    </dialog>\n"
861             + "  </body>\n"
862             + "</html>";
863 
864         loadPage2(html);
865         verifyTitle2(DEFAULT_WAIT_TIME, getWebDriver(), getExpectedAlerts());
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 }