1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.html.parser;
16
17 import java.net.URL;
18 import java.util.ArrayList;
19 import java.util.List;
20
21 import org.apache.commons.lang3.builder.EqualsBuilder;
22 import org.apache.commons.lang3.builder.HashCodeBuilder;
23 import org.htmlunit.MockWebConnection;
24 import org.htmlunit.SimpleWebTestCase;
25 import org.htmlunit.WebClient;
26 import org.htmlunit.html.HtmlPage;
27 import org.htmlunit.junit.BrowserRunner;
28 import org.junit.Test;
29 import org.junit.runner.RunWith;
30
31
32
33
34
35
36
37
38
39
40 @RunWith(BrowserRunner.class)
41 public class HTMLParserListenerTest extends SimpleWebTestCase {
42 static class MessageInfo {
43 private boolean error_;
44 private String message_;
45 private URL url_;
46 private String html_;
47 private int line_;
48 private int column_;
49
50
51
52
53
54
55
56
57
58
59 MessageInfo(final boolean error, final String message, final URL url, final String html,
60 final int line, final int column, final String key) {
61 error_ = error;
62 message_ = message;
63 url_ = url;
64 html_ = html;
65 line_ = line;
66 column_ = column;
67
68 }
69
70
71
72
73 @Override
74 public String toString() {
75 return message_ + " (" + url_ + " " + line_ + ":" + column_ + ")";
76 }
77
78
79
80
81
82 @Override
83 public boolean equals(final Object obj) {
84 if (!(obj instanceof MessageInfo)) {
85 return false;
86 }
87 final MessageInfo other = (MessageInfo) obj;
88 final EqualsBuilder builder = new EqualsBuilder();
89 builder.append(error_, other.error_);
90 builder.append(message_, other.message_);
91 builder.append(url_.toExternalForm(), other.url_.toExternalForm());
92 builder.append(html_, other.html_);
93 builder.append(line_, other.line_);
94 builder.append(column_, other.column_);
95 return builder.isEquals();
96 }
97
98
99
100
101 @Override
102 public int hashCode() {
103 final HashCodeBuilder builder = new HashCodeBuilder();
104 builder.append(error_);
105 builder.append(message_);
106 builder.append(url_);
107 builder.append(html_);
108 builder.append(line_);
109 builder.append(column_);
110 return builder.hashCode();
111 }
112 }
113
114
115
116
117
118
119
120
121 @Test
122 public void simple() throws Exception {
123 testSimple(5, 8);
124 }
125
126
127
128
129
130
131
132 @Test
133 public void simple_withWrongLineCol() throws Exception {
134 testSimple(5, 8);
135 }
136
137 private void testSimple(final int line, final int col) throws Exception {
138 final String htmlContent =
139 "<html>\n"
140 + "<body>\n"
141 + "<p>foo\n"
142 + "</body>"
143 + "\n</html>";
144
145 final WebClient webClient = getWebClient();
146 assertNull(webClient.getHTMLParserListener());
147
148 final List<MessageInfo> messages = new ArrayList<>();
149 final HTMLParserListener collecter = new HTMLParserListener() {
150
151 @Override
152 public void error(final String message, final URL url, final String html,
153 final int errorLine, final int column, final String key) {
154 messages.add(new MessageInfo(true, message, url, html, errorLine, column, key));
155 }
156
157 @Override
158 public void warning(final String message, final URL url, final String html,
159 final int warningLine, final int column, final String key) {
160 messages.add(new MessageInfo(false, message, url, html, warningLine, column, key));
161 }
162 };
163 webClient.setHTMLParserListener(collecter);
164
165 final MockWebConnection webConnection = new MockWebConnection();
166 webConnection.setDefaultResponse(htmlContent);
167 webClient.setWebConnection(webConnection);
168
169 final HtmlPage page = webClient.getPage(URL_FIRST);
170 assertEquals("foo", page.asNormalizedText());
171
172
173 final MessageInfo expectedError = new MessageInfo(false,
174 "End element <body> automatically closes element <p>.",
175 URL_FIRST, null, line, col, null);
176
177 assertEquals(1, messages.size());
178 assertEquals(expectedError, messages.get(0));
179 }
180
181
182
183
184
185 @Test
186 public void parseFragment() throws Exception {
187 final String htmlContent = "<html><head><title>foo</title>\n"
188 + "<script>\n"
189 + "function test() {\n"
190 + " var oNode = document.getElementById('middle');\n"
191 + " oNode.insertAdjacentHTML('afterEnd', '<div><span>before end</div>');\n"
192 + "}\n"
193 + "</script>\n"
194 + "</head>\n"
195 + "<body onload='test()'>\n"
196 + " <span id='middle' style='color: #ff0000'>\n"
197 + " inside\n"
198 + " </span>\n"
199 + "</body></html>";
200
201 final WebClient webClient = getWebClient();
202 assertNull(webClient.getHTMLParserListener());
203
204 final List<MessageInfo> messages = new ArrayList<>();
205 final HTMLParserListener collecter = new HTMLParserListener() {
206
207 @Override
208 public void error(final String message, final URL url, final String html,
209 final int line, final int column, final String key) {
210 messages.add(new MessageInfo(true, message, url, html, line, column, key));
211 }
212
213 @Override
214 public void warning(final String message, final URL url, final String html,
215 final int line, final int column, final String key) {
216 messages.add(new MessageInfo(false, message, url, html, line, column, key));
217 }
218 };
219 webClient.setHTMLParserListener(collecter);
220
221 final MockWebConnection webConnection = new MockWebConnection();
222 webConnection.setDefaultResponse(htmlContent);
223 webClient.setWebConnection(webConnection);
224
225 final HtmlPage page = webClient.getPage(URL_FIRST);
226 assertEquals("foo", page.getTitleText());
227
228
229 final MessageInfo expectedError = new MessageInfo(false,
230 "End element <div> automatically closes element <span>.",
231 URL_FIRST, "<div><span>before end</div>", 1, 28, null);
232
233 assertEquals(1, messages.size());
234 assertEquals(expectedError, messages.get(0));
235 }
236 }