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 java.net.URL;
18  
19  import org.htmlunit.WebDriverTestCase;
20  import org.htmlunit.junit.annotation.Alerts;
21  import org.htmlunit.junit.annotation.HtmlUnitNYI;
22  import org.htmlunit.util.MimeType;
23  import org.junit.jupiter.api.Test;
24  import org.openqa.selenium.By;
25  import org.openqa.selenium.WebDriver;
26  
27  /**
28   * Tests for {@link HTMLIFrameElement}.
29   *
30   * @author Ronald Brill
31   * @author Frank Danek
32   * @author Marc Guillemot
33   */
34  public class HTMLIFrameElement2Test extends WebDriverTestCase {
35  
36      /**
37       * @throws Exception if an error occurs
38       */
39      @Test
40      @Alerts("loaded")
41      public void onLoad() throws Exception {
42          final String html = DOCTYPE_HTML
43              + "<html>\n"
44              + "  <body>\n"
45              + "    <script>\n"
46              + LOG_TITLE_FUNCTION
47              + "    </script>\n"
48              + "    <iframe id='i' onload='log(\"loaded\");' src='" + URL_SECOND + "'></iframe>\n"
49              + "  </body>\n"
50              + "</html>";
51  
52          final String html2 = DOCTYPE_HTML + "<html><body>foo</body></html>";
53          getMockWebConnection().setResponse(URL_SECOND, html2);
54  
55          loadPageVerifyTitle2(html);
56      }
57  
58      /**
59       * @throws Exception if an error occurs
60       */
61      @Test
62      @Alerts("loaded")
63      public void onLoad_noSrc() throws Exception {
64          final String html = DOCTYPE_HTML
65              + "<html>\n"
66              + "  <body>\n"
67              + "    <script>\n"
68              + LOG_TITLE_FUNCTION
69              + "    </script>\n"
70              + "    <iframe id='i' onload='log(\"loaded\");'></iframe>\n"
71              + "  </body>\n"
72              + "</html>";
73  
74          loadPageVerifyTitle2(html);
75      }
76  
77      /**
78       * @throws Exception if an error occurs
79       */
80      @Test
81      @Alerts("loaded")
82      public void documentWrite_onLoad() throws Exception {
83          final String html = DOCTYPE_HTML
84              + "<html>\n"
85              + "<body>\n"
86              + "<script>\n"
87              + LOG_TITLE_FUNCTION
88              + "document.write(\"<iframe id='i' onload='log(\\\"loaded\\\");' src='" + URL_SECOND + "'></iframe>\");\n"
89              + "</script>\n"
90              + "</body>\n"
91              + "</html>";
92          final String html2 = DOCTYPE_HTML + "<html><body>foo</body></html>";
93          getMockWebConnection().setResponse(URL_SECOND, html2);
94  
95          loadPageVerifyTitle2(html);
96      }
97  
98      /**
99       * @throws Exception if an error occurs
100      */
101     @Test
102     @Alerts("loaded")
103     public void documentWrite_onLoad_noSrc() throws Exception {
104         final String html = DOCTYPE_HTML
105             + "<html>\n"
106             + "  <body>\n"
107             + "    <script>\n"
108             + LOG_TITLE_FUNCTION
109             + "      document.write(\"<iframe id='i' onload='log(\\\"loaded\\\");'></iframe>\");\n"
110             + "    </script>\n"
111             + "  </body>\n"
112             + "</html>";
113 
114         loadPageVerifyTitle2(html);
115     }
116 
117     /**
118      * @throws Exception if an error occurs
119      */
120     @Test
121     @Alerts({"loaded", "foo"})
122     public void documentCreateElement_onLoad() throws Exception {
123         final String html = DOCTYPE_HTML
124             + "<html>\n"
125             + "<head><script type='text/javascript'>\n"
126             + LOG_TITLE_FUNCTION
127             + "  function handleFrameLoad() {\n"
128             + "    log('loaded');\n"
129             + "    var myFrame = document.getElementById('myFrame');\n"
130             + "    log(myFrame.contentWindow.document.body.innerHTML);\n"
131             + "  }\n"
132             + "</script></head>\n"
133 
134             + "  <body>\n"
135             + "    <script>\n"
136             + "      var myFrame = document.createElement('iframe');\n"
137             + "      myFrame.id = 'myFrame';\n"
138             + "      myFrame.src = '" + URL_SECOND + "';\n"
139             + "      myFrame.onload = handleFrameLoad;\n"
140             + "      var body = document.getElementsByTagName('body')[0];\n"
141             + "      body.appendChild(myFrame);\n"
142             + "    </script>\n"
143             + "  </body>\n"
144             + "</html>";
145         final String html2 = DOCTYPE_HTML + "<html><body>foo</body></html>";
146         getMockWebConnection().setResponse(URL_SECOND, html2);
147 
148         loadPageVerifyTitle2(html);
149     }
150 
151     /**
152      * @throws Exception if an error occurs
153      */
154     @Test
155     @Alerts({"loaded", ""})
156     public void documentCreateElement_onLoad_noSrc() throws Exception {
157         final String html = DOCTYPE_HTML
158             + "<html>\n"
159             + "<head><script type='text/javascript'>\n"
160             + LOG_TITLE_FUNCTION
161             + "  function handleFrameLoad() {\n"
162             + "    log('loaded');\n"
163             + "    var myFrame = document.getElementById('myFrame');\n"
164             + "    log(myFrame.contentWindow.document.body.innerHTML);\n"
165             + "  }\n"
166             + "</script></head>\n"
167 
168             + "  <body>\n"
169             + "    <script>\n"
170             + "      var myFrame = document.createElement('iframe');\n"
171             + "      myFrame.id = 'myFrame';\n"
172             + "      myFrame.onload = handleFrameLoad;\n"
173             + "      var body = document.getElementsByTagName('body')[0];\n"
174             + "      body.appendChild(myFrame);\n"
175             + "    </script>\n"
176             + "  </body>\n"
177             + "</html>";
178 
179         loadPageVerifyTitle2(html);
180     }
181 
182     /**
183      * @throws Exception if an error occurs
184      */
185     @Test
186     @Alerts({"createIFrame", "loaded", "foo"})
187     public void documentCreateElement_onLoad2() throws Exception {
188         final String html = DOCTYPE_HTML
189             + "<html>\n"
190             + "<head><script type='text/javascript'>\n"
191             + LOG_TITLE_FUNCTION
192             + "  function createIFrame() {\n"
193             + "    log('createIFrame');\n"
194             + "    var myFrame = document.createElement('iframe');\n"
195             + "    myFrame.id = 'myFrame';\n"
196             + "    myFrame.src = '" + URL_SECOND + "';\n"
197             + "    myFrame.onload = handleFrameLoad;\n"
198             + "    var body = document.getElementsByTagName('body')[0];\n"
199             + "    body.appendChild(myFrame);\n"
200             + "  }\n"
201             + "  function handleFrameLoad() {\n"
202             + "    log('loaded');\n"
203             + "    var myFrame = document.getElementById('myFrame');\n"
204             + "    log(myFrame.contentWindow.document.body.innerHTML);\n"
205             + "  }\n"
206             + "</script></head>\n"
207 
208             + "  <body onload='createIFrame();' >\n"
209             + "  </body>\n"
210             + "</html>";
211         final String html2 = DOCTYPE_HTML + "<html><body>foo</body></html>";
212         getMockWebConnection().setResponse(URL_SECOND, html2);
213 
214         loadPage2(html);
215         verifyTitle2(DEFAULT_WAIT_TIME, getWebDriver(), getExpectedAlerts());
216     }
217 
218     /**
219      * @throws Exception if an error occurs
220      */
221     @Test
222     @Alerts({"createIFrame", "loaded", ""})
223     public void documentCreateElement_onLoad2_noSrc() throws Exception {
224         final String html = DOCTYPE_HTML
225             + "<html>\n"
226             + "<head><script type='text/javascript'>\n"
227             + LOG_TITLE_FUNCTION
228             + "  function createIFrame() {\n"
229             + "    log('createIFrame');\n"
230             + "    var myFrame = document.createElement('iframe');\n"
231             + "    myFrame.id = 'myFrame';\n"
232             + "    myFrame.onload = handleFrameLoad;\n"
233             + "    var body = document.getElementsByTagName('body')[0];\n"
234             + "    body.appendChild(myFrame);\n"
235             + "  }\n"
236             + "  function handleFrameLoad() {\n"
237             + "    log('loaded');\n"
238             + "    var myFrame = document.getElementById('myFrame');\n"
239             + "    log(myFrame.contentWindow.document.body.innerHTML);\n"
240             + "  }\n"
241             + "</script></head>\n"
242 
243             + "  <body onload='createIFrame();' >\n"
244             + "  </body>\n"
245             + "</html>";
246 
247         loadPageVerifyTitle2(html);
248     }
249 
250     /**
251      * A frame element that is not appended to the document should not be loaded.
252      * @throws Exception if an error occurs
253      */
254     @Test
255     @Alerts("created")
256     public void documentCreateElement_noAppendNoLoad() throws Exception {
257         final String html = DOCTYPE_HTML
258             + "<html><body><script>\n"
259             + LOG_TITLE_FUNCTION
260             + "var myFrame = document.createElement('iframe');\n"
261             + "myFrame.src = 'notExisting.html';\n"
262             + "log('created');\n"
263             + "</script></body></html>";
264 
265         loadPageVerifyTitle2(html);
266         assertEquals(1, getMockWebConnection().getRequestCount());
267     }
268 
269     /**
270      * Test case for issue ##1544.
271      * @throws Exception if an error occurs
272      */
273     @Test
274     @Alerts({"createIFrame", "loaded"})
275     public void documentCreateElement_iFrameInsideDiv() throws Exception {
276         final String html = DOCTYPE_HTML
277               + "<html>\n"
278               + "<head><script type='text/javascript'>\n"
279               + LOG_TITLE_FUNCTION
280               + "  function createIFrame() {\n"
281               + "    log('createIFrame');\n"
282               + "    var content = document.getElementById('content');\n"
283               + "    var newContent = document.createElement('div');\n"
284               + "    newContent.innerHTML = '<iframe name=\"iFrame\" src=\"" + URL_SECOND + "\"></iframe>';\n"
285               + "    content.appendChild(newContent);\n"
286               + "  }\n"
287               + "</script></head>\n"
288 
289               + "  <body>\n"
290               + "    <div id='content'>content</div>\n"
291               + "    <a id='test' onclick='createIFrame();'>insert frame</a>\n"
292               + "  </body>\n"
293               + "</html>";
294         final String html2 = DOCTYPE_HTML
295                 + "<html><body>"
296                 + "<script>window.parent.document.title += 'loaded\\u00a7';</script></body></html>";
297         getMockWebConnection().setResponse(URL_SECOND, html2);
298 
299         final WebDriver driver = loadPage2(html);
300 
301         driver.findElement(By.id("test")).click();
302 
303         verifyTitle2(driver, getExpectedAlerts());
304         assertEquals(2, getMockWebConnection().getRequestCount());
305     }
306 
307     /**
308      * @throws Exception if an error occurs
309      */
310     @Test
311     @Alerts({"createIFrame", "loaded", "foo"})
312     public void documentCreateElement_onLoad3() throws Exception {
313         final String html = DOCTYPE_HTML
314             + "<html>\n"
315             + "<head><script type='text/javascript'>\n"
316             + LOG_TITLE_FUNCTION
317             + "  function createIFrame() {\n"
318             + "    log('createIFrame');\n"
319             + "    var myFrame = document.createElement('iframe');\n"
320             + "    myFrame.id = 'myFrame';\n"
321             + "    myFrame.onload = handleFrameLoad;\n"
322             + "    myFrame.src = '" + URL_SECOND + "';\n"
323             + "    var body = document.getElementsByTagName('body')[0];\n"
324             + "    body.appendChild(myFrame);\n"
325             + "  }\n"
326             + "  function handleFrameLoad() {\n"
327             + "    log('loaded');\n"
328             + "    var myFrame = document.getElementById('myFrame');\n"
329             + "    log(myFrame.contentWindow.document.body.innerHTML);\n"
330             + "  }\n"
331             + "</script></head>\n"
332 
333             + "  <body onload='createIFrame();' >\n"
334             + "  </body>\n"
335             + "</html>";
336         final String html2 = DOCTYPE_HTML + "<html><body>foo</body></html>";
337         getMockWebConnection().setResponse(URL_SECOND, html2);
338 
339         loadPage2(html);
340         verifyTitle2(DEFAULT_WAIT_TIME, getWebDriver(), getExpectedAlerts());
341     }
342 
343     /**
344      * @throws Exception if an error occurs
345      */
346     @Test
347     @Alerts({"createIFrame", "loaded", ""})
348     public void documentCreateElement_onLoad3_noSrc() throws Exception {
349         final String html = DOCTYPE_HTML
350             + "<html>\n"
351             + "<head><script type='text/javascript'>\n"
352             + LOG_TITLE_FUNCTION
353             + "  function createIFrame() {\n"
354             + "    log('createIFrame');\n"
355             + "    var myFrame = document.createElement('iframe');\n"
356             + "    myFrame.id = 'myFrame';\n"
357             + "    myFrame.onload = handleFrameLoad;\n"
358             + "    var body = document.getElementsByTagName('body')[0];\n"
359             + "    body.appendChild(myFrame);\n"
360             + "  }\n"
361             + "  function handleFrameLoad() {\n"
362             + "    log('loaded');\n"
363             + "    var myFrame = document.getElementById('myFrame');\n"
364             + "    log(myFrame.contentWindow.document.body.innerHTML);\n"
365             + "  }\n"
366             + "</script></head>\n"
367 
368             + "  <body onload='createIFrame();' >\n"
369             + "  </body>\n"
370             + "</html>";
371 
372         loadPageVerifyTitle2(html);
373     }
374 
375     /**
376      * @throws Exception if an error occurs
377      */
378     @Test
379     public void documentFragmentCreateElement_onLoad() throws Exception {
380         final String html = DOCTYPE_HTML
381             + "<html>\n"
382             + "<head><script type='text/javascript'>\n"
383             + LOG_TITLE_FUNCTION
384             + "  function handleFrameLoad() {\n"
385             + "    log('loaded');\n"
386             + "  }\n"
387             + "</script></head>\n"
388 
389             + "  <body>\n"
390             + "    <script>\n"
391             + "      var myFrame = document.createElement('iframe');\n"
392             + "      myFrame.id = 'myFrame';\n"
393             + "      myFrame.src = '" + URL_SECOND + "';\n"
394             + "      myFrame.onload = handleFrameLoad;\n"
395             + "      var fragment = document.createDocumentFragment();\n"
396             + "      fragment.appendChild(myFrame);\n"
397             + "    </script>\n"
398             + "  </body>\n"
399             + "</html>";
400         final String html2 = DOCTYPE_HTML + "<html><body>foo</body></html>";
401         getMockWebConnection().setResponse(URL_SECOND, html2);
402 
403         loadPageVerifyTitle2(html);
404     }
405 
406     /**
407      * @throws Exception if an error occurs
408      */
409     @Test
410     public void documentFragmentCreateElement_onLoad_noSrc() throws Exception {
411         final String html =
412               "<html>\n"
413             + "<head><script type='text/javascript'>\n"
414             + LOG_TITLE_FUNCTION
415             + "  function handleFrameLoad() {\n"
416             + "    log('loaded');\n"
417             + "  }\n"
418             + "</script></head>\n"
419 
420             + "  <body>\n"
421             + "    <script>\n"
422             + "      var myFrame = document.createElement('iframe');\n"
423             + "      myFrame.id = 'myFrame';\n"
424             + "      myFrame.onload = handleFrameLoad;\n"
425             + "      var fragment = document.createDocumentFragment();\n"
426             + "      fragment.appendChild(myFrame);\n"
427             + "    </script>\n"
428             + "  </body>\n"
429             + "</html>";
430 
431         loadPageVerifyTitle2(html);
432     }
433 
434     /**
435      * @throws Exception if an error occurs
436      */
437     @Test
438     @Alerts("createIFrame")
439     public void documentFragmentCreateElement_onLoad2() throws Exception {
440         final String html = DOCTYPE_HTML
441             + "<html>\n"
442             + "<head><script type='text/javascript'>\n"
443             + LOG_TITLE_FUNCTION
444             + "  function createIFrame() {\n"
445             + "    log('createIFrame');\n"
446             + "    var myFrame = document.createElement('iframe');\n"
447             + "    myFrame.id = 'myFrame';\n"
448             + "    myFrame.src = '" + URL_SECOND + "';\n"
449             + "    myFrame.onload = handleFrameLoad;\n"
450             + "    var fragment = document.createDocumentFragment();\n"
451             + "    fragment.appendChild(myFrame);\n"
452             + "  }\n"
453             + "  function handleFrameLoad() {\n"
454             + "    log('loaded');\n"
455             + "  }\n"
456             + "</script></head>\n"
457 
458             + "  <body onload='createIFrame();' >\n"
459             + "  </body>\n"
460             + "</html>";
461         final String html2 = DOCTYPE_HTML + "<html><body>foo</body></html>";
462         getMockWebConnection().setResponse(URL_SECOND, html2);
463 
464         loadPageVerifyTitle2(html);
465     }
466 
467     /**
468      * @throws Exception if an error occurs
469      */
470     @Test
471     @Alerts("createIFrame")
472     public void documentFragmentCreateElement_onLoad2_noSrc() throws Exception {
473         final String html = DOCTYPE_HTML
474             + "<html>\n"
475             + "<head><script type='text/javascript'>\n"
476             + LOG_TITLE_FUNCTION
477             + "  function createIFrame() {\n"
478             + "    log('createIFrame');\n"
479             + "    var myFrame = document.createElement('iframe');\n"
480             + "    myFrame.id = 'myFrame';\n"
481             + "    myFrame.onload = handleFrameLoad;\n"
482             + "    var fragment = document.createDocumentFragment();\n"
483             + "    fragment.appendChild(myFrame);\n"
484             + "  }\n"
485             + "  function handleFrameLoad() {\n"
486             + "    log('loaded');\n"
487             + "  }\n"
488             + "</script></head>\n"
489 
490             + "  <body onload='createIFrame();' >\n"
491             + "  </body>\n"
492             + "</html>";
493 
494         loadPageVerifyTitle2(html);
495     }
496 
497     /**
498      * @throws Exception if an error occurs
499      */
500     @Test
501     @Alerts("createIFrame")
502     public void documentFragmentCreateElement_onLoad3() throws Exception {
503         final String html = DOCTYPE_HTML
504             + "<html>\n"
505             + "<head><script type='text/javascript'>\n"
506             + LOG_TITLE_FUNCTION
507             + "  function createIFrame() {\n"
508             + "    log('createIFrame');\n"
509             + "    var myFrame = document.createElement('iframe');\n"
510             + "    myFrame.id = 'myFrame';\n"
511             + "    myFrame.onload = handleFrameLoad;\n"
512             + "    myFrame.src = '" + URL_SECOND + "';\n"
513             + "    var fragment = document.createDocumentFragment();\n"
514             + "    fragment.appendChild(myFrame);\n"
515             + "  }\n"
516             + "  function handleFrameLoad() {\n"
517             + "    log('loaded');\n"
518             + "  }\n"
519             + "</script></head>\n"
520 
521             + "  <body onload='createIFrame();' >\n"
522             + "  </body>\n"
523             + "</html>";
524         final String html2 = DOCTYPE_HTML + "<html><body>foo</body></html>";
525         getMockWebConnection().setResponse(URL_SECOND, html2);
526 
527         loadPageVerifyTitle2(html);
528     }
529 
530     /**
531      * @throws Exception if an error occurs
532      */
533     @Test
534     @Alerts({"createIFrame", "loaded"})
535     public void documentCreateElement_onLoad_srcAboutBlank() throws Exception {
536         documentCreateElement_onLoad_srcX("about:blank");
537     }
538 
539     /**
540      * @throws Exception if an error occurs
541      */
542     @Test
543     @Alerts({"createIFrame", "loaded"})
544     public void documentCreateElement_onLoad_srcSomePage() throws Exception {
545         documentCreateElement_onLoad_srcX("foo.html");
546     }
547 
548     private void documentCreateElement_onLoad_srcX(final String iframeSrc) throws Exception {
549         final String html = DOCTYPE_HTML
550             + "<html><body><script>\n"
551             + LOG_TITLE_FUNCTION
552             + "function createIFrame() {\n"
553             + "  log('createIFrame');\n"
554             + "  var myFrame = document.createElement('iframe');\n"
555             + "  myFrame.onload = handleFrameLoad;\n"
556             + "  myFrame.src = '" + iframeSrc + "';\n"
557             + "  document.body.appendChild(myFrame);\n"
558             + "}\n"
559             + "function handleFrameLoad() {\n"
560             + "  log('loaded');\n"
561             + "}\n"
562             + "</script>\n"
563             + "<button id='it' onclick='createIFrame()'>click me</button>\n"
564             + "</body></html>";
565 
566         getMockWebConnection().setDefaultResponse("");
567         final WebDriver driver = loadPage2(html);
568         driver.findElement(By.id("it")).click();
569         if (useRealBrowser()) {
570             Thread.sleep(400);
571         }
572 
573         verifyTitle2(driver, getExpectedAlerts());
574     }
575 
576     /**
577      * @throws Exception if an error occurs
578      */
579     @Test
580     @Alerts("createIFrame")
581     public void documentFragmentCreateElement_onLoad3_noSrc() throws Exception {
582         final String html = DOCTYPE_HTML
583             + "<html>\n"
584             + "<head><script type='text/javascript'>\n"
585             + LOG_TITLE_FUNCTION
586             + "  function createIFrame() {\n"
587             + "    log('createIFrame');\n"
588             + "    var myFrame = document.createElement('iframe');\n"
589             + "    myFrame.id = 'myFrame';\n"
590             + "    myFrame.onload = handleFrameLoad;\n"
591             + "    var fragment = document.createDocumentFragment();\n"
592             + "    fragment.appendChild(myFrame);\n"
593             + "  }\n"
594             + "  function handleFrameLoad() {\n"
595             + "    log('loaded');\n"
596             + "  }\n"
597             + "</script></head>\n"
598 
599             + "  <body onload='createIFrame();' >\n"
600             + "  </body>\n"
601             + "</html>";
602 
603         loadPageVerifyTitle2(html);
604     }
605 
606     /**
607      * @throws Exception if an error occurs
608      */
609     @Test
610     @Alerts({"fragment append done", "loaded"})
611     public void documentDocumentFragmentCreateElement_onLoad() throws Exception {
612         final String html = DOCTYPE_HTML
613             + "<html>\n"
614             + "<head><script type='text/javascript'>\n"
615             + LOG_TITLE_FUNCTION
616             + "  function handleFrameLoad() {\n"
617             + "    log('loaded');\n"
618             + "  }\n"
619             + "</script></head>\n"
620 
621             + "  <body>\n"
622             + "    <script>\n"
623             + "      var myFrame = document.createElement('iframe');\n"
624             + "      myFrame.id = 'myFrame';\n"
625             + "      myFrame.src = '" + URL_SECOND + "';\n"
626             + "      myFrame.onload = handleFrameLoad;\n"
627             + "      var fragment = document.createDocumentFragment();\n"
628             + "      fragment.appendChild(myFrame);\n"
629             + "      log('fragment append done');\n"
630             + "      var body = document.getElementsByTagName('body')[0];\n"
631             + "      body.appendChild(myFrame);\n"
632             + "    </script>\n"
633             + "  </body>\n"
634             + "</html>";
635         final String html2 = DOCTYPE_HTML + "<html><body>foo</body></html>";
636         getMockWebConnection().setResponse(URL_SECOND, html2);
637 
638         loadPageVerifyTitle2(html);
639     }
640 
641     /**
642      * @throws Exception if an error occurs
643      */
644     @Test
645     @Alerts({"fragment append done", "loaded"})
646     public void documentDocumentFragmentCreateElement_onLoad_noSrc() throws Exception {
647         final String html = DOCTYPE_HTML
648             + "<html>\n"
649             + "<head><script type='text/javascript'>\n"
650             + LOG_TITLE_FUNCTION
651             + "  function handleFrameLoad() {\n"
652             + "    log('loaded');\n"
653             + "  }\n"
654             + "</script></head>\n"
655 
656             + "  <body>\n"
657             + "    <script>\n"
658             + "      var myFrame = document.createElement('iframe');\n"
659             + "      myFrame.id = 'myFrame';\n"
660             + "      myFrame.onload = handleFrameLoad;\n"
661             + "      var fragment = document.createDocumentFragment();\n"
662             + "      fragment.appendChild(myFrame);\n"
663             + "      log('fragment append done');\n"
664             + "      var body = document.getElementsByTagName('body')[0];\n"
665             + "      body.appendChild(myFrame);\n"
666             + "    </script>\n"
667             + "  </body>\n"
668             + "</html>";
669 
670         loadPageVerifyTitle2(html);
671     }
672 
673     /**
674      * @throws Exception if an error occurs
675      */
676     @Test
677     @Alerts({"createIFrame", "fragment append done", "loaded"})
678     public void documentDocumentFragmentCreateElement_onLoad2() throws Exception {
679         final String html = DOCTYPE_HTML
680             + "<html>\n"
681             + "<head><script type='text/javascript'>\n"
682             + LOG_TITLE_FUNCTION
683             + "  function createIFrame() {\n"
684             + "    log('createIFrame');\n"
685             + "    var myFrame = document.createElement('iframe');\n"
686             + "    myFrame.id = 'myFrame';\n"
687             + "    myFrame.src = '" + URL_SECOND + "';\n"
688             + "    myFrame.onload = handleFrameLoad;\n"
689             + "    var fragment = document.createDocumentFragment();\n"
690             + "    fragment.appendChild(myFrame);\n"
691             + "    log('fragment append done');\n"
692             + "    var body = document.getElementsByTagName('body')[0];\n"
693             + "    body.appendChild(myFrame);\n"
694             + "  }\n"
695             + "  function handleFrameLoad() {\n"
696             + "    log('loaded');\n"
697             + "  }\n"
698             + "</script></head>\n"
699 
700             + "  <body onload='createIFrame();' >\n"
701             + "  </body>\n"
702             + "</html>";
703         final String html2 = DOCTYPE_HTML + "<html><body>foo</body></html>";
704         getMockWebConnection().setResponse(URL_SECOND, html2);
705 
706         loadPage2(html);
707         verifyTitle2(DEFAULT_WAIT_TIME, getWebDriver(), getExpectedAlerts());
708     }
709 
710     /**
711      * @throws Exception if an error occurs
712      */
713     @Test
714     @Alerts({"createIFrame", "fragment append done", "loaded"})
715     public void documentDocumentFragmentCreateElement_onLoad2_noSrc() throws Exception {
716         final String html = DOCTYPE_HTML
717             + "<html>\n"
718             + "<head><script type='text/javascript'>\n"
719             + LOG_TITLE_FUNCTION
720             + "  function createIFrame() {\n"
721             + "    log('createIFrame');\n"
722             + "    var myFrame = document.createElement('iframe');\n"
723             + "    myFrame.id = 'myFrame';\n"
724             + "    myFrame.onload = handleFrameLoad;\n"
725             + "    var fragment = document.createDocumentFragment();\n"
726             + "    fragment.appendChild(myFrame);\n"
727             + "    log('fragment append done');\n"
728             + "    var body = document.getElementsByTagName('body')[0];\n"
729             + "    body.appendChild(myFrame);\n"
730             + "  }\n"
731             + "  function handleFrameLoad() {\n"
732             + "    log('loaded');\n"
733             + "  }\n"
734             + "</script></head>\n"
735 
736             + "  <body onload='createIFrame();' >\n"
737             + "  </body>\n"
738             + "</html>";
739 
740         loadPageVerifyTitle2(html);
741     }
742 
743     /**
744      * @throws Exception if an error occurs
745      */
746     @Test
747     @Alerts({"createIFrame", "fragment append done", "loaded"})
748     public void documentDocumentFragmentCreateElement_onLoad3() throws Exception {
749         final String html = DOCTYPE_HTML
750             + "<html>\n"
751             + "<head><script type='text/javascript'>\n"
752             + LOG_TITLE_FUNCTION
753             + "  function createIFrame() {\n"
754             + "    log('createIFrame');\n"
755             + "    var myFrame = document.createElement('iframe');\n"
756             + "    myFrame.id = 'myFrame';\n"
757             + "    myFrame.onload = handleFrameLoad;\n"
758             + "    myFrame.src = '" + URL_SECOND + "';\n"
759             + "    var fragment = document.createDocumentFragment();\n"
760             + "    fragment.appendChild(myFrame);\n"
761             + "    log('fragment append done');\n"
762             + "    var body = document.getElementsByTagName('body')[0];\n"
763             + "    body.appendChild(myFrame);\n"
764             + "  }\n"
765             + "  function handleFrameLoad() {\n"
766             + "    log('loaded');\n"
767             + "  }\n"
768             + "</script></head>\n"
769 
770             + "  <body onload='createIFrame();' >\n"
771             + "  </body>\n"
772             + "</html>";
773         final String html2 = DOCTYPE_HTML + "<html><body>foo</body></html>";
774         getMockWebConnection().setResponse(URL_SECOND, html2);
775 
776         loadPage2(html);
777         verifyTitle2(DEFAULT_WAIT_TIME, getWebDriver(), getExpectedAlerts());
778     }
779 
780     /**
781      * @throws Exception if an error occurs
782      */
783     @Test
784     @Alerts({"createIFrame", "fragment append done", "loaded"})
785     public void documentDocumentFragmentCreateElement_onLoad3_noSrc() throws Exception {
786         final String html = DOCTYPE_HTML
787             + "<html>\n"
788             + "<head><script type='text/javascript'>\n"
789             + LOG_TITLE_FUNCTION
790             + "  function createIFrame() {\n"
791             + "    log('createIFrame');\n"
792             + "    var myFrame = document.createElement('iframe');\n"
793             + "    myFrame.id = 'myFrame';\n"
794             + "    myFrame.onload = handleFrameLoad;\n"
795             + "    var fragment = document.createDocumentFragment();\n"
796             + "    fragment.appendChild(myFrame);\n"
797             + "    log('fragment append done');\n"
798             + "    var body = document.getElementsByTagName('body')[0];\n"
799             + "    body.appendChild(myFrame);\n"
800             + "  }\n"
801             + "  function handleFrameLoad() {\n"
802             + "    log('loaded');\n"
803             + "  }\n"
804             + "</script></head>\n"
805 
806             + "  <body onload='createIFrame();' >\n"
807             + "  </body>\n"
808             + "</html>";
809 
810         loadPage2(html);
811         verifyTitle2(DEFAULT_WAIT_TIME, getWebDriver(), getExpectedAlerts());
812     }
813 
814     /**
815      * @throws Exception if an error occurs
816      */
817     @Test
818     @Alerts({"left", "right", "bottom", "middle", "top", "wrong", ""})
819     public void getAlign() throws Exception {
820         final String html = DOCTYPE_HTML
821             + "<html><body>\n"
822             + "  <iframe id='i1' align='left' ></iframe>\n"
823             + "  <iframe id='i2' align='right' ></iframe>\n"
824             + "  <iframe id='i3' align='bottom' ></iframe>\n"
825             + "  <iframe id='i4' align='middle' ></iframe>\n"
826             + "  <iframe id='i5' align='top' ></iframe>\n"
827             + "  <iframe id='i6' align='wrong' ></iframe>\n"
828             + "  <iframe id='i7' ></iframe>\n"
829 
830             + "<script>\n"
831             + LOG_TITLE_FUNCTION
832             + "  for (var i = 1; i <= 7; i++) {\n"
833             + "    log(document.getElementById('i' + i).align);\n"
834             + "  }\n"
835             + "</script>\n"
836             + "</body></html>";
837 
838         loadPageVerifyTitle2(html);
839     }
840 
841     /**
842      * @throws Exception if an error occurs
843      */
844     @Test
845     @Alerts({"CenTer", "8", "foo", "left", "right", "bottom", "middle", "top"})
846     public void setAlign() throws Exception {
847         final String html = DOCTYPE_HTML
848             + "<html><body>\n"
849             + "  <iframe id='i1' align='left' ></iframe>\n"
850 
851             + "<script>\n"
852             + LOG_TITLE_FUNCTION
853             + "  function setAlign(elem, value) {\n"
854             + "    try {\n"
855             + "      elem.align = value;\n"
856             + "    } catch(e) { logEx(e); }\n"
857             + "    log(elem.align);\n"
858             + "  }\n"
859 
860             + "  var elem = document.getElementById('i1');\n"
861             + "  setAlign(elem, 'CenTer');\n"
862 
863             + "  setAlign(elem, '8');\n"
864             + "  setAlign(elem, 'foo');\n"
865 
866             + "  setAlign(elem, 'left');\n"
867             + "  setAlign(elem, 'right');\n"
868             + "  setAlign(elem, 'bottom');\n"
869             + "  setAlign(elem, 'middle');\n"
870             + "  setAlign(elem, 'top');\n"
871             + "</script>\n"
872             + "</body></html>";
873 
874         loadPageVerifyTitle2(html);
875     }
876 
877     /**
878      * @throws Exception if an error occurs
879      */
880     @Test
881     @Alerts({"loaded", "loaded", "loaded"})
882     public void onLoadCalledEachTimeFrameContentChanges() throws Exception {
883         final String html = DOCTYPE_HTML
884             + "<html>\n"
885             + "  <body>\n"
886             + "    <script>\n"
887             + LOG_TITLE_FUNCTION
888             + "    </script>\n"
889             + "    <iframe id='testFrame' onload='log(\"loaded\");'></iframe>\n"
890             + "    <div id='d1' onclick='i.contentWindow.location.replace(\"blah.html\")'>1</div>\n"
891             + "    <div id='d2' onclick='i.contentWindow.location.href=\"blah.html\"'>2</div>\n"
892             + "    <script>var i = document.getElementById('testFrame')</script>\n"
893             + "  </body>\n"
894             + "</html>";
895 
896         final String frameHtml = DOCTYPE_HTML + "<html><body>foo</body></html>";
897 
898         getMockWebConnection().setDefaultResponse(frameHtml);
899 
900         final WebDriver driver = loadPage2(html);
901         verifyTitle2(driver, getExpectedAlerts()[0]);
902         driver.findElement(By.id("d1")).click();
903         verifyTitle2(driver, new String[] {getExpectedAlerts()[0], getExpectedAlerts()[1]});
904         driver.findElement(By.id("d2")).click();
905         verifyTitle2(driver, getExpectedAlerts());
906     }
907 
908     /**
909      * @throws Exception if an error occurs
910      */
911     @Test
912     @Alerts({"about:blank", "§§URL§§", "§§URL§§"})
913     public void location() throws Exception {
914         final String html = DOCTYPE_HTML
915               + "<html>\n"
916               + "<head><script>\n"
917               + LOG_TITLE_FUNCTION
918               + "  function test() {\n"
919               + "    var myFrame = document.createElement('iframe');\n"
920               + "    document.body.appendChild(myFrame);\n"
921               + "    var win = myFrame.contentWindow;\n"
922               + "    var doc = win.document;\n"
923               + "    log(win.location);\n"
924               + "    doc.open();\n"
925               + "    log(win.location);\n"
926               + "    doc.write('');\n"
927               + "    doc.close();\n"
928               + "    log(win.location);\n"
929               + "  }\n"
930               + "</script></head>\n"
931               + "  <body onload='test()'>\n"
932               + "  </body>\n"
933               + "</html>";
934 
935         expandExpectedAlertsVariables(URL_FIRST);
936         loadPage2(html);
937         verifyTitle2(DEFAULT_WAIT_TIME, getWebDriver(), getExpectedAlerts());
938     }
939 
940     /**
941      * @throws Exception if an error occurs
942      */
943     @Test
944     @Alerts({"loaded", "§§URL§§", "§§URL§§", "loaded", "about:blank"})
945     public void removeSourceAttribute() throws Exception {
946         final String html = DOCTYPE_HTML
947                 + "<html>\n"
948                 + "<head><script>\n"
949                 + LOG_TEXTAREA_FUNCTION
950 
951                 + "  function test() {\n"
952                 + "    var myFrame = document.getElementById('i');\n"
953                 + "    var win = myFrame.contentWindow;\n"
954                 + "    log(win.location);\n"
955 
956                 + "    myFrame.removeAttribute('src');\n"
957                 + "    log(win.location);\n"
958                 + "  }\n"
959 
960                 + "  function test2() {\n"
961                 + "    var myFrame = document.getElementById('i');\n"
962                 + "    var win = myFrame.contentWindow;\n"
963                 + "    log(win.location);\n"
964                 + "  }\n"
965                 + "</script></head>\n"
966                 + "  <body>\n"
967                 + "    <iframe id='i' onload='log(\"loaded\");' src='" + URL_SECOND + "'></iframe>\n"
968 
969                 + LOG_TEXTAREA
970                 + "    <button id='clickMe' onclick='test()'>Click Me</button>\n"
971                 + "    <button id='clickMe2' onclick='test2()'>Click Me</button>\n"
972                 + "  </body>\n"
973                 + "</html>";
974 
975         final String html2 = DOCTYPE_HTML + "<html><body>foo</body></html>";
976         getMockWebConnection().setResponse(URL_SECOND, html2);
977 
978         final WebDriver driver = loadPage2(html);
979         driver.findElement(By.id("clickMe")).click();
980         driver.findElement(By.id("clickMe2")).click();
981 
982         expandExpectedAlertsVariables(URL_SECOND);
983         verifyTextArea2(driver, getExpectedAlerts());
984     }
985 
986     /**
987      * @throws Exception if an error occurs
988      */
989     @Test
990     @Alerts({"loaded", "§§URL§§", "[object HTMLDocument]", "http://localhost:22222/second/",
991                 "1", "[object Window]", "[object HTMLDocument]", "http://localhost:22222/second/",
992                 "0", "#[object Window]", "#[object HTMLDocument]", "http://localhost:22222/second/"})
993     public void detach() throws Exception {
994         final String html = DOCTYPE_HTML
995                 + "<html>\n"
996                 + "<head><script>\n"
997                 + LOG_TEXTAREA_FUNCTION
998 
999                 + "  function test() {\n"
1000                 + "    var myFrame = document.getElementById('i');\n"
1001                 + "    var win = myFrame.contentWindow;\n"
1002                 + "    log(win.location);\n"
1003                 + "    log(win.document);\n"
1004                 + "    log(win.document.URL);\n"
1005                 + "    log(window.frames.length);\n"
1006 
1007                 + "    myFrame.parentNode.removeChild(myFrame);\n"
1008                 + "    log(win);\n"
1009                 + "    log(win.document);\n"
1010                 + "    log(win.document.URL);\n"
1011                 + "    log(window.frames.length);\n"
1012 
1013                 + "    window.setTimeout(function () "
1014                             + "{ log('#' + win); log('#' + win.document); log(win.document.URL); }, 42);\n"
1015                 + "  }\n"
1016 
1017                 + "</script></head>\n"
1018                 + "  <body>\n"
1019                 + "    <iframe id='i' onload='log(\"loaded\");' src='" + URL_SECOND + "'></iframe>\n"
1020 
1021                 + LOG_TEXTAREA
1022                 + "    <button id='clickMe' onclick='test()'>Click Me</button>\n"
1023                 + "  </body>\n"
1024                 + "</html>";
1025 
1026         final String html2 = DOCTYPE_HTML + "<html><body>foo</body></html>";
1027         getMockWebConnection().setResponse(URL_SECOND, html2);
1028 
1029         final WebDriver driver = loadPage2(html);
1030         driver.findElement(By.id("clickMe")).click();
1031         Thread.sleep(200);
1032 
1033         expandExpectedAlertsVariables(URL_SECOND);
1034         verifyTextArea2(driver, getExpectedAlerts());
1035     }
1036 
1037     /**
1038      * @throws Exception if an error occurs
1039      */
1040     @Test
1041     @Alerts({"iframe script", "loaded", "null", "[object Window]",
1042              "about:blank", "iframe script", "loaded"})
1043     @HtmlUnitNYI(CHROME = {"iframe script", "loaded", "null", "loaded", "[object Window]",
1044                            "about:blank", "iframe script", "loaded"},
1045             EDGE = {"iframe script", "loaded", "null", "loaded", "[object Window]",
1046                     "about:blank", "iframe script", "loaded"},
1047             FF = {"iframe script", "loaded", "null", "loaded", "[object Window]",
1048                   "about:blank", "iframe script", "loaded"},
1049             FF_ESR = {"iframe script", "loaded", "null", "loaded", "[object Window]",
1050                       "about:blank", "iframe script", "loaded"})
1051     public void detachAppend() throws Exception {
1052         final String html = DOCTYPE_HTML
1053                 + "<html>\n"
1054                 + "<head><script>\n"
1055                 + LOG_TEXTAREA_FUNCTION
1056 
1057                 + "  function test() {\n"
1058                 + "    var myFrame = document.getElementById('i');\n"
1059 
1060                 + "    var parent = myFrame.parentNode;\n"
1061                 + "    parent.removeChild(myFrame);\n"
1062                 + "    log(myFrame.contentWindow);\n"
1063 
1064                 + "    parent.appendChild(myFrame);\n"
1065                 + "    log(myFrame.contentWindow);\n"
1066                 + "    log(myFrame.contentWindow.location);\n"
1067                 + "  }\n"
1068 
1069                 + "</script></head>\n"
1070                 + "  <body>\n"
1071                 + "    <iframe id='i' onload='log(\"loaded\");' src='" + URL_SECOND + "'></iframe>\n"
1072 
1073                 + LOG_TEXTAREA
1074                 + "    <button id='clickMe' onclick='test()'>Click Me</button>\n"
1075                 + "  </body>\n"
1076                 + "</html>";
1077 
1078         final String html2 = DOCTYPE_HTML
1079                 + "<html><body>foo<script>parent.log('iframe script');</script></body></html>";
1080         getMockWebConnection().setResponse(URL_SECOND, html2);
1081 
1082         final WebDriver driver = loadPage2(html);
1083         Thread.sleep(DEFAULT_WAIT_TIME.toMillis());
1084         final int start = getMockWebConnection().getRequestCount();
1085 
1086         driver.findElement(By.id("clickMe")).click();
1087         Thread.sleep(DEFAULT_WAIT_TIME.toMillis());
1088 
1089         assertEquals(1, getMockWebConnection().getRequestCount() - start);
1090 
1091         expandExpectedAlertsVariables(URL_SECOND);
1092         verifyTextArea2(driver, getExpectedAlerts());
1093     }
1094 
1095     /**
1096      * @throws Exception if an error occurs
1097      */
1098     @Test
1099     @Alerts({"iframe external script", "loaded", "null", "[object Window]",
1100              "about:blank", "iframe external script", "loaded"})
1101     @HtmlUnitNYI(CHROME = {"iframe external script", "loaded", "null", "loaded", "[object Window]",
1102                            "about:blank", "iframe external script", "loaded"},
1103             EDGE = {"iframe external script", "loaded", "null", "loaded", "[object Window]",
1104                     "about:blank", "iframe external script", "loaded"},
1105             FF = {"iframe external script", "loaded", "null", "loaded", "[object Window]",
1106                   "about:blank", "iframe external script", "loaded"},
1107             FF_ESR = {"iframe external script", "loaded", "null", "loaded", "[object Window]",
1108                       "about:blank", "iframe external script", "loaded"})
1109     public void detachAppendExternalScript() throws Exception {
1110         final String html = DOCTYPE_HTML
1111                 + "<html>\n"
1112                 + "<head><script>\n"
1113                 + LOG_TEXTAREA_FUNCTION
1114 
1115                 + "  function test() {\n"
1116                 + "    var myFrame = document.getElementById('i');\n"
1117 
1118                 + "    var parent = myFrame.parentNode;\n"
1119                 + "    parent.removeChild(myFrame);\n"
1120                 + "    log(myFrame.contentWindow);\n"
1121 
1122                 + "    parent.appendChild(myFrame);\n"
1123                 + "    log(myFrame.contentWindow);\n"
1124                 + "    log(myFrame.contentWindow.location);\n"
1125                 + "  }\n"
1126 
1127                 + "</script></head>\n"
1128                 + "  <body>\n"
1129                 + "    <iframe id='i' onload='log(\"loaded\");' src='" + URL_SECOND + "'></iframe>\n"
1130 
1131                 + LOG_TEXTAREA
1132                 + "    <button id='clickMe' onclick='test()'>Click Me</button>\n"
1133                 + "  </body>\n"
1134                 + "</html>";
1135 
1136         final String html2 = DOCTYPE_HTML
1137                 + "<html><body>foo<script src='"
1138                       + URL_SECOND + "ext.js'></script></body></html>";
1139         getMockWebConnection().setResponse(URL_SECOND, html2);
1140         final String js = "parent.log('iframe external script');";
1141         getMockWebConnection().setResponse(new URL(URL_SECOND, "ext.js"), js, MimeType.TEXT_JAVASCRIPT);
1142 
1143         final WebDriver driver = loadPage2(html);
1144         Thread.sleep(DEFAULT_WAIT_TIME.toMillis());
1145         final int start = getMockWebConnection().getRequestCount();
1146 
1147         driver.findElement(By.id("clickMe")).click();
1148         Thread.sleep(DEFAULT_WAIT_TIME.toMillis());
1149 
1150         assertEquals(2, getMockWebConnection().getRequestCount() - start);
1151 
1152         expandExpectedAlertsVariables(URL_SECOND);
1153         verifyTextArea2(driver, getExpectedAlerts());
1154     }
1155 }