1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.html;
16
17 import static org.junit.jupiter.api.Assertions.fail;
18
19 import java.net.URL;
20 import java.util.ArrayList;
21 import java.util.List;
22
23 import org.htmlunit.CollectingAlertHandler;
24 import org.htmlunit.FailingHttpStatusCodeException;
25 import org.htmlunit.FrameContentHandler;
26 import org.htmlunit.MockWebConnection;
27 import org.htmlunit.SimpleWebTestCase;
28 import org.htmlunit.WebClient;
29 import org.htmlunit.junit.annotation.Alerts;
30 import org.htmlunit.util.MimeType;
31 import org.junit.jupiter.api.Test;
32
33
34
35
36
37
38
39
40 public class HtmlFrameTest extends SimpleWebTestCase {
41
42
43
44
45 @Test
46 public void srcOfBlankAndEmpty() throws Exception {
47 final String html = DOCTYPE_HTML
48 + "<html><head><title>first</title></head>\n"
49 + "<frameset cols='20%,80%'>\n"
50 + " <frame src='' id='frame1'>\n"
51 + " <frame src='about:blank' id='frame2'>\n"
52 + "</frameset></html>";
53 final HtmlPage page = loadPage(html);
54
55 final HtmlFrame frame1 = page.getHtmlElementById("frame1");
56 assertEquals("frame1", "", ((HtmlPage) frame1.getEnclosedPage()).getTitleText());
57
58 final HtmlFrame frame2 = page.getHtmlElementById("frame2");
59 assertEquals("frame2", "", ((HtmlPage) frame2.getEnclosedPage()).getTitleText());
60 }
61
62
63
64
65 @Test
66 public void onLoadHandler() throws Exception {
67 final WebClient webClient = getWebClientWithMockWebConnection();
68 final MockWebConnection webConnection = getMockWebConnection();
69 final List<String> collectedAlerts = new ArrayList<>();
70 webClient.setAlertHandler(new CollectingAlertHandler(collectedAlerts));
71
72 final String html = DOCTYPE_HTML
73 + "<html><head><title>first</title></head>\n"
74 + "<frameset cols='20%,80%'>\n"
75 + " <frame id='frame1'>\n"
76 + " <frame onload='alert(this.tagName)' id='frame2'>\n"
77 + "</frameset></html>";
78 final String[] expectedAlerts = {"FRAME"};
79
80 webConnection.setResponse(URL_FIRST, html);
81
82 final HtmlPage page = webClient.getPage(URL_FIRST);
83 assertEquals("first", page.getTitleText());
84
85 final HtmlFrame frame1 = page.getHtmlElementById("frame1");
86 assertEquals("frame1", "", ((HtmlPage) frame1.getEnclosedPage()).getTitleText());
87
88 final HtmlFrame frame2 = page.getHtmlElementById("frame2");
89 assertEquals("frame2", "", ((HtmlPage) frame2.getEnclosedPage()).getTitleText());
90
91 assertEquals(expectedAlerts, collectedAlerts);
92 }
93
94
95
96
97 @Test
98 public void documentWrite() throws Exception {
99 final String html = DOCTYPE_HTML
100 + "<html><head><title>first</title></head>\n"
101 + "<frameset cols='20%,80%'>\n"
102 + " <frame src='' name='frame1' id='frame1'>\n"
103 + " <frame onload=\"frame1.document.open();frame1.document.write("
104 + "'<html><head><title>generated</title></head><body>generated</body></html>');"
105 + "frame1.document.close()\" id='frame2'>\n"
106 + "</frameset></html>";
107 final HtmlPage page = loadPage(html);
108
109 assertEquals("first", page.getTitleText());
110
111 final HtmlFrame frame1 = page.getHtmlElementById("frame1");
112 assertEquals("frame1", "generated", ((HtmlPage) frame1.getEnclosedPage()).getTitleText());
113
114 final HtmlFrame frame2 = page.getHtmlElementById("frame2");
115 assertEquals("frame2", "", ((HtmlPage) frame2.getEnclosedPage()).getTitleText());
116 }
117
118
119
120
121
122 @Test
123 public void deregisterNonHtmlFrame() throws Exception {
124 final WebClient webClient = getWebClientWithMockWebConnection();
125 final MockWebConnection webConnection = getMockWebConnection();
126
127 final String html = DOCTYPE_HTML
128 + "<html><head><title>first</title></head>\n"
129 + "<frameset cols='100%'>\n"
130 + " <frame src='foo.txt'>\n"
131 + "</frameset></html>";
132 webConnection.setDefaultResponse("foo", 200, "OK", MimeType.TEXT_PLAIN);
133 webConnection.setResponse(URL_FIRST, html);
134
135 final HtmlPage page = webClient.getPage(URL_FIRST);
136 assertEquals("first", page.getTitleText());
137
138
139 webClient.getPage(URL_SECOND);
140 }
141
142
143
144
145 @Test
146 public void failingHttpStatusCodeException() throws Exception {
147 final String failingHtml = DOCTYPE_HTML + "<html><head><body>Not found</body></html>";
148
149 final String firstHtml = DOCTYPE_HTML
150 + "<html><head><title>First</title></head>\n"
151 + "<frameset cols='130,*'>\n"
152 + " <frame scrolling='no' name='left' src='" + "failing_url" + "' frameborder='1' />\n"
153 + " <frame scrolling='auto' name='right' src='" + URL_THIRD + "' frameborder='1' />\n"
154 + " <noframes>\n"
155 + " <body>Frames not supported</body>\n"
156 + " </noframes>\n"
157 + "</frameset>\n"
158 + "</html>";
159
160 final String secondHtml = DOCTYPE_HTML + "<html><head><title>Second</title></head><body></body></html>";
161 final String thirdHtml = DOCTYPE_HTML + "<html><head><title>Third</title></head><body></body></html>";
162
163 final WebClient webClient = getWebClientWithMockWebConnection();
164
165 final MockWebConnection webConnection = getMockWebConnection();
166 webConnection.setDefaultResponse(failingHtml, 404, "Not Found", MimeType.TEXT_HTML);
167 webConnection.setResponse(URL_FIRST, firstHtml);
168 webConnection.setResponse(URL_SECOND, secondHtml);
169 webConnection.setResponse(URL_THIRD, thirdHtml);
170
171 try {
172 webClient.getPage(URL_FIRST);
173 fail("Expected FailingHttpStatusCodeException");
174 }
175 catch (final FailingHttpStatusCodeException e) {
176 assertEquals(404, e.getStatusCode());
177 }
178 }
179
180
181
182
183
184 @Test
185 public void frameScriptReplaceOtherFrame() throws Exception {
186 final String html = DOCTYPE_HTML
187 + "<html><head><title>frames</title></head>\n"
188 + "<frameset cols='180,*'>\n"
189 + "<frame name='f1' src='1.html'/>\n"
190 + "<frame name='f2' src='2.html'/>\n"
191 + "</frameset>\n"
192 + "</html>";
193
194 final String frame1 = DOCTYPE_HTML
195 + "<html><head><title>1</title></head>\n"
196 + "<body>1"
197 + "<script>\n"
198 + " parent.frames['f2'].location.href = '3.html';\n"
199 + "</script>\n"
200 + "</body></html>";
201
202 final String frame3 = DOCTYPE_HTML + "<html><head><title>page 3</title></head><body></body></html>";
203
204 final WebClient webClient = getWebClientWithMockWebConnection();
205 final MockWebConnection conn = getMockWebConnection();
206 conn.setDefaultResponse(DOCTYPE_HTML + "<html><head><title>default</title></head><body></body></html>");
207 conn.setResponse(URL_FIRST, html);
208 conn.setResponse(new URL(URL_FIRST, "1.html"), frame1);
209 conn.setResponse(new URL(URL_FIRST, "3.html"), frame3);
210
211 final HtmlPage page = webClient.getPage(URL_FIRST);
212
213 assertEquals("page 3", ((HtmlPage) page.getFrameByName("f2").getEnclosedPage()).getTitleText());
214 }
215
216
217
218
219 @Test
220 @Alerts({"default", ""})
221 public void frameContentHandler() throws Exception {
222 final WebClient webClient = getWebClientWithMockWebConnection();
223 final MockWebConnection webConnection = getMockWebConnection();
224
225 final String html = DOCTYPE_HTML
226 + "<html><head><title>frames</title></head>\n"
227 + "<frameset cols='180,*'>\n"
228 + "<frame id='frame1' src='1.html'/>\n"
229 + "</frameset>\n"
230 + "</html>";
231
232 webConnection.setDefaultResponse(DOCTYPE_HTML
233 + "<html><head><title>default</title></head><body></body></html>");
234 webConnection.setResponse(URL_FIRST, html);
235
236 HtmlPage page = webClient.getPage(URL_FIRST);
237 assertEquals("frames", page.getTitleText());
238
239 HtmlFrame frame1 = page.getHtmlElementById("frame1");
240 assertEquals(getExpectedAlerts()[0], ((HtmlPage) frame1.getEnclosedPage()).getTitleText());
241
242 webClient.setFrameContentHandler(new FrameContentHandler() {
243 @Override
244 public boolean loadFrameDocument(final BaseFrameElement baseFrameElement) {
245 return false;
246 }
247 });
248
249 page = webClient.getPage(URL_FIRST);
250 assertEquals("frames", page.getTitleText());
251
252 frame1 = page.getHtmlElementById("frame1");
253 assertEquals(getExpectedAlerts()[1], ((HtmlPage) frame1.getEnclosedPage()).getTitleText());
254 }
255 }