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