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;
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   * Tests for {@link WebWindowListener}.
25   *
26   * @author Ronald Brill
27   */
28  public class WebWindowListenerTest extends SimpleWebTestCase {
29  
30      /**
31       * Testcase for issue #1101.
32       *
33       * @throws Exception if the test fails
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       * @throws Exception if the test fails
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       * @throws Exception if the test fails
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      * @throws Exception if the test fails
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      * @throws Exception if the test fails
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 }