1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.renderkit.html;
20
21 import java.io.StringWriter;
22
23 import javax.faces.component.UIComponent;
24 import javax.faces.component.UISelectItem;
25 import javax.faces.component.html.HtmlOutputLabel;
26 import javax.faces.component.html.HtmlOutputText;
27 import javax.faces.component.html.HtmlSelectManyCheckbox;
28 import javax.faces.component.html.HtmlSelectManyListbox;
29 import javax.faces.component.html.HtmlSelectManyMenu;
30 import javax.faces.component.html.HtmlSelectOneListbox;
31 import javax.faces.component.html.HtmlSelectOneMenu;
32 import javax.faces.component.html.HtmlSelectOneRadio;
33 import javax.faces.model.SelectItem;
34
35 import junit.framework.Test;
36 import junit.framework.TestSuite;
37
38 import org.apache.myfaces.shared.renderkit.html.HtmlResponseWriterImpl;
39 import org.apache.myfaces.test.base.AbstractJsfTestCase;
40 import org.apache.myfaces.test.mock.MockRenderKitFactory;
41
42 public class HtmlEscapeRendererTest extends AbstractJsfTestCase
43 {
44
45 private static String ISO_8859_1 = "ISO-8859-1";
46 private static String UTF_8 = "UTF-8";
47 private static String HTML_CONTENT_TYPE = "text/html";
48 private static String XHTML_CONTENT_TYPE = "application/xhtml+xml";
49 private static String APPLICATION_XML_CONTENT_TYPE = "application/xml";
50 private static String TEXT_XML_CONTENT_TYPE = "text/xml";
51
52 private static String[] CONTENT_TYPES = {HTML_CONTENT_TYPE,XHTML_CONTENT_TYPE,APPLICATION_XML_CONTENT_TYPE,TEXT_XML_CONTENT_TYPE};
53 private static String[] ENCODINGS = {ISO_8859_1,UTF_8};
54
55 private static String TEST_STRING = "<b>Out&p&utá</b>";
56 private static String TEST_STRING_ESCAPED = "<b>Out&p&amp;ut&aacute;</b>";
57
58 public static Test suite()
59 {
60 return new TestSuite(HtmlEscapeRendererTest.class);
61 }
62
63 private HtmlOutputText outputText;
64 private HtmlOutputLabel outputLabel;
65 private HtmlSelectOneRadio selectOneRadio;
66 private HtmlSelectOneListbox selectOneListbox;
67 private HtmlSelectOneMenu selectOneMenu;
68 private HtmlSelectManyCheckbox selectManyCheckbox;
69 private HtmlSelectManyListbox selectManyListbox;
70 private HtmlSelectManyMenu selectManyMenu;
71
72 public HtmlEscapeRendererTest(String name)
73 {
74 super(name);
75 }
76
77 public void setUp() throws Exception
78 {
79 super.setUp();
80
81 outputText = new HtmlOutputText();
82 outputLabel = new HtmlOutputLabel();
83 selectOneRadio = new HtmlSelectOneRadio();
84 selectOneListbox = new HtmlSelectOneListbox();
85 selectOneMenu = new HtmlSelectOneMenu();
86 selectManyCheckbox = new HtmlSelectManyCheckbox();
87 selectManyListbox = new HtmlSelectManyListbox();
88 selectManyMenu = new HtmlSelectManyMenu();
89
90
91 facesContext.getViewRoot().setRenderKitId(MockRenderKitFactory.HTML_BASIC_RENDER_KIT);
92 facesContext.getRenderKit().addRenderer(
93 outputText.getFamily(),
94 outputText.getRendererType(),
95 new HtmlTextRenderer());
96 facesContext.getRenderKit().addRenderer(
97 outputLabel.getFamily(),
98 outputLabel.getRendererType(),
99 new HtmlLabelRenderer());
100 facesContext.getRenderKit().addRenderer(
101 selectOneRadio.getFamily(),
102 selectOneRadio.getRendererType(),
103 new HtmlRadioRenderer());
104 facesContext.getRenderKit().addRenderer(
105 selectOneListbox.getFamily(),
106 selectOneListbox.getRendererType(),
107 new HtmlListboxRenderer());
108 facesContext.getRenderKit().addRenderer(
109 selectOneMenu.getFamily(),
110 selectOneMenu.getRendererType(),
111 new HtmlMenuRenderer());
112 facesContext.getRenderKit().addRenderer(
113 selectManyCheckbox.getFamily(),
114 selectManyCheckbox.getRendererType(),
115 new HtmlCheckboxRenderer());
116 facesContext.getRenderKit().addRenderer(
117 selectManyListbox.getFamily(),
118 selectManyListbox.getRendererType(),
119 new HtmlListboxRenderer());
120 facesContext.getRenderKit().addRenderer(
121 selectManyMenu.getFamily(),
122 selectManyMenu.getRendererType(),
123 new HtmlMenuRenderer());
124
125 facesContext.getAttributes().put("org.apache.myfaces.RENDERED_JSF_JS", Boolean.TRUE);
126 }
127
128 public void tearDown() throws Exception
129 {
130 super.tearDown();
131 outputText = null;
132 }
133
134 public void testOutputTextEscapeValue() throws Exception
135 {
136 for (String contentType: CONTENT_TYPES)
137 {
138 for (String encoding : ENCODINGS)
139 {
140 StringWriter swriter = new StringWriter();
141 HtmlResponseWriterImpl writer = new HtmlResponseWriterImpl(swriter, contentType , encoding);
142 facesContext.setResponseWriter(writer);
143
144
145
146 outputText.setValue(TEST_STRING);
147 outputText.setEscape(true);
148 outputText.encodeEnd(facesContext);
149 facesContext.renderResponse();
150 String output = swriter.toString();
151 assertTrue(output.contains(TEST_STRING_ESCAPED));
152 }
153 }
154 }
155
156 public void testOutputTextNoEscapeValue() throws Exception
157 {
158
159 for (String contentType: CONTENT_TYPES)
160 {
161 for (String encoding : ENCODINGS)
162 {
163 StringWriter swriter = new StringWriter();
164 HtmlResponseWriterImpl writer = new HtmlResponseWriterImpl(swriter, contentType , encoding);
165 facesContext.setResponseWriter(writer);
166 outputText.setValue(TEST_STRING);
167 outputText.setEscape(false);
168 outputText.encodeEnd(facesContext);
169 facesContext.renderResponse();
170 String output = swriter.toString();
171 assertTrue(output.contains(TEST_STRING));
172 }
173 }
174 }
175
176 public void testOutputLabelEscapeValue() throws Exception
177 {
178 for (String contentType: CONTENT_TYPES)
179 {
180 for (String encoding : ENCODINGS)
181 {
182 StringWriter swriter = new StringWriter();
183 HtmlResponseWriterImpl writer = new HtmlResponseWriterImpl(swriter, contentType , encoding);
184 facesContext.setResponseWriter(writer);
185
186
187
188 outputLabel.setValue(TEST_STRING);
189 outputLabel.setEscape(true);
190 outputLabel.encodeAll(facesContext);
191 facesContext.renderResponse();
192 String output = swriter.toString();
193 assertTrue(output.contains(TEST_STRING_ESCAPED));
194 }
195 }
196 }
197
198 public void testOutputLabelNoEscapeValue() throws Exception
199 {
200
201 for (String contentType: CONTENT_TYPES)
202 {
203 for (String encoding : ENCODINGS)
204 {
205 StringWriter swriter = new StringWriter();
206 HtmlResponseWriterImpl writer = new HtmlResponseWriterImpl(swriter, contentType , encoding);
207 facesContext.setResponseWriter(writer);
208 outputLabel.setValue(TEST_STRING);
209 outputLabel.setEscape(false);
210 outputLabel.encodeAll(facesContext);
211 facesContext.renderResponse();
212 String output = swriter.toString();
213 assertTrue(output.contains(TEST_STRING));
214 }
215 }
216 }
217
218 public void testUISelectOneEscapeValue() throws Exception
219 {
220 for (String contentType: CONTENT_TYPES)
221 {
222 for (String encoding : ENCODINGS)
223 {
224 tryUISelectEscapeValue(selectOneRadio, contentType, encoding);
225 tryUISelectEscapeValue(selectOneListbox, contentType, encoding);
226 tryUISelectEscapeValue(selectOneMenu, contentType, encoding);
227 tryUISelectEscapeValue(selectManyCheckbox, contentType, encoding);
228 tryUISelectEscapeValue(selectManyListbox, contentType, encoding);
229 tryUISelectEscapeValue(selectManyMenu, contentType, encoding);
230 }
231 }
232 }
233
234 public void tryUISelectEscapeValue(UIComponent component, String contentType, String encoding) throws Exception
235 {
236 StringWriter swriter = new StringWriter();
237 HtmlResponseWriterImpl writer = new HtmlResponseWriterImpl(swriter, contentType , encoding);
238 facesContext.setResponseWriter(writer);
239 UISelectItem uiSelectItem = new UISelectItem();
240 SelectItem item = new SelectItem("Output",TEST_STRING,"",false,true);
241 uiSelectItem.setValue(item);
242 component.getChildren().add(uiSelectItem);
243 component.encodeAll(facesContext);
244 facesContext.renderResponse();
245 String output = swriter.toString();
246 assertTrue(output.contains(TEST_STRING_ESCAPED));
247 }
248
249 public void testUISelectNoEscapeValue() throws Exception
250 {
251 for (String contentType: CONTENT_TYPES)
252 {
253 for (String encoding : ENCODINGS)
254 {
255 tryUISelectNoEscapeValue(selectOneRadio, contentType, encoding);
256 tryUISelectNoEscapeValue(selectOneListbox, contentType, encoding);
257 tryUISelectNoEscapeValue(selectOneMenu, contentType, encoding);
258 tryUISelectNoEscapeValue(selectManyCheckbox, contentType, encoding);
259 tryUISelectNoEscapeValue(selectManyListbox, contentType, encoding);
260 tryUISelectNoEscapeValue(selectManyMenu, contentType, encoding);
261 }
262 }
263 }
264
265 public void tryUISelectNoEscapeValue(UIComponent component, String contentType, String encoding) throws Exception
266 {
267 StringWriter swriter = new StringWriter();
268 HtmlResponseWriterImpl writer = new HtmlResponseWriterImpl(swriter, contentType , encoding);
269 facesContext.setResponseWriter(writer);
270 UISelectItem uiSelectItem = new UISelectItem();
271 SelectItem item = new SelectItem("Output",TEST_STRING,"",false,false);
272 uiSelectItem.setValue(item);
273 component.getChildren().add(uiSelectItem);
274 component.encodeAll(facesContext);
275 facesContext.renderResponse();
276 String output = swriter.toString();
277 assertTrue(output.contains(TEST_STRING));
278 }
279 }