View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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&amp;ut&aacute;</b>";
56      private static String TEST_STRING_ESCAPED = "&lt;b&gt;Out&amp;p&amp;amp;ut&amp;aacute;&lt;/b&gt;";
57      
58      public static Test suite()
59      {
60          return new TestSuite(HtmlEscapeRendererTest.class); // needed in maven
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          // TODO remove these two lines once myfaces-test goes alpha, see MYFACES-1155
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                 // note if appear a &amp;, the & is escaped too,
144                 // but when you see the output in a html browser
145                 // the output it the same.
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                 // note if appear a &amp;, the & is escaped too,
186                 // but when you see the output in a html browser
187                 // the output it the same.
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 }