1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit;
16
17 import org.apache.commons.lang3.StringUtils;
18 import org.htmlunit.html.HtmlPage;
19 import org.htmlunit.junit.BrowserRunner;
20 import org.htmlunit.junit.annotation.Alerts;
21 import org.htmlunit.junit.annotation.HtmlUnitNYI;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24
25
26
27
28
29
30 @RunWith(BrowserRunner.class)
31 public class WebWindowListenerTest extends SimpleWebTestCase {
32
33
34
35
36
37
38 @Test
39 @Alerts("changed '(null)' - 'Test 1 [org.htmlunit.TopLevelWindow]'; "
40 + "changed 'Test 1 [org.htmlunit.TopLevelWindow]' - 'Test 2 [org.htmlunit.TopLevelWindow]'; ")
41 @HtmlUnitNYI(CHROME = "changed 'Test 1 [org.htmlunit.TopLevelWindow]' - 'Test 2 [org.htmlunit.TopLevelWindow]'; "
42 + "changed '(null)' - 'Test 1 [org.htmlunit.TopLevelWindow]'; ",
43 EDGE = "changed 'Test 1 [org.htmlunit.TopLevelWindow]' - 'Test 2 [org.htmlunit.TopLevelWindow]'; "
44 + "changed '(null)' - 'Test 1 [org.htmlunit.TopLevelWindow]'; ",
45 FF = "changed 'Test 1 [org.htmlunit.TopLevelWindow]' - 'Test 2 [org.htmlunit.TopLevelWindow]'; "
46 + "changed '(null)' - 'Test 1 [org.htmlunit.TopLevelWindow]'; ",
47 FF_ESR = "changed 'Test 1 [org.htmlunit.TopLevelWindow]' - 'Test 2 [org.htmlunit.TopLevelWindow]'; "
48 + "changed '(null)' - 'Test 1 [org.htmlunit.TopLevelWindow]'; ")
49 public void eventOrder() throws Exception {
50 final String firstHtml = DOCTYPE_HTML
51 + "<html>\n"
52 + "<head><title>Test 1</title></head>\n"
53 + "<body>\n"
54 + "<script type='text/javascript'>\n"
55 + " document.location.href = '" + URL_SECOND + "';\n"
56 + "</script>\n"
57 + "<p>First Page<p>\n"
58 + "</body></html>";
59
60 final String secondHtml = DOCTYPE_HTML
61 + "<html>\n"
62 + "<head><title>Test 2</title></head>\n"
63 + "<body><p>Second Page<p></body>\n"
64 + "</html>";
65
66 getMockWebConnection().setResponse(URL_SECOND, secondHtml);
67
68 final LoggingWebWindowListener logger = new LoggingWebWindowListener();
69 getWebClient().addWebWindowListener(logger);
70
71 loadPage(firstHtml);
72 assertEquals(getExpectedAlerts()[0], logger.getMsg());
73 }
74
75
76
77
78 @Test
79 @Alerts("changed '(null)' - 'Test 1 [org.htmlunit.TopLevelWindow]'; "
80 + "closed 'Test 1 [org.htmlunit.TopLevelWindow]' - '(null)'; "
81 + "opened '(null)' - '(null)'; ")
82 public void eventOrderCloseLast() throws Exception {
83 final String firstHtml = DOCTYPE_HTML
84 + "<html>\n"
85 + "<head><title>Test 1</title></head>\n"
86 + "<body>\n"
87 + "</body></html>";
88
89 final LoggingWebWindowListener logger = new LoggingWebWindowListener();
90 getWebClient().addWebWindowListener(logger);
91
92 loadPage(firstHtml);
93 ((TopLevelWindow) getWebClient().getCurrentWindow()).close();
94
95 assertEquals(getExpectedAlerts()[0], logger.getMsg());
96 }
97
98
99
100
101 @Test
102 @Alerts("changed '(null)' - 'Test 1 [org.htmlunit.TopLevelWindow]'; "
103 + "closed 'Test 1 [org.htmlunit.TopLevelWindow]' - '(null)'; "
104 + "opened '(null)' - '(null)'; ")
105 public void eventOrderReset() throws Exception {
106 final String firstHtml = DOCTYPE_HTML
107 + "<html>\n"
108 + "<head><title>Test 1</title></head>\n"
109 + "<body>\n"
110 + "</body></html>";
111
112 final LoggingWebWindowListener logger = new LoggingWebWindowListener();
113 getWebClient().addWebWindowListener(logger);
114
115 loadPage(firstHtml);
116 getWebClient().reset();
117
118 assertEquals(getExpectedAlerts()[0], logger.getMsg());
119 }
120
121
122
123
124 @Test
125 @Alerts("changed '(null)' - 'Test 1 [org.htmlunit.TopLevelWindow]'; "
126 + "closed 'Test 1 [org.htmlunit.TopLevelWindow]' - '(null)'; ")
127 public void eventOrderCloseWebClient() throws Exception {
128 final String firstHtml = DOCTYPE_HTML
129 + "<html>\n"
130 + "<head><title>Test 1</title></head>\n"
131 + "<body>\n"
132 + "</body></html>";
133
134 final LoggingWebWindowListener logger = new LoggingWebWindowListener();
135 getWebClient().addWebWindowListener(logger);
136
137 loadPage(firstHtml);
138 getWebClient().close();
139
140 assertEquals(getExpectedAlerts()[0], logger.getMsg());
141 }
142
143
144
145
146 @Test
147 @Alerts("opened '(null)' - '(null)'; "
148 + "changed '(null)' - 'about:blank [org.htmlunit.html.FrameWindow]'; "
149 + "changed '(null)' - 'Test 1 [org.htmlunit.TopLevelWindow]'; "
150 + "changed 'about:blank [org.htmlunit.html.FrameWindow]' - 'iFrame [org.htmlunit.html.FrameWindow]'; "
151 + "closed 'iFrame [org.htmlunit.html.FrameWindow]' - '(null)'; "
152 + "closed 'Test 1 [org.htmlunit.TopLevelWindow]' - '(null)'; ")
153 public void eventOrderIFrameCloseWebClient() throws Exception {
154 final String firstHtml = DOCTYPE_HTML
155 + "<html>\n"
156 + "<head><title>Test 1</title></head>\n"
157 + "<body>\n"
158 + "<iframe src='" + URL_SECOND + "'></iframe>\n"
159 + "</body></html>";
160
161 final String iframeContent = DOCTYPE_HTML
162 + "<html>\n"
163 + "<head><title>iFrame</title></head>\n"
164 + "<body>iframe</body>\n"
165 + "</html>";
166
167 getMockWebConnection().setResponse(URL_SECOND, iframeContent);
168
169 final LoggingWebWindowListener logger = new LoggingWebWindowListener();
170 getWebClient().addWebWindowListener(logger);
171
172 loadPage(firstHtml);
173 getWebClient().close();
174
175 assertEquals(getExpectedAlerts()[0], logger.getMsg());
176 }
177
178 private final class LoggingWebWindowListener implements WebWindowListener {
179 private final StringBuilder msg_ = new StringBuilder();
180
181 @Override
182 public void webWindowOpened(final WebWindowEvent event) {
183 log("opened", event);
184 }
185
186 @Override
187 public void webWindowContentChanged(final WebWindowEvent event) {
188 log("changed", event);
189 }
190 @Override
191 public void webWindowClosed(final WebWindowEvent event) {
192 log("closed", event);
193 }
194
195 private void log(final String prefix, final WebWindowEvent event) {
196 msg_.append(prefix).append(" '");
197 Page page = event.getOldPage();
198 if (page instanceof HtmlPage) {
199 final HtmlPage htmlPage = (HtmlPage) page;
200 if (StringUtils.isNotBlank(htmlPage.getTitleText())) {
201 msg_.append(htmlPage.getTitleText());
202 }
203 else {
204 msg_.append(htmlPage.getUrl());
205 }
206 msg_.append(" ");
207 }
208 if (page != null) {
209 msg_.append("[")
210 .append(page.getEnclosingWindow().getClass().getName())
211 .append("]");
212 }
213 else {
214 msg_.append("(null)");
215 }
216
217 msg_.append("' - '");
218 page = event.getNewPage();
219 if (page instanceof HtmlPage) {
220 final HtmlPage htmlPage = (HtmlPage) page;
221 if (StringUtils.isNotBlank(htmlPage.getTitleText())) {
222 msg_.append(htmlPage.getTitleText());
223 }
224 else {
225 msg_.append(htmlPage.getUrl());
226 }
227 msg_.append(" ");
228 }
229 if (page != null) {
230 msg_.append("[")
231 .append(page.getEnclosingWindow().getClass().getName())
232 .append("]");
233 }
234 else {
235 msg_.append("(null)");
236 }
237
238 msg_.append("'; ");
239 }
240
241 public String getMsg() {
242 return msg_.toString();
243 }
244 }
245 }