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