You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2013/04/17 00:49:47 UTC
svn commit: r1468656 [2/7] - in /myfaces: core/trunk/ core/trunk/api/
core/trunk/assembly/ core/trunk/bundle/ core/trunk/impl/ core/trunk/parent/
core/trunk/shared-public/ core/trunk/shared/ current22/
current22/client-window-example/ shared/trunk/ sha...
Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlJavaScriptUtils.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlJavaScriptUtils.java?rev=1468656&r1=1468655&r2=1468656&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlJavaScriptUtils.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlJavaScriptUtils.java Tue Apr 16 22:49:45 2013
@@ -1,756 +1,756 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.shared.renderkit.html;
-
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Logger;
-
-import javax.faces.component.UINamingContainer;
-import javax.faces.context.ExternalContext;
-import javax.faces.context.FacesContext;
-import javax.faces.context.ResponseWriter;
-
-import org.apache.myfaces.shared.config.MyfacesConfig;
-import org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils.ScriptContext;
-import org.apache.myfaces.shared.renderkit.html.util.JavascriptUtils;
-import org.apache.myfaces.shared.renderkit.html.util.ResourceUtils;
-
-public final class HtmlJavaScriptUtils
-{
- private static final Logger log = Logger.getLogger(HtmlJavaScriptUtils.class
- .getName());
-
- private static final String AUTO_SCROLL_PARAM = "autoScroll";
- private static final String AUTO_SCROLL_FUNCTION = "getScrolling";
-
- private static final String SET_HIDDEN_INPUT_FN_NAME = "oamSetHiddenInput";
- private static final String SET_HIDDEN_INPUT_FN_NAME_JSF2 = "myfaces.oam.setHiddenInput";
-
- private static final String FIRST_SUBMIT_SCRIPT_ON_PAGE = "org.apache.MyFaces.FIRST_SUBMIT_SCRIPT_ON_PAGE";
- private static final String CLEAR_HIDDEN_INPUT_FN_NAME = "oamClearHiddenInput";
-
-
- @SuppressWarnings("unchecked")
- public static void renderFormSubmitScript(FacesContext facesContext)
- throws IOException
- {
-
- Map map = facesContext.getExternalContext().getRequestMap();
- Boolean firstScript = (Boolean) map.get(FIRST_SUBMIT_SCRIPT_ON_PAGE);
-
- if (firstScript == null || firstScript.equals(Boolean.TRUE))
- {
- map.put(FIRST_SUBMIT_SCRIPT_ON_PAGE, Boolean.FALSE);
- renderFormSubmitScriptIfNecessary(facesContext);
-
- //we have to render the config just in case
- renderConfigOptionsIfNecessary(facesContext);
- }
- }
-
- /**
- * @param facesContext
- * @throws IOException
- */
- private static void renderFormSubmitScriptIfNecessary(
- FacesContext facesContext) throws IOException
- {
- final ExternalContext externalContext = facesContext
- .getExternalContext();
- final MyfacesConfig currentInstance = MyfacesConfig
- .getCurrentInstance(externalContext);
- ResponseWriter writer = facesContext.getResponseWriter();
-
- if (currentInstance.isRenderFormSubmitScriptInline())
- {
- writer.startElement(HTML.SCRIPT_ELEM, null);
- writer.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
-
- boolean autoScroll = currentInstance.isAutoScroll();
-
- ScriptContext context = new ScriptContext(
- currentInstance.isPrettyHtml());
- context.prettyLine();
- context.increaseIndent();
-
- prepareScript(facesContext, context, autoScroll);
-
- writer.writeText(context.toString(), null);
-
- writer.endElement(HTML.SCRIPT_ELEM);
- }
- else
- {
- ResourceUtils
- .renderMyfacesJSInlineIfNecessary(facesContext, writer);
- }
- }
-
- private static void renderConfigOptionsIfNecessary(FacesContext facesContext)
- throws IOException
- {
- ResponseWriter writer = facesContext.getResponseWriter();
- MyfacesConfig config = MyfacesConfig.getCurrentInstance(facesContext
- .getExternalContext());
- ScriptContext script = new ScriptContext(config.isPrettyHtml());
- boolean autoScroll = config.isAutoScroll();
- boolean autoSave = JavascriptUtils.isSaveFormSubmitLinkIE(facesContext
- .getExternalContext());
-
- if (autoScroll || autoSave)
- {
- script.prettyLine();
- script.increaseIndent();
- script.append("(!window.myfaces) ? window.myfaces = {} : null;");
- script.append("(!myfaces.core) ? myfaces.core = {} : null;");
- script.append("(!myfaces.core.config) ? myfaces.core.config = {} : null;");
- }
-
- if (autoScroll)
- {
- script.append("myfaces.core.config.autoScroll = true;");
- }
- if (autoSave)
- {
- script.append("myfaces.core.config.ieAutoSave = true;");
- }
- if (autoScroll || autoSave)
- {
- writer.startElement(HTML.SCRIPT_ELEM, null);
- writer.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
- writer.writeText(script.toString(), null);
- writer.endElement(HTML.SCRIPT_ELEM);
- }
- }
- /**
- * @param facesContext
- * @param context
- * @param autoScroll
- */
- private static void prepareScript(FacesContext facesContext,
- ScriptContext context, boolean autoScroll)
- {
-
- final char separatorChar = UINamingContainer
- .getSeparatorChar(facesContext);
- context.prettyLine();
-
- //render a function to create a hidden input, if it doesn't exist
- context.append("function ");
- context.append(SET_HIDDEN_INPUT_FN_NAME).append(
- "(formname, name, value)");
- context.append("{");
- context.append("var form = document.forms[formname];");
- context.prettyLine();
- context.append("if (typeof form == 'undefined')");
- context.append("{");
- context.append("form = document.getElementById(formname);");
- context.append("}");
- context.prettyLine();
- context.append("if(typeof form.elements[name]!='undefined' && "+
- "(form.elements[name].nodeName=='INPUT' || form.elements[name].nodeName=='input'))");
- context.append("{");
- context.append("form.elements[name].value=value;");
- context.append("}");
- context.append("else");
- context.append("{");
- context.append("var newInput = document.createElement('input');");
- context.prettyLine();
- context.append("newInput.setAttribute('type','hidden');");
- context.prettyLine();
- context.append("newInput.setAttribute('id',name);"); // IE hack; See MYFACES-1805
- context.prettyLine();
- context.append("newInput.setAttribute('name',name);");
- context.prettyLine();
- context.append("newInput.setAttribute('value',value);");
- context.prettyLine();
- context.append("form.appendChild(newInput);");
- context.append("}");
-
- context.append("}");
-
- context.prettyLine();
-
- context.prettyLine();
-
- //render a function to clear a hidden input, if it exists
- context.append("function ");
- context.append(CLEAR_HIDDEN_INPUT_FN_NAME).append(
- "(formname, name, value)");
- context.append("{");
- context.append("var form = document.forms[formname];");
- context.prettyLine();
- context.append("if (typeof form == 'undefined')");
- context.append("{");
- context.append("form = document.getElementById(formname);");
- context.append("}");
- context.prettyLine();
- context.append("var hInput = form.elements[name];");
- context.prettyLine();
- context.append("if(typeof hInput !='undefined')");
- context.append("{");
- //context.append("form.elements[name].value=null;");
- context.append("form.removeChild(hInput);");
- context.append("}");
-
- context.append("}");
-
- context.prettyLine();
-
- context.append("function ");
- context.append(HtmlRendererUtils.SUBMIT_FORM_FN_NAME).append(
- "(formName, linkId, target, params)");
- context.append("{");
-
- //call the script to clear the form (clearFormHiddenParams_<formName>) method -
- //optionally, only necessary for IE5.5.
- //todo: if IE5.5. is ever desupported, we can get rid of this and instead rely on
- //the last part of this script to
- //clear the parameters
- appendClearHiddenCommandFormParamsFunctionCall(
- context, null);
-
- if (autoScroll)
- {
- appendAutoScrollAssignment(facesContext, context, null);
- }
-
- context.prettyLine();
-
- context.append("var form = document.forms[formName];");
- context.prettyLine();
- context.append("if (typeof form == 'undefined')");
- context.append("{");
- context.append("form = document.getElementById(formName);");
- context.append("}");
- context.prettyLine();
-
- if (JavascriptUtils.isSaveFormSubmitLinkIE(FacesContext
- .getCurrentInstance().getExternalContext()))
- {
- context.append("var agentString = navigator.userAgent.toLowerCase();");
- context.prettyLine();
- //context.append("var isIE = false;");
- context.prettyLine();
- context.append("if (agentString.indexOf('msie') != -1)");
-
- context.append("{");
- context.append("if (!(agentString.indexOf('ppc') != -1 &&"+
- " agentString.indexOf('windows ce') != -1 && version >= 4.0))");
- context.append("{");
- context.append("window.external.AutoCompleteSaveForm(form);");
- // context.append("isIE = false;");
- context.append("}");
- // context.append("else");
- // context.append("{");
- // context.append("isIE = true;");
- // context.prettyLine();
- // context.append("}");
-
- context.append("}");
-
- context.prettyLine();
- }
- //set the target (and save it). This should be done always,
- //and the default value of target is always valid.
- context.append("var oldTarget = form.target;");
- context.prettyLine();
- context.append("if(target != null)");
- context.append("{");
- context.prettyLine();
- context.append("form.target=target;");
- context.append("}");
-
- //set the submit parameters
-
- context.append("if((typeof params!='undefined') && params != null)");
- context.append("{");
- context.prettyLine();
- context.append("for(var i=0, param; (param = params[i]); i++)");
- context.append("{");
- context.append(SET_HIDDEN_INPUT_FN_NAME).append(
- "(formName,param[0], param[1]);");
- context.append("}");
- context.append("}");
-
- context.prettyLine();
-
- context.append(SET_HIDDEN_INPUT_FN_NAME);
- context.append("(formName,formName +'" + separatorChar + "'+'"
- + HtmlRendererUtils.HIDDEN_COMMANDLINK_FIELD_NAME
- + "',linkId);");
-
- context.prettyLine();
- context.prettyLine();
-
- //do the actual submit calls
-
- context.append("if(form.onsubmit)");
- context.append("{");
- context.append("var result=form.onsubmit();");
- context.prettyLine();
- context.append("if((typeof result=='undefined')||result)");
- context.append("{");
- context.append("try");
- context.append("{");
- context.append("form.submit();");
- context.append("}");
- context.append("catch(e){}");
- context.append("}");
- context.append("}");
- context.append("else ");
- context.append("{");
- context.append("try");
- context.append("{");
- context.append("form.submit();");
- context.append("}");
- context.append("catch(e){}");
- context.append("}");
-
- //reset the target
- context.prettyLine();
- //Restore the old target, no more questions asked
- context.append("form.target=oldTarget;");
- context.prettyLine();
-
- //clear the individual parameters - to make sure that even if the clear-function isn't called,
- // the back button/resubmit functionality will still work in all browsers except IE 5.5.
-
- context.append("if((typeof params!='undefined') && params != null)");
- context.append("{");
- context.prettyLine();
- context.append("for(var i=0, param; (param = params[i]); i++)");
- context.append("{");
- context.append(CLEAR_HIDDEN_INPUT_FN_NAME).append(
- "(formName,param[0], param[1]);");
- context.append("}");
- context.append("}");
-
- context.prettyLine();
-
- context.append(CLEAR_HIDDEN_INPUT_FN_NAME);
- context.append("(formName,formName +'" + separatorChar + "'+'"
- + HtmlRendererUtils.HIDDEN_COMMANDLINK_FIELD_NAME
- + "',linkId);");
-
- //return false, so that browser does not handle the click
- context.append("return false;");
- context.append("}");
-
- context.prettyLineDecreaseIndent();
- }
-
- public static void appendAutoScrollAssignment(StringBuilder onClickValue,
- String formName)
- {
- appendAutoScrollAssignment(FacesContext.getCurrentInstance(),
- new ScriptContext(onClickValue, false), formName);
- }
-
- /**
- * Adds the hidden form input value assignment that is necessary for the autoscroll
- * feature to an html link or button onclick attribute.
- */
- public static void appendAutoScrollAssignment(FacesContext context,
- StringBuilder onClickValue, String formName)
- {
- appendAutoScrollAssignment(context, new ScriptContext(onClickValue,
- false), formName);
- }
-
- private static void appendAutoScrollAssignment(FacesContext context,
- ScriptContext scriptContext, String formName)
- {
- String formNameStr = formName == null ? "formName" : (new StringBuilder(
- "'").append(formName).append("'").toString());
- String paramName = new StringBuilder().append("'")
- .append(AUTO_SCROLL_PARAM).append("'").toString();
- String value = new StringBuilder().append(AUTO_SCROLL_FUNCTION)
- .append("()").toString();
-
- scriptContext.prettyLine();
- scriptContext.append("if(typeof window." + AUTO_SCROLL_FUNCTION
- + "!='undefined')");
- scriptContext.append("{");
- if (MyfacesConfig.getCurrentInstance(context.getExternalContext())
- .isRenderFormSubmitScriptInline())
- {
- scriptContext.append(SET_HIDDEN_INPUT_FN_NAME);
- }
- else
- {
- scriptContext.append(SET_HIDDEN_INPUT_FN_NAME_JSF2);
- }
- scriptContext.append("(").append(formNameStr).append(",")
- .append(paramName).append(",").append(value).append(");");
- scriptContext.append("}");
-
- }
-
- public static String getAutoScrollFunction(FacesContext facesContext)
- {
- ScriptContext script = new ScriptContext(MyfacesConfig
- .getCurrentInstance(facesContext.getExternalContext())
- .isPrettyHtml());
-
- script.prettyLineIncreaseIndent();
-
- script.append("function ");
- script.append(AUTO_SCROLL_FUNCTION);
- script.append("()");
- script.append("{");
- script.append("var x = 0; var y = 0;");
- script.append("if (self.pageXOffset || self.pageYOffset)");
- script.append("{");
- script.append("x = self.pageXOffset;");
- script.prettyLine();
- script.append("y = self.pageYOffset;");
- script.append("}");
- script.append(" else if ((document.documentElement && document.documentElement.scrollLeft)||"+
- "(document.documentElement && document.documentElement.scrollTop))");
- script.append("{");
- script.append("x = document.documentElement.scrollLeft;");
- script.prettyLine();
- script.append("y = document.documentElement.scrollTop;");
- script.append("}");
- script.append(" else if (document.body) ");
- script.append("{");
- script.append("x = document.body.scrollLeft;");
- script.prettyLine();
- script.append("y = document.body.scrollTop;");
- script.append("}");
- script.append("return x + \",\" + y;");
- script.append("}");
-
- ExternalContext externalContext = facesContext.getExternalContext();
- String oldViewId = JavascriptUtils.getOldViewId(externalContext);
- if (oldViewId != null
- && oldViewId.equals(facesContext.getViewRoot().getViewId()))
- {
- //ok, we stayed on the same page, so let's scroll it to the former place
- String scrolling = (String) externalContext
- .getRequestParameterMap().get(AUTO_SCROLL_PARAM);
- if (scrolling != null && scrolling.length() > 0)
- {
- int x = 0;
- int y = 0;
- int comma = scrolling.indexOf(',');
- if (comma == -1)
- {
- log.warning("Illegal autoscroll request parameter: "
- + scrolling);
- }
- else
- {
- try
- {
- //we convert to int against XSS vulnerability
- x = Integer.parseInt(scrolling.substring(0, comma));
- }
- catch (NumberFormatException e)
- {
- log.warning("Error getting x offset for autoscroll feature. Bad param value: "
- + scrolling);
- x = 0; //ignore false numbers
- }
-
- try
- {
- //we convert to int against XSS vulnerability
- y = Integer.parseInt(scrolling.substring(comma + 1));
- }
- catch (NumberFormatException e)
- {
- log.warning("Error getting y offset for autoscroll feature. Bad param value: "
- + scrolling);
- y = 0; //ignore false numbers
- }
- }
- script.append("window.scrollTo(").append(x).append(",")
- .append(y).append(");\n");
- }
- }
-
- return script.toString();
- }
-
- /**
- * Renders the hidden form input that is necessary for the autoscroll feature.
- */
- public static void renderAutoScrollHiddenInput(FacesContext facesContext,
- ResponseWriter writer) throws IOException
- {
- HtmlRendererUtils.writePrettyLineSeparator(facesContext);
- writer.startElement(HTML.INPUT_ELEM, null);
- writer.writeAttribute(HTML.TYPE_ATTR, "hidden", null);
- writer.writeAttribute(HTML.NAME_ATTR, AUTO_SCROLL_PARAM, null);
- writer.endElement(HTML.INPUT_ELEM);
- HtmlRendererUtils.writePrettyLineSeparator(facesContext);
- }
-
- /**
- * Renders the autoscroll javascript function.
- */
- public static void renderAutoScrollFunction(FacesContext facesContext,
- ResponseWriter writer) throws IOException
- {
- HtmlRendererUtils.writePrettyLineSeparator(facesContext);
- writer.startElement(HTML.SCRIPT_ELEM, null);
- writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR,
- HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT, null);
- writer.writeText(getAutoScrollFunction(facesContext), null);
- writer.endElement(HTML.SCRIPT_ELEM);
- HtmlRendererUtils.writePrettyLineSeparator(facesContext);
- }
-
- public static void appendClearHiddenCommandFormParamsFunctionCall(
- StringBuilder buf, String formName)
- {
- appendClearHiddenCommandFormParamsFunctionCall(new ScriptContext(buf,
- false), formName);
- }
-
- private static void appendClearHiddenCommandFormParamsFunctionCall(
- ScriptContext context, String formName)
- {
- String functionName = HtmlRendererUtils
- .getClearHiddenCommandFormParamsFunctionName(formName);
- if (formName == null)
- {
- context.prettyLine();
- context.append("var clearFn = ");
- context.append(functionName);
- context.append(";");
- context.prettyLine();
- context.append("if(typeof window[clearFn] =='function')");
- context.append("{");
- context.append("window[clearFn](formName);");
- context.append("}");
- }
- else
- {
- context.prettyLine();
- context.append("if(typeof window.");
- context.append(functionName);
- context.append("=='function')");
- context.append("{");
- context.append(functionName).append("('").append(formName)
- .append("');");
- context.append("}");
- }
- }
-
- /**
- * Prefixes the given String with "clear_" and removes special characters
- *
- * @param formName
- * @return String
- */
- public static String getClearHiddenCommandFormParamsFunctionName(
- String formName)
- {
- final char separatorChar = UINamingContainer
- .getSeparatorChar(FacesContext.getCurrentInstance());
- if (formName == null)
- {
- return "'" + HtmlRendererUtils.CLEAR_HIDDEN_FIELD_FN_NAME
- + "_'+formName.replace(/-/g, '\\$" + separatorChar
- + "').replace(/" + separatorChar + "/g,'_')";
- }
-
- return JavascriptUtils
- .getValidJavascriptNameAsInRI(HtmlRendererUtils.CLEAR_HIDDEN_FIELD_FN_NAME + "_"
- + formName.replace(separatorChar, '_'));
- }
-
- public static String getClearHiddenCommandFormParamsFunctionNameMyfacesLegacy(
- String formName)
- {
- return "clear_"
- + JavascriptUtils.getValidJavascriptName(formName, false);
- }
-
- /**
- * Render the javascript function that is called on a click on a commandLink
- * to clear the hidden inputs. This is necessary because on a browser back,
- * each hidden input still has it's old value (browser cache!) and therefore
- * a new submit would cause the according action once more!
- *
- * @param writer
- * @param formName
- * @param dummyFormParams
- * @param formTarget
- * @throws IOException
- */
- public static void renderClearHiddenCommandFormParamsFunction(
- ResponseWriter writer, String formName, Set dummyFormParams,
- String formTarget) throws IOException
- {
- //render the clear hidden inputs javascript function
- String functionName = getClearHiddenCommandFormParamsFunctionName(formName);
- writer.startElement(HTML.SCRIPT_ELEM, null);
- writer.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
-
- // Using writeComment instead of write with <!-- tag
- StringBuilder script = new StringBuilder();
- script.append("function ");
- script.append(functionName);
- script.append("() {");
- if (dummyFormParams != null)
- {
- script.append("\n var f = document.forms['");
- script.append(formName);
- script.append("'];");
- int i = 0;
- for (Iterator it = dummyFormParams.iterator(); it.hasNext();)
- {
- String elemVarName = "elem" + i;
- script.append("\n var ").append(elemVarName).append(" = ");
- script.append("f.elements['").append((String) it.next())
- .append("'];");
- script.append("\n if(typeof ").append(elemVarName)
- .append(" !='undefined' && ");
- script.append(elemVarName).append(".nodeName=='INPUT'){");
- script.append("\n if (").append(elemVarName)
- .append(".value != '') {");
- script.append("\n " + elemVarName + ".value='';");
- script.append("\n }");
- script.append("\n }");
- i++;
- }
- }
- // clear form target
- script.append("\n f.target=");
- if (formTarget == null || formTarget.length() == 0)
- {
- //Normally one would think that setting target to null has the
- //desired effect, but once again IE is different...
- //Setting target to null causes IE to open a new window!
- script.append("'';");
- }
- else
- {
- script.append("'");
- script.append(formTarget);
- script.append("';");
- }
- script.append("\n}");
-
- //Just to be sure we call this clear method on each load.
- //Otherwise in the case, that someone submits a form by pressing Enter
- //within a text input, the hidden inputs won't be cleared!
- script.append("\n");
- script.append(functionName);
- script.append("();");
-
- writer.writeText(script.toString(), null);
- writer.endElement(HTML.SCRIPT_ELEM);
- }
-
- /**
- * This function correctly escapes the given JavaScript code
- * for the use in the jsf.util.chain() JavaScript function.
- * It also handles double-escaping correclty.
- *
- * @param javaScript
- * @return
- */
- public static String escapeJavaScriptForChain(String javaScript)
- {
- // first replace \' with \\'
- //String escaped = StringUtils.replace(javaScript, "\\'", "\\\\'");
-
- // then replace ' with \'
- // (this will replace every \' in the original to \\\')
- //escaped = StringUtils.replace(escaped, '\'', "\\'");
-
- //return escaped;
-
- StringBuilder out = null;
- for (int pos = 0; pos < javaScript.length(); pos++)
- {
- char c = javaScript.charAt(pos);
-
- if (c == '\\' || c == '\'')
- {
- if (out == null)
- {
- out = new StringBuilder(javaScript.length() + 8);
- if (pos > 0)
- {
- out.append(javaScript, 0, pos);
- }
- }
- out.append('\\');
- }
- if (out != null)
- {
- out.append(c);
- }
- }
-
- if (out == null)
- {
- return javaScript;
- }
- else
- {
- return out.toString();
- }
- }
-
- public static void renderViewStateJavascript(FacesContext facesContext,
- String hiddenId, String serializedState) throws IOException
- {
- ResponseWriter writer = facesContext.getResponseWriter();
-
- writer.startElement(HTML.SCRIPT_ELEM, null);
- writer.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
-
- final ExternalContext externalContext = facesContext
- .getExternalContext();
- final MyfacesConfig currentInstance = MyfacesConfig
- .getCurrentInstance(externalContext);
-
- ScriptContext context = new ScriptContext(
- currentInstance.isPrettyHtml());
- context.prettyLine();
- context.increaseIndent();
-
- context.append("function setViewState() {\n");
- context.append("\tvar state = '");
- context.append(serializedState);
- context.append("';\n");
- context.append("\tfor (var i = 0; i < document.forms.length; i++) {\n");
- context.append("\t\tdocument.forms[i]['" + hiddenId
- + "'].value = state;\n");
- context.append("\t}\n");
- context.append("}\n");
- context.append("setViewState();\n");
-
- context.decreaseIndent();
-
- writer.writeText(context.toString(), null);
-
- writer.endElement(HTML.SCRIPT_ELEM);
- }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.shared.renderkit.html;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Logger;
+
+import javax.faces.component.UINamingContainer;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+
+import org.apache.myfaces.shared.config.MyfacesConfig;
+import org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils.ScriptContext;
+import org.apache.myfaces.shared.renderkit.html.util.JavascriptUtils;
+import org.apache.myfaces.shared.renderkit.html.util.ResourceUtils;
+
+public final class HtmlJavaScriptUtils
+{
+ private static final Logger log = Logger.getLogger(HtmlJavaScriptUtils.class
+ .getName());
+
+ private static final String AUTO_SCROLL_PARAM = "autoScroll";
+ private static final String AUTO_SCROLL_FUNCTION = "getScrolling";
+
+ private static final String SET_HIDDEN_INPUT_FN_NAME = "oamSetHiddenInput";
+ private static final String SET_HIDDEN_INPUT_FN_NAME_JSF2 = "myfaces.oam.setHiddenInput";
+
+ private static final String FIRST_SUBMIT_SCRIPT_ON_PAGE = "org.apache.MyFaces.FIRST_SUBMIT_SCRIPT_ON_PAGE";
+ private static final String CLEAR_HIDDEN_INPUT_FN_NAME = "oamClearHiddenInput";
+
+
+ @SuppressWarnings("unchecked")
+ public static void renderFormSubmitScript(FacesContext facesContext)
+ throws IOException
+ {
+
+ Map map = facesContext.getExternalContext().getRequestMap();
+ Boolean firstScript = (Boolean) map.get(FIRST_SUBMIT_SCRIPT_ON_PAGE);
+
+ if (firstScript == null || firstScript.equals(Boolean.TRUE))
+ {
+ map.put(FIRST_SUBMIT_SCRIPT_ON_PAGE, Boolean.FALSE);
+ renderFormSubmitScriptIfNecessary(facesContext);
+
+ //we have to render the config just in case
+ renderConfigOptionsIfNecessary(facesContext);
+ }
+ }
+
+ /**
+ * @param facesContext
+ * @throws IOException
+ */
+ private static void renderFormSubmitScriptIfNecessary(
+ FacesContext facesContext) throws IOException
+ {
+ final ExternalContext externalContext = facesContext
+ .getExternalContext();
+ final MyfacesConfig currentInstance = MyfacesConfig
+ .getCurrentInstance(externalContext);
+ ResponseWriter writer = facesContext.getResponseWriter();
+
+ if (currentInstance.isRenderFormSubmitScriptInline())
+ {
+ writer.startElement(HTML.SCRIPT_ELEM, null);
+ writer.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
+
+ boolean autoScroll = currentInstance.isAutoScroll();
+
+ ScriptContext context = new ScriptContext(
+ currentInstance.isPrettyHtml());
+ context.prettyLine();
+ context.increaseIndent();
+
+ prepareScript(facesContext, context, autoScroll);
+
+ writer.writeText(context.toString(), null);
+
+ writer.endElement(HTML.SCRIPT_ELEM);
+ }
+ else
+ {
+ ResourceUtils
+ .renderMyfacesJSInlineIfNecessary(facesContext, writer);
+ }
+ }
+
+ private static void renderConfigOptionsIfNecessary(FacesContext facesContext)
+ throws IOException
+ {
+ ResponseWriter writer = facesContext.getResponseWriter();
+ MyfacesConfig config = MyfacesConfig.getCurrentInstance(facesContext
+ .getExternalContext());
+ ScriptContext script = new ScriptContext(config.isPrettyHtml());
+ boolean autoScroll = config.isAutoScroll();
+ boolean autoSave = JavascriptUtils.isSaveFormSubmitLinkIE(facesContext
+ .getExternalContext());
+
+ if (autoScroll || autoSave)
+ {
+ script.prettyLine();
+ script.increaseIndent();
+ script.append("(!window.myfaces) ? window.myfaces = {} : null;");
+ script.append("(!myfaces.core) ? myfaces.core = {} : null;");
+ script.append("(!myfaces.core.config) ? myfaces.core.config = {} : null;");
+ }
+
+ if (autoScroll)
+ {
+ script.append("myfaces.core.config.autoScroll = true;");
+ }
+ if (autoSave)
+ {
+ script.append("myfaces.core.config.ieAutoSave = true;");
+ }
+ if (autoScroll || autoSave)
+ {
+ writer.startElement(HTML.SCRIPT_ELEM, null);
+ writer.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
+ writer.writeText(script.toString(), null);
+ writer.endElement(HTML.SCRIPT_ELEM);
+ }
+ }
+ /**
+ * @param facesContext
+ * @param context
+ * @param autoScroll
+ */
+ private static void prepareScript(FacesContext facesContext,
+ ScriptContext context, boolean autoScroll)
+ {
+
+ final char separatorChar = UINamingContainer
+ .getSeparatorChar(facesContext);
+ context.prettyLine();
+
+ //render a function to create a hidden input, if it doesn't exist
+ context.append("function ");
+ context.append(SET_HIDDEN_INPUT_FN_NAME).append(
+ "(formname, name, value)");
+ context.append("{");
+ context.append("var form = document.forms[formname];");
+ context.prettyLine();
+ context.append("if (typeof form == 'undefined')");
+ context.append("{");
+ context.append("form = document.getElementById(formname);");
+ context.append("}");
+ context.prettyLine();
+ context.append("if(typeof form.elements[name]!='undefined' && "+
+ "(form.elements[name].nodeName=='INPUT' || form.elements[name].nodeName=='input'))");
+ context.append("{");
+ context.append("form.elements[name].value=value;");
+ context.append("}");
+ context.append("else");
+ context.append("{");
+ context.append("var newInput = document.createElement('input');");
+ context.prettyLine();
+ context.append("newInput.setAttribute('type','hidden');");
+ context.prettyLine();
+ context.append("newInput.setAttribute('id',name);"); // IE hack; See MYFACES-1805
+ context.prettyLine();
+ context.append("newInput.setAttribute('name',name);");
+ context.prettyLine();
+ context.append("newInput.setAttribute('value',value);");
+ context.prettyLine();
+ context.append("form.appendChild(newInput);");
+ context.append("}");
+
+ context.append("}");
+
+ context.prettyLine();
+
+ context.prettyLine();
+
+ //render a function to clear a hidden input, if it exists
+ context.append("function ");
+ context.append(CLEAR_HIDDEN_INPUT_FN_NAME).append(
+ "(formname, name, value)");
+ context.append("{");
+ context.append("var form = document.forms[formname];");
+ context.prettyLine();
+ context.append("if (typeof form == 'undefined')");
+ context.append("{");
+ context.append("form = document.getElementById(formname);");
+ context.append("}");
+ context.prettyLine();
+ context.append("var hInput = form.elements[name];");
+ context.prettyLine();
+ context.append("if(typeof hInput !='undefined')");
+ context.append("{");
+ //context.append("form.elements[name].value=null;");
+ context.append("form.removeChild(hInput);");
+ context.append("}");
+
+ context.append("}");
+
+ context.prettyLine();
+
+ context.append("function ");
+ context.append(HtmlRendererUtils.SUBMIT_FORM_FN_NAME).append(
+ "(formName, linkId, target, params)");
+ context.append("{");
+
+ //call the script to clear the form (clearFormHiddenParams_<formName>) method -
+ //optionally, only necessary for IE5.5.
+ //todo: if IE5.5. is ever desupported, we can get rid of this and instead rely on
+ //the last part of this script to
+ //clear the parameters
+ appendClearHiddenCommandFormParamsFunctionCall(
+ context, null);
+
+ if (autoScroll)
+ {
+ appendAutoScrollAssignment(facesContext, context, null);
+ }
+
+ context.prettyLine();
+
+ context.append("var form = document.forms[formName];");
+ context.prettyLine();
+ context.append("if (typeof form == 'undefined')");
+ context.append("{");
+ context.append("form = document.getElementById(formName);");
+ context.append("}");
+ context.prettyLine();
+
+ if (JavascriptUtils.isSaveFormSubmitLinkIE(FacesContext
+ .getCurrentInstance().getExternalContext()))
+ {
+ context.append("var agentString = navigator.userAgent.toLowerCase();");
+ context.prettyLine();
+ //context.append("var isIE = false;");
+ context.prettyLine();
+ context.append("if (agentString.indexOf('msie') != -1)");
+
+ context.append("{");
+ context.append("if (!(agentString.indexOf('ppc') != -1 &&"+
+ " agentString.indexOf('windows ce') != -1 && version >= 4.0))");
+ context.append("{");
+ context.append("window.external.AutoCompleteSaveForm(form);");
+ // context.append("isIE = false;");
+ context.append("}");
+ // context.append("else");
+ // context.append("{");
+ // context.append("isIE = true;");
+ // context.prettyLine();
+ // context.append("}");
+
+ context.append("}");
+
+ context.prettyLine();
+ }
+ //set the target (and save it). This should be done always,
+ //and the default value of target is always valid.
+ context.append("var oldTarget = form.target;");
+ context.prettyLine();
+ context.append("if(target != null)");
+ context.append("{");
+ context.prettyLine();
+ context.append("form.target=target;");
+ context.append("}");
+
+ //set the submit parameters
+
+ context.append("if((typeof params!='undefined') && params != null)");
+ context.append("{");
+ context.prettyLine();
+ context.append("for(var i=0, param; (param = params[i]); i++)");
+ context.append("{");
+ context.append(SET_HIDDEN_INPUT_FN_NAME).append(
+ "(formName,param[0], param[1]);");
+ context.append("}");
+ context.append("}");
+
+ context.prettyLine();
+
+ context.append(SET_HIDDEN_INPUT_FN_NAME);
+ context.append("(formName,formName +'" + separatorChar + "'+'"
+ + HtmlRendererUtils.HIDDEN_COMMANDLINK_FIELD_NAME
+ + "',linkId);");
+
+ context.prettyLine();
+ context.prettyLine();
+
+ //do the actual submit calls
+
+ context.append("if(form.onsubmit)");
+ context.append("{");
+ context.append("var result=form.onsubmit();");
+ context.prettyLine();
+ context.append("if((typeof result=='undefined')||result)");
+ context.append("{");
+ context.append("try");
+ context.append("{");
+ context.append("form.submit();");
+ context.append("}");
+ context.append("catch(e){}");
+ context.append("}");
+ context.append("}");
+ context.append("else ");
+ context.append("{");
+ context.append("try");
+ context.append("{");
+ context.append("form.submit();");
+ context.append("}");
+ context.append("catch(e){}");
+ context.append("}");
+
+ //reset the target
+ context.prettyLine();
+ //Restore the old target, no more questions asked
+ context.append("form.target=oldTarget;");
+ context.prettyLine();
+
+ //clear the individual parameters - to make sure that even if the clear-function isn't called,
+ // the back button/resubmit functionality will still work in all browsers except IE 5.5.
+
+ context.append("if((typeof params!='undefined') && params != null)");
+ context.append("{");
+ context.prettyLine();
+ context.append("for(var i=0, param; (param = params[i]); i++)");
+ context.append("{");
+ context.append(CLEAR_HIDDEN_INPUT_FN_NAME).append(
+ "(formName,param[0], param[1]);");
+ context.append("}");
+ context.append("}");
+
+ context.prettyLine();
+
+ context.append(CLEAR_HIDDEN_INPUT_FN_NAME);
+ context.append("(formName,formName +'" + separatorChar + "'+'"
+ + HtmlRendererUtils.HIDDEN_COMMANDLINK_FIELD_NAME
+ + "',linkId);");
+
+ //return false, so that browser does not handle the click
+ context.append("return false;");
+ context.append("}");
+
+ context.prettyLineDecreaseIndent();
+ }
+
+ public static void appendAutoScrollAssignment(StringBuilder onClickValue,
+ String formName)
+ {
+ appendAutoScrollAssignment(FacesContext.getCurrentInstance(),
+ new ScriptContext(onClickValue, false), formName);
+ }
+
+ /**
+ * Adds the hidden form input value assignment that is necessary for the autoscroll
+ * feature to an html link or button onclick attribute.
+ */
+ public static void appendAutoScrollAssignment(FacesContext context,
+ StringBuilder onClickValue, String formName)
+ {
+ appendAutoScrollAssignment(context, new ScriptContext(onClickValue,
+ false), formName);
+ }
+
+ private static void appendAutoScrollAssignment(FacesContext context,
+ ScriptContext scriptContext, String formName)
+ {
+ String formNameStr = formName == null ? "formName" : (new StringBuilder(
+ "'").append(formName).append("'").toString());
+ String paramName = new StringBuilder().append("'")
+ .append(AUTO_SCROLL_PARAM).append("'").toString();
+ String value = new StringBuilder().append(AUTO_SCROLL_FUNCTION)
+ .append("()").toString();
+
+ scriptContext.prettyLine();
+ scriptContext.append("if(typeof window." + AUTO_SCROLL_FUNCTION
+ + "!='undefined')");
+ scriptContext.append("{");
+ if (MyfacesConfig.getCurrentInstance(context.getExternalContext())
+ .isRenderFormSubmitScriptInline())
+ {
+ scriptContext.append(SET_HIDDEN_INPUT_FN_NAME);
+ }
+ else
+ {
+ scriptContext.append(SET_HIDDEN_INPUT_FN_NAME_JSF2);
+ }
+ scriptContext.append("(").append(formNameStr).append(",")
+ .append(paramName).append(",").append(value).append(");");
+ scriptContext.append("}");
+
+ }
+
+ public static String getAutoScrollFunction(FacesContext facesContext)
+ {
+ ScriptContext script = new ScriptContext(MyfacesConfig
+ .getCurrentInstance(facesContext.getExternalContext())
+ .isPrettyHtml());
+
+ script.prettyLineIncreaseIndent();
+
+ script.append("function ");
+ script.append(AUTO_SCROLL_FUNCTION);
+ script.append("()");
+ script.append("{");
+ script.append("var x = 0; var y = 0;");
+ script.append("if (self.pageXOffset || self.pageYOffset)");
+ script.append("{");
+ script.append("x = self.pageXOffset;");
+ script.prettyLine();
+ script.append("y = self.pageYOffset;");
+ script.append("}");
+ script.append(" else if ((document.documentElement && document.documentElement.scrollLeft)||"+
+ "(document.documentElement && document.documentElement.scrollTop))");
+ script.append("{");
+ script.append("x = document.documentElement.scrollLeft;");
+ script.prettyLine();
+ script.append("y = document.documentElement.scrollTop;");
+ script.append("}");
+ script.append(" else if (document.body) ");
+ script.append("{");
+ script.append("x = document.body.scrollLeft;");
+ script.prettyLine();
+ script.append("y = document.body.scrollTop;");
+ script.append("}");
+ script.append("return x + \",\" + y;");
+ script.append("}");
+
+ ExternalContext externalContext = facesContext.getExternalContext();
+ String oldViewId = JavascriptUtils.getOldViewId(externalContext);
+ if (oldViewId != null
+ && oldViewId.equals(facesContext.getViewRoot().getViewId()))
+ {
+ //ok, we stayed on the same page, so let's scroll it to the former place
+ String scrolling = (String) externalContext
+ .getRequestParameterMap().get(AUTO_SCROLL_PARAM);
+ if (scrolling != null && scrolling.length() > 0)
+ {
+ int x = 0;
+ int y = 0;
+ int comma = scrolling.indexOf(',');
+ if (comma == -1)
+ {
+ log.warning("Illegal autoscroll request parameter: "
+ + scrolling);
+ }
+ else
+ {
+ try
+ {
+ //we convert to int against XSS vulnerability
+ x = Integer.parseInt(scrolling.substring(0, comma));
+ }
+ catch (NumberFormatException e)
+ {
+ log.warning("Error getting x offset for autoscroll feature. Bad param value: "
+ + scrolling);
+ x = 0; //ignore false numbers
+ }
+
+ try
+ {
+ //we convert to int against XSS vulnerability
+ y = Integer.parseInt(scrolling.substring(comma + 1));
+ }
+ catch (NumberFormatException e)
+ {
+ log.warning("Error getting y offset for autoscroll feature. Bad param value: "
+ + scrolling);
+ y = 0; //ignore false numbers
+ }
+ }
+ script.append("window.scrollTo(").append(x).append(",")
+ .append(y).append(");\n");
+ }
+ }
+
+ return script.toString();
+ }
+
+ /**
+ * Renders the hidden form input that is necessary for the autoscroll feature.
+ */
+ public static void renderAutoScrollHiddenInput(FacesContext facesContext,
+ ResponseWriter writer) throws IOException
+ {
+ HtmlRendererUtils.writePrettyLineSeparator(facesContext);
+ writer.startElement(HTML.INPUT_ELEM, null);
+ writer.writeAttribute(HTML.TYPE_ATTR, "hidden", null);
+ writer.writeAttribute(HTML.NAME_ATTR, AUTO_SCROLL_PARAM, null);
+ writer.endElement(HTML.INPUT_ELEM);
+ HtmlRendererUtils.writePrettyLineSeparator(facesContext);
+ }
+
+ /**
+ * Renders the autoscroll javascript function.
+ */
+ public static void renderAutoScrollFunction(FacesContext facesContext,
+ ResponseWriter writer) throws IOException
+ {
+ HtmlRendererUtils.writePrettyLineSeparator(facesContext);
+ writer.startElement(HTML.SCRIPT_ELEM, null);
+ writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR,
+ HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT, null);
+ writer.writeText(getAutoScrollFunction(facesContext), null);
+ writer.endElement(HTML.SCRIPT_ELEM);
+ HtmlRendererUtils.writePrettyLineSeparator(facesContext);
+ }
+
+ public static void appendClearHiddenCommandFormParamsFunctionCall(
+ StringBuilder buf, String formName)
+ {
+ appendClearHiddenCommandFormParamsFunctionCall(new ScriptContext(buf,
+ false), formName);
+ }
+
+ private static void appendClearHiddenCommandFormParamsFunctionCall(
+ ScriptContext context, String formName)
+ {
+ String functionName = HtmlRendererUtils
+ .getClearHiddenCommandFormParamsFunctionName(formName);
+ if (formName == null)
+ {
+ context.prettyLine();
+ context.append("var clearFn = ");
+ context.append(functionName);
+ context.append(";");
+ context.prettyLine();
+ context.append("if(typeof window[clearFn] =='function')");
+ context.append("{");
+ context.append("window[clearFn](formName);");
+ context.append("}");
+ }
+ else
+ {
+ context.prettyLine();
+ context.append("if(typeof window.");
+ context.append(functionName);
+ context.append("=='function')");
+ context.append("{");
+ context.append(functionName).append("('").append(formName)
+ .append("');");
+ context.append("}");
+ }
+ }
+
+ /**
+ * Prefixes the given String with "clear_" and removes special characters
+ *
+ * @param formName
+ * @return String
+ */
+ public static String getClearHiddenCommandFormParamsFunctionName(
+ String formName)
+ {
+ final char separatorChar = UINamingContainer
+ .getSeparatorChar(FacesContext.getCurrentInstance());
+ if (formName == null)
+ {
+ return "'" + HtmlRendererUtils.CLEAR_HIDDEN_FIELD_FN_NAME
+ + "_'+formName.replace(/-/g, '\\$" + separatorChar
+ + "').replace(/" + separatorChar + "/g,'_')";
+ }
+
+ return JavascriptUtils
+ .getValidJavascriptNameAsInRI(HtmlRendererUtils.CLEAR_HIDDEN_FIELD_FN_NAME + "_"
+ + formName.replace(separatorChar, '_'));
+ }
+
+ public static String getClearHiddenCommandFormParamsFunctionNameMyfacesLegacy(
+ String formName)
+ {
+ return "clear_"
+ + JavascriptUtils.getValidJavascriptName(formName, false);
+ }
+
+ /**
+ * Render the javascript function that is called on a click on a commandLink
+ * to clear the hidden inputs. This is necessary because on a browser back,
+ * each hidden input still has it's old value (browser cache!) and therefore
+ * a new submit would cause the according action once more!
+ *
+ * @param writer
+ * @param formName
+ * @param dummyFormParams
+ * @param formTarget
+ * @throws IOException
+ */
+ public static void renderClearHiddenCommandFormParamsFunction(
+ ResponseWriter writer, String formName, Set dummyFormParams,
+ String formTarget) throws IOException
+ {
+ //render the clear hidden inputs javascript function
+ String functionName = getClearHiddenCommandFormParamsFunctionName(formName);
+ writer.startElement(HTML.SCRIPT_ELEM, null);
+ writer.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
+
+ // Using writeComment instead of write with <!-- tag
+ StringBuilder script = new StringBuilder();
+ script.append("function ");
+ script.append(functionName);
+ script.append("() {");
+ if (dummyFormParams != null)
+ {
+ script.append("\n var f = document.forms['");
+ script.append(formName);
+ script.append("'];");
+ int i = 0;
+ for (Iterator it = dummyFormParams.iterator(); it.hasNext();)
+ {
+ String elemVarName = "elem" + i;
+ script.append("\n var ").append(elemVarName).append(" = ");
+ script.append("f.elements['").append((String) it.next())
+ .append("'];");
+ script.append("\n if(typeof ").append(elemVarName)
+ .append(" !='undefined' && ");
+ script.append(elemVarName).append(".nodeName=='INPUT'){");
+ script.append("\n if (").append(elemVarName)
+ .append(".value != '') {");
+ script.append("\n " + elemVarName + ".value='';");
+ script.append("\n }");
+ script.append("\n }");
+ i++;
+ }
+ }
+ // clear form target
+ script.append("\n f.target=");
+ if (formTarget == null || formTarget.length() == 0)
+ {
+ //Normally one would think that setting target to null has the
+ //desired effect, but once again IE is different...
+ //Setting target to null causes IE to open a new window!
+ script.append("'';");
+ }
+ else
+ {
+ script.append("'");
+ script.append(formTarget);
+ script.append("';");
+ }
+ script.append("\n}");
+
+ //Just to be sure we call this clear method on each load.
+ //Otherwise in the case, that someone submits a form by pressing Enter
+ //within a text input, the hidden inputs won't be cleared!
+ script.append("\n");
+ script.append(functionName);
+ script.append("();");
+
+ writer.writeText(script.toString(), null);
+ writer.endElement(HTML.SCRIPT_ELEM);
+ }
+
+ /**
+ * This function correctly escapes the given JavaScript code
+ * for the use in the jsf.util.chain() JavaScript function.
+ * It also handles double-escaping correclty.
+ *
+ * @param javaScript
+ * @return
+ */
+ public static String escapeJavaScriptForChain(String javaScript)
+ {
+ // first replace \' with \\'
+ //String escaped = StringUtils.replace(javaScript, "\\'", "\\\\'");
+
+ // then replace ' with \'
+ // (this will replace every \' in the original to \\\')
+ //escaped = StringUtils.replace(escaped, '\'', "\\'");
+
+ //return escaped;
+
+ StringBuilder out = null;
+ for (int pos = 0; pos < javaScript.length(); pos++)
+ {
+ char c = javaScript.charAt(pos);
+
+ if (c == '\\' || c == '\'')
+ {
+ if (out == null)
+ {
+ out = new StringBuilder(javaScript.length() + 8);
+ if (pos > 0)
+ {
+ out.append(javaScript, 0, pos);
+ }
+ }
+ out.append('\\');
+ }
+ if (out != null)
+ {
+ out.append(c);
+ }
+ }
+
+ if (out == null)
+ {
+ return javaScript;
+ }
+ else
+ {
+ return out.toString();
+ }
+ }
+
+ public static void renderViewStateJavascript(FacesContext facesContext,
+ String hiddenId, String serializedState) throws IOException
+ {
+ ResponseWriter writer = facesContext.getResponseWriter();
+
+ writer.startElement(HTML.SCRIPT_ELEM, null);
+ writer.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
+
+ final ExternalContext externalContext = facesContext
+ .getExternalContext();
+ final MyfacesConfig currentInstance = MyfacesConfig
+ .getCurrentInstance(externalContext);
+
+ ScriptContext context = new ScriptContext(
+ currentInstance.isPrettyHtml());
+ context.prettyLine();
+ context.increaseIndent();
+
+ context.append("function setViewState() {\n");
+ context.append("\tvar state = '");
+ context.append(serializedState);
+ context.append("';\n");
+ context.append("\tfor (var i = 0; i < document.forms.length; i++) {\n");
+ context.append("\t\tdocument.forms[i]['" + hiddenId
+ + "'].value = state;\n");
+ context.append("\t}\n");
+ context.append("}\n");
+ context.append("setViewState();\n");
+
+ context.decreaseIndent();
+
+ writer.writeText(context.toString(), null);
+
+ writer.endElement(HTML.SCRIPT_ELEM);
+ }
+}
Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessageRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessageRendererBase.java?rev=1468656&r1=1468655&r2=1468656&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessageRendererBase.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessageRendererBase.java Tue Apr 16 22:49:45 2013
@@ -107,7 +107,7 @@ public abstract class HtmlMessageRendere
if (alwaysRenderSpan)
{
ResponseWriter writer = facesContext.getResponseWriter();
- writer.startElement(HTML.SPAN_ELEM, null);
+ writer.startElement(HTML.SPAN_ELEM, message);
writer.writeAttribute(HTML.ID_ATTR, clientId + "_msgFor", null);
HtmlRendererUtils.renderHTMLStringAttribute(writer, message, JSFAttr.STYLE_ATTR, HTML.STYLE_ATTR);
HtmlRendererUtils.renderHTMLStringAttribute(writer, message, JSFAttr.STYLE_CLASS_ATTR, HTML.CLASS_ATTR);
Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessagesRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessagesRendererBase.java?rev=1468656&r1=1468655&r2=1468656&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessagesRendererBase.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessagesRendererBase.java Tue Apr 16 22:49:45 2013
@@ -184,7 +184,7 @@ public abstract class HtmlMessagesRender
while(messagesIterator.hasNext())
{
- writer.startElement(org.apache.myfaces.shared.renderkit.html.HTML.LI_ELEM, messages);
+ writer.startElement(org.apache.myfaces.shared.renderkit.html.HTML.LI_ELEM, null); //messages);
FacesMessage facesMessage = (FacesMessage)messagesIterator.next();
// determine style and style class
@@ -237,8 +237,8 @@ public abstract class HtmlMessagesRender
while(messagesIterator.hasNext())
{
- writer.startElement(HTML.TR_ELEM, messages);
- writer.startElement(HTML.TD_ELEM, messages);
+ writer.startElement(HTML.TR_ELEM, null); // messages);
+ writer.startElement(HTML.TD_ELEM, null); // messages);
FacesMessage facesMessage = (FacesMessage)messagesIterator.next();
// determine style and style class
Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java?rev=1468656&r1=1468655&r2=1468656&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java Tue Apr 16 22:49:45 2013
@@ -112,7 +112,7 @@ public class HtmlRadioRendererBase
if (!pageDirectionLayout)
{
- writer.startElement(HTML.TR_ELEM, selectOne);
+ writer.startElement(HTML.TR_ELEM, null); // selectOne);
}
Converter converter;
@@ -190,10 +190,10 @@ public class HtmlRadioRendererBase
{
if (pageDirectionLayout)
{
- writer.startElement(HTML.TR_ELEM, selectOne);
+ writer.startElement(HTML.TR_ELEM, null); // selectOne);
}
- writer.startElement(HTML.TD_ELEM, selectOne);
+ writer.startElement(HTML.TD_ELEM, null); // selectOne);
if (selectItem.isEscape())
{
writer.writeText(selectItem.getLabel(),HTML.LABEL_ATTR);
@@ -207,16 +207,16 @@ public class HtmlRadioRendererBase
if (pageDirectionLayout)
{
writer.endElement(HTML.TR_ELEM);
- writer.startElement(HTML.TR_ELEM, selectOne);
+ writer.startElement(HTML.TR_ELEM, null); // selectOne);
}
- writer.startElement(HTML.TD_ELEM, selectOne);
+ writer.startElement(HTML.TD_ELEM, null); // selectOne);
- writer.startElement(HTML.TABLE_ELEM, selectOne);
+ writer.startElement(HTML.TABLE_ELEM, null); // selectOne);
writer.writeAttribute(HTML.BORDER_ATTR, "0", null);
if(!pageDirectionLayout)
{
- writer.startElement(HTML.TR_ELEM, selectOne);
+ writer.startElement(HTML.TR_ELEM, null); // selectOne);
}
SelectItemGroup group = (SelectItemGroup) selectItem;
@@ -265,9 +265,9 @@ public class HtmlRadioRendererBase
writer.write("\t\t");
if (pageDirectionLayout)
{
- writer.startElement(HTML.TR_ELEM, selectOne);
+ writer.startElement(HTML.TR_ELEM, null); // selectOne);
}
- writer.startElement(HTML.TD_ELEM, selectOne);
+ writer.startElement(HTML.TD_ELEM, null); // selectOne);
boolean itemDisabled = selectItem.isDisabled();
Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java?rev=1468656&r1=1468655&r2=1468656&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java Tue Apr 16 22:49:45 2013
@@ -548,7 +548,7 @@ public final class HtmlRendererUtils
SelectItem selectItem = (SelectItem) it.next();
if (selectItem instanceof SelectItemGroup)
{
- writer.startElement(HTML.OPTGROUP_ELEM, component);
+ writer.startElement(HTML.OPTGROUP_ELEM, null); // component);
writer.writeAttribute(HTML.LABEL_ATTR, selectItem.getLabel(),
null);
SelectItem[] selectItems = ((SelectItemGroup) selectItem)
@@ -581,7 +581,7 @@ public final class HtmlRendererUtils
}
writer.write(TABULATOR);
- writer.startElement(HTML.OPTION_ELEM, component);
+ writer.startElement(HTML.OPTION_ELEM, null); // component);
if (itemStrValue != null)
{
writer.writeAttribute(HTML.VALUE_ATTR, itemStrValue, null);
@@ -1118,7 +1118,7 @@ public final class HtmlRendererUtils
//only when useSubmittedValue==true, else use the real item value Objects
if (!isSelectOne)
{
- writer.startElement(HTML.LI_ELEM, component);
+ writer.startElement(HTML.LI_ELEM, null); // component);
}
writer.writeText(selectItem.getLabel(), null);
if (!isSelectOne)
@@ -1165,7 +1165,7 @@ public final class HtmlRendererUtils
.get(org.apache.myfaces.shared.renderkit.JSFAttr.CAPTION_STYLE_ATTR);
}
HtmlRendererUtils.writePrettyLineSeparator(context);
- writer.startElement(HTML.CAPTION_ELEM, component);
+ writer.startElement(HTML.CAPTION_ELEM, null); // component);
if (captionClass != null)
{
writer.writeAttribute(HTML.CLASS_ATTR, captionClass, null);
@@ -1399,7 +1399,7 @@ public final class HtmlRendererUtils
UIComponent component, String forClientId, String labelValue,
boolean disabled) throws IOException
{
- writer.startElement(HTML.LABEL_ELEM, component);
+ writer.startElement(HTML.LABEL_ELEM, null); // component);
writer.writeAttribute(HTML.FOR_ATTR, forClientId, null);
String labelClass = null;
if (disabled)
@@ -1430,7 +1430,7 @@ public final class HtmlRendererUtils
UIComponent component, String forClientId, SelectItem item,
boolean disabled) throws IOException
{
- writer.startElement(HTML.LABEL_ELEM, component);
+ writer.startElement(HTML.LABEL_ELEM, null); // component);
writer.writeAttribute(HTML.FOR_ATTR, forClientId, null);
String labelClass = null;
if (disabled)
@@ -1471,7 +1471,7 @@ public final class HtmlRendererUtils
UIComponent component, String forClientId, SelectItem item,
boolean disabled, boolean selected) throws IOException
{
- writer.startElement(HTML.LABEL_ELEM, component);
+ writer.startElement(HTML.LABEL_ELEM, null); // component);
writer.writeAttribute(HTML.FOR_ATTR, forClientId, null);
String labelClass = null;
if (disabled)
Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlResponseWriterImpl.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlResponseWriterImpl.java?rev=1468656&r1=1468655&r2=1468656&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlResponseWriterImpl.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlResponseWriterImpl.java Tue Apr 16 22:49:45 2013
@@ -21,12 +21,16 @@ package org.apache.myfaces.shared.render
import java.io.IOException;
import java.io.Writer;
import java.nio.charset.Charset;
+import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
+import javax.el.ValueExpression;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
+import javax.faces.render.Renderer;
import org.apache.myfaces.shared.renderkit.ContentTypeUtils;
import org.apache.myfaces.shared.renderkit.RendererUtils;
@@ -95,6 +99,8 @@ public class HtmlResponseWriterImpl
private Boolean _isTextArea;
private UIComponent _startElementUIComponent;
private boolean _startTagOpen;
+ private Map<String, Object> _passThroughAttributesMap;
+ private FacesContext _facesContext;
private boolean _cdataOpen;
@@ -296,6 +302,7 @@ public class HtmlResponseWriterImpl
public void endDocument() throws IOException
{
_currentWriter.flush();
+ _facesContext = null;
}
public void startElement(String name, UIComponent uiComponent) throws IOException
@@ -307,13 +314,39 @@ public class HtmlResponseWriterImpl
closeStartTagIfNecessary();
_currentWriter.write('<');
- _currentWriter.write(name);
resetStartedElement();
_startElementName = name;
_startElementUIComponent = uiComponent;
_startTagOpen = true;
+ _passThroughAttributesMap = (_startElementUIComponent != null) ?
+ _startElementUIComponent.getPassThroughAttributes(false) : null;
+
+ if (_passThroughAttributesMap != null)
+ {
+ Object value = _passThroughAttributesMap.get(
+ Renderer.PASSTHROUGH_RENDERER_LOCALNAME_KEY);
+ if (value != null)
+ {
+ if (value instanceof ValueExpression)
+ {
+ value = ((ValueExpression)value).getValue(
+ getFacesContext().getELContext());
+ }
+ String elementName = value.toString().trim();
+
+ _currentWriter.write((String) elementName);
+ }
+ else
+ {
+ _currentWriter.write(name);
+ }
+ }
+ else
+ {
+ _currentWriter.write(name);
+ }
// Each time we start a element, it is necessary to check <script> or <style>,
// because we need to buffer all content to post process it later when it reach its end
@@ -357,6 +390,25 @@ public class HtmlResponseWriterImpl
{
if (_startTagOpen)
{
+ if (_passThroughAttributesMap != null)
+ {
+ for (Map.Entry<String, Object> entry : _passThroughAttributesMap.entrySet())
+ {
+ String key = entry.getKey();
+ Object value = entry.getValue();
+ if (Renderer.PASSTHROUGH_RENDERER_LOCALNAME_KEY.equals(key))
+ {
+ // Special attribute stored in passthrough attribute map,
+ // skip rendering
+ continue;
+ }
+ if (value instanceof ValueExpression)
+ {
+ value = ((ValueExpression)value).getValue(getFacesContext().getELContext());
+ }
+ encodeAndWriteURIAttribute(key, value, key);
+ }
+ }
if (!_useStraightXml && isEmptyElement(_startElementName))
{
_currentWriter.write(" />");
@@ -429,6 +481,7 @@ public class HtmlResponseWriterImpl
{
_startElementName = null;
_startElementUIComponent = null;
+ _passThroughAttributesMap = null;
_isStyle = null;
_isTextArea = null;
}
@@ -720,6 +773,12 @@ public class HtmlResponseWriterImpl
throw new IllegalStateException("Must be called before the start element is closed (attribute '"
+ name + "')");
}
+ // From JSF 2.2 RenderKit javadoc: "... If there is a pass through attribute with the same
+ // name as a renderer specific attribute, the pass through attribute takes precedence. ..."
+ if (_passThroughAttributesMap != null && _passThroughAttributesMap.containsKey(name))
+ {
+ return;
+ }
if (value instanceof Boolean)
{
@@ -756,7 +815,18 @@ public class HtmlResponseWriterImpl
throw new IllegalStateException("Must be called before the start element is closed (attribute '"
+ name + "')");
}
-
+ // From JSF 2.2 RenderKit javadoc: "... If there is a pass through attribute with the same
+ // name as a renderer specific attribute, the pass through attribute takes precedence. ..."
+ if (_passThroughAttributesMap != null && _passThroughAttributesMap.containsKey(name))
+ {
+ return;
+ }
+
+ encodeAndWriteURIAttribute(name, value, componentPropertyName);
+ }
+
+ private void encodeAndWriteURIAttribute(String name, Object value, String componentPropertyName) throws IOException
+ {
String strValue = value.toString();
_currentWriter.write(' ');
_currentWriter.write(name);
@@ -974,6 +1044,7 @@ public class HtmlResponseWriterImpl
{
closeStartTagIfNecessary();
_currentWriter.close();
+ _facesContext = null;
}
public void write(char cbuf[], int off, int len) throws IOException
@@ -1070,4 +1141,13 @@ public class HtmlResponseWriterImpl
}
return _buffer;
}
+
+ protected FacesContext getFacesContext()
+ {
+ if (_facesContext == null)
+ {
+ _facesContext = FacesContext.getCurrentInstance();
+ }
+ return _facesContext;
+ }
}
Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlTableRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlTableRendererBase.java?rev=1468656&r1=1468655&r2=1468656&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlTableRendererBase.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlTableRendererBase.java Tue Apr 16 22:49:45 2013
@@ -376,10 +376,10 @@ public class HtmlTableRendererBase exten
if (rowCount == 0)
{
//nothing to render, to get valid xhtml we render an empty dummy row
- writer.startElement(HTML.TBODY_ELEM, uiData);
+ writer.startElement(HTML.TBODY_ELEM, null); // uiData);
writer.writeAttribute(HTML.ID_ATTR, component.getClientId(facesContext) + ":tbody_element", null);
- writer.startElement(HTML.TR_ELEM, uiData);
- writer.startElement(HTML.TD_ELEM, uiData);
+ writer.startElement(HTML.TR_ELEM, null); // uiData);
+ writer.startElement(HTML.TD_ELEM, null); // uiData);
writer.endElement(HTML.TD_ELEM);
writer.endElement(HTML.TR_ELEM);
writer.endElement(HTML.TBODY_ELEM);
@@ -470,7 +470,7 @@ public class HtmlTableRendererBase exten
writer.endElement(HTML.TBODY_ELEM);
}
HtmlRendererUtils.writePrettyLineSeparator(facesContext);
- writer.startElement(HTML.TBODY_ELEM, uiData);
+ writer.startElement(HTML.TBODY_ELEM, null); // uiData);
// Do not attach bodyrowsCount to the first TBODY element, because of backward compatibility
writer.writeAttribute(HTML.ID_ATTR, component.getClientId(facesContext) + ":tbody_element" +
(bodyrowsCount == 0 ? "" : bodyrowsCount), null);
@@ -571,7 +571,7 @@ public class HtmlTableRendererBase exten
writer.endElement(HTML.TBODY_ELEM);
}
HtmlRendererUtils.writePrettyLineSeparator(facesContext);
- writer.startElement(HTML.TBODY_ELEM, uiData);
+ writer.startElement(HTML.TBODY_ELEM, null); // uiData);
// Do not attach bodyrowsCount to the first TBODY element, because of backward compatibility
writer.writeAttribute(HTML.ID_ATTR, component.getClientId(facesContext) + ":tbody_element" +
(bodyrowsCount == 0 ? "" : bodyrowsCount), null);
@@ -622,10 +622,10 @@ public class HtmlTableRendererBase exten
if (!isRowRendered)
{
//nothing to render, to get valid xhtml we render an empty dummy row
- writer.startElement(HTML.TBODY_ELEM, uiData);
+ writer.startElement(HTML.TBODY_ELEM, null); // uiData);
writer.writeAttribute(HTML.ID_ATTR, component.getClientId(facesContext) + ":tbody_element", null);
- writer.startElement(HTML.TR_ELEM, uiData);
- writer.startElement(HTML.TD_ELEM, uiData);
+ writer.startElement(HTML.TR_ELEM, null); // uiData);
+ writer.startElement(HTML.TD_ELEM, null); // uiData);
writer.endElement(HTML.TD_ELEM);
writer.endElement(HTML.TR_ELEM);
writer.endElement(HTML.TBODY_ELEM);
@@ -674,12 +674,12 @@ public class HtmlTableRendererBase exten
if(rowHeader)
{
- writer.startElement(HTML.TH_ELEM, uiData);
+ writer.startElement(HTML.TH_ELEM, null); // uiData);
writer.writeAttribute(HTML.SCOPE_ATTR, HTML.SCOPE_ROW_VALUE, null);
}
else
{
- writer.startElement(HTML.TD_ELEM, uiData);
+ writer.startElement(HTML.TD_ELEM, null); // uiData);
}
if (styles.hasColumnStyle())
{
@@ -710,7 +710,7 @@ public class HtmlTableRendererBase exten
UIData uiData,
Styles styles, int rowStyleIndex) throws IOException
{
- writer.startElement(HTML.TR_ELEM, uiData);
+ writer.startElement(HTML.TR_ELEM, null); // uiData);
renderRowStyle(facesContext, writer, uiData, styles, rowStyleIndex);
@@ -958,7 +958,7 @@ public class HtmlTableRendererBase exten
HtmlRendererUtils.writePrettyLineSeparator(facesContext);
if (elemName != null)
{
- writer.startElement(elemName, component);
+ writer.startElement(elemName, null); // component);
}
if (header)
{
@@ -1104,8 +1104,8 @@ public class HtmlTableRendererBase exten
throws IOException
{
HtmlRendererUtils.writePrettyLineSeparator(facesContext);
- writer.startElement(HTML.TR_ELEM, component);
- writer.startElement(colElementName, component);
+ writer.startElement(HTML.TR_ELEM, null); // component);
+ writer.startElement(colElementName, null); // component);
if (colElementName.equals(determineHeaderCellTag(facesContext, component)) && isHeader)
{
writer.writeAttribute(HTML.SCOPE_ATTR, HTML.SCOPE_COLGROUP_VALUE, null);
@@ -1144,7 +1144,7 @@ public class HtmlTableRendererBase exten
{
HtmlRendererUtils.writePrettyLineSeparator(facesContext);
- writer.startElement(HTML.TR_ELEM, component);
+ writer.startElement(HTML.TR_ELEM, null); // component);
int columnIndex = 0;
int newspaperColumns = getNewspaperColumns(component);
for(int nc = 0; nc < newspaperColumns; nc++)
@@ -1193,7 +1193,7 @@ public class HtmlTableRendererBase exten
return;
}
- writer.startElement(HTML.TD_ELEM, component);
+ writer.startElement(HTML.TD_ELEM, null); // component);
//RendererUtils.renderChild(facesContext, spacer);
spacer.encodeAll(facesContext);
writer.endElement(HTML.TD_ELEM);
@@ -1289,7 +1289,7 @@ public class HtmlTableRendererBase exten
protected void renderColumnHeaderCell(FacesContext facesContext, ResponseWriter writer, UIComponent uiComponent,
UIComponent facet, String headerStyleClass, int colspan) throws IOException
{
- writer.startElement(determineHeaderCellTag(facesContext, uiComponent.getParent()), uiComponent);
+ writer.startElement(determineHeaderCellTag(facesContext, uiComponent.getParent()), null); // uiComponent);
if (colspan > 1)
{
writer.writeAttribute(HTML.COLSPAN_ATTR, new Integer(colspan), null);
@@ -1344,7 +1344,7 @@ public class HtmlTableRendererBase exten
protected void renderColumnFooterCell(FacesContext facesContext, ResponseWriter writer, UIComponent uiComponent,
UIComponent facet, String footerStyleClass, int colspan) throws IOException
{
- writer.startElement(HTML.TD_ELEM, uiComponent);
+ writer.startElement(HTML.TD_ELEM, null); // uiComponent);
if (colspan > 1)
{
writer.writeAttribute(HTML.COLSPAN_ATTR, new Integer(colspan), null);
Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlTextRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlTextRendererBase.java?rev=1468656&r1=1468655&r2=1468656&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlTextRendererBase.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlTextRendererBase.java Tue Apr 16 22:49:45 2013
@@ -194,11 +194,7 @@ public class HtmlTextRendererBase
ResponseWriter writer = facesContext.getResponseWriter();
String clientId = component.getClientId(facesContext);
- String value = org.apache.myfaces.shared.renderkit.RendererUtils.getStringValue(facesContext, component);
- if (log.isLoggable(Level.FINE))
- {
- log.fine("renderInput '" + value + "'");
- }
+
writer.startElement(HTML.INPUT_ELEM, component);
writer.writeAttribute(HTML.ID_ATTR, clientId, null);
writer.writeAttribute(HTML.NAME_ATTR, clientId, null);
@@ -206,11 +202,8 @@ public class HtmlTextRendererBase
//allow extending classes to modify html input element's type
String inputHtmlType = getInputHtmlType(component);
writer.writeAttribute(HTML.TYPE_ATTR, inputHtmlType, null);
-
- if (value != null)
- {
- writer.writeAttribute(HTML.VALUE_ATTR, value, JSFAttr.VALUE_ATTR);
- }
+
+ renderValue(facesContext, component, writer);
Map<String, List<ClientBehavior>> behaviors = null;
if (component instanceof ClientBehaviorHolder && JavascriptUtils.isJavascriptAllowed(
@@ -285,7 +278,22 @@ public class HtmlTextRendererBase
writer.writeAttribute(HTML.AUTOCOMPLETE_ATTR, AUTOCOMPLETE_VALUE_OFF, HTML.AUTOCOMPLETE_ATTR);
}
}
-
+
+ protected void renderValue(FacesContext facesContext, UIComponent component, ResponseWriter writer)
+ throws IOException
+ {
+ String value = RendererUtils.getStringValue(facesContext, component);
+ if (log.isLoggable(Level.FINE))
+ {
+ log.fine("renderInput '" + value + "'");
+ }
+
+ if (value != null)
+ {
+ writer.writeAttribute(HTML.VALUE_ATTR, value, JSFAttr.VALUE_ATTR);
+ }
+ }
+
protected void renderInputEnd(FacesContext facesContext, UIComponent component) throws IOException
{
ResponseWriter writer = facesContext.getResponseWriter();