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