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.IOException;
22 import java.io.StringWriter;
23
24 import javax.el.ValueExpression;
25 import javax.faces.component.UIComponent;
26 import javax.faces.component.UIForm;
27 import javax.faces.component.UIViewRoot;
28 import javax.faces.component.behavior.AjaxBehavior;
29 import javax.faces.component.html.HtmlInputText;
30 import javax.faces.component.html.HtmlOutputText;
31 import javax.faces.context.FacesContext;
32 import javax.faces.convert.Converter;
33 import javax.faces.convert.ConverterException;
34
35 import junit.framework.Test;
36 import junit.framework.TestSuite;
37
38 import org.apache.myfaces.test.utils.HtmlCheckAttributesUtil;
39 import org.apache.myfaces.test.utils.HtmlRenderedAttr;
40 import org.apache.myfaces.test.base.AbstractJsfTestCase;
41 import org.apache.myfaces.test.el.MockValueExpression;
42 import org.apache.myfaces.test.mock.MockRenderKitFactory;
43 import org.apache.myfaces.test.mock.MockResponseWriter;
44
45
46
47
48
49 public class HtmlTextRendererTest extends AbstractJsfTestCase
50 {
51
52 public static Test suite()
53 {
54 return new TestSuite(HtmlTextRendererTest.class);
55 }
56
57 private MockResponseWriter writer ;
58 private HtmlOutputText outputText;
59 private HtmlInputText inputText;
60
61 public HtmlTextRendererTest(String name)
62 {
63 super(name);
64 }
65
66 public void setUp() throws Exception
67 {
68 super.setUp();
69
70 outputText = new HtmlOutputText();
71 inputText = new HtmlInputText();
72
73 writer = new MockResponseWriter(new StringWriter(), null, null);
74 facesContext.setResponseWriter(writer);
75
76 facesContext.getViewRoot().setRenderKitId(MockRenderKitFactory.HTML_BASIC_RENDER_KIT);
77 facesContext.getRenderKit().addRenderer(
78 outputText.getFamily(),
79 outputText.getRendererType(),
80 new HtmlTextRenderer());
81 facesContext.getRenderKit().addRenderer(
82 inputText.getFamily(),
83 inputText.getRendererType(),
84 new HtmlTextRenderer());
85
86 facesContext.getAttributes().put("org.apache.myfaces.RENDERED_JSF_JS", Boolean.TRUE);
87 }
88
89 public void tearDown() throws Exception
90 {
91 super.tearDown();
92 outputText = null;
93 inputText = null;
94 writer = null;
95 }
96
97 public void testStyleClassAttr() throws IOException
98 {
99 outputText.setValue("Output");
100 outputText.setStyleClass("myStyleClass");
101
102 outputText.encodeEnd(facesContext);
103 facesContext.renderResponse();
104
105 String output = writer.getWriter().toString();
106
107 assertEquals("<span class=\"myStyleClass\">Output</span>", output);
108 assertNotSame("Output", output);
109 }
110
111
112
113
114
115 public void testEscapeNoSpan() throws IOException
116 {
117 outputText.setValue("Output");
118 outputText.setEscape(true);
119
120 outputText.encodeEnd(facesContext);
121 facesContext.renderResponse();
122
123 String output = writer.getWriter().toString();
124
125 assertEquals("Output", output);
126 }
127
128 public void testHtmlPropertyPassTru() throws Exception
129 {
130 HtmlRenderedAttr[] attrs = HtmlCheckAttributesUtil.generateBasicAttrs();
131
132
133 HtmlCheckAttributesUtil.checkRenderedAttributes(
134 inputText, facesContext, writer, attrs);
135 if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs)) {
136 fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
137 }
138 }
139
140 public void testWhenSubmittedValueIsNullDefaultShouldDissapearFromRendering() {
141
142 UIViewRoot root = new UIViewRoot();
143 UIForm form = new UIForm();
144 form.setId("formId");
145
146 form.getChildren().add(inputText);
147 root.getChildren().add(form);
148
149 Converter converter = new Converter()
150 {
151 public Object getAsObject(FacesContext context,
152 UIComponent component, String value)
153 throws ConverterException
154 {
155 if (value == null || "".equals(value))
156 return null;
157 else
158 return value;
159 }
160
161 public String getAsString(FacesContext context,
162 UIComponent component, Object value)
163 throws ConverterException
164 {
165 if (value == null)
166 return "";
167 else
168 return value.toString();
169 }
170 };
171
172 inputText.setConverter(converter);
173
174 ValueExpression expression = new MockValueExpression("#{requestScope.someDefaultValueOnBean}",String.class);
175 expression.setValue(facesContext.getELContext(), "defaultValue");
176 inputText.setValueExpression("value", expression);
177
178
179
180
181 externalContext.addRequestParameterMap(inputText.getClientId(facesContext), "");
182
183 inputText.decode(facesContext);
184
185
186
187 inputText.validate(facesContext);
188
189
190
191
192
193
194
195
196 assertNotSame(expression.getValue(facesContext.getELContext()), inputText.getValue());
197 assertNull(inputText.getValue());
198 }
199
200
201
202
203 public void testClientBehaviorHolderRendersIdAndName()
204 {
205 inputText.addClientBehavior("keypress", new AjaxBehavior());
206 try
207 {
208 inputText.encodeAll(facesContext);
209 String output = ((StringWriter) writer.getWriter()).getBuffer().toString();
210 assertTrue(output.matches("(?s).+id=\".+\".+"));
211 assertTrue(output.matches("(?s).+name=\".+\".+"));
212 }
213 catch (Exception e)
214 {
215 fail(e.getMessage());
216 }
217
218 }
219
220
221
222
223
224 public void testClientBehaviorUserCodeJavaScriptEscaping()
225 {
226 inputText.getAttributes().put("onchange", "alert('test')");
227 inputText.addClientBehavior("change", new AjaxBehavior());
228 try
229 {
230 inputText.encodeAll(facesContext);
231 String output = ((StringWriter) writer.getWriter()).getBuffer().toString();
232
233
234 assertTrue(output.contains("'alert(\\'test\\')'"));
235 }
236 catch (Exception e)
237 {
238 fail(e.getMessage());
239 }
240 }
241
242
243
244
245
246 public void testClientBehaviorUserCodeJavaScriptDoubleEscaping()
247 {
248 inputText.getAttributes().put("onchange", "var test = \'a\\\'b\'; alert(test);");
249 inputText.addClientBehavior("change", new AjaxBehavior());
250 try
251 {
252 inputText.encodeAll(facesContext);
253 String output = ((StringWriter) writer.getWriter()).getBuffer().toString();
254
255
256 assertTrue(output.contains("'var test = \\'a\\\\\\'b\\'; alert(test);'"));
257 }
258 catch (Exception e)
259 {
260 fail(e.getMessage());
261 }
262 }
263
264 }