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