You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ba...@apache.org on 2006/01/24 01:31:33 UTC

svn commit: r371739 - in /myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html: HtmlResponseWriterImpl.java util/AddResource.java

Author: baranda
Date: Mon Jan 23 16:31:27 2006
New Revision: 371739

URL: http://svn.apache.org/viewcvs?rev=371739&view=rev
Log:
Removed functionality from ResponseWriterImpl.endCode() that provoked MYFACES-152 and MYFACES-883. Now it is possible to use the f:view tag before the body tag. The myfaces javascript code is created in the viewTag.doEndTag() method but it is not inserted in the response till the ExtensionsFilter does the post-parsing.

Modified:
    myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/HtmlResponseWriterImpl.java
    myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/util/AddResource.java

Modified: myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/HtmlResponseWriterImpl.java
URL: http://svn.apache.org/viewcvs/myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/HtmlResponseWriterImpl.java?rev=371739&r1=371738&r2=371739&view=diff
==============================================================================
--- myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/HtmlResponseWriterImpl.java (original)
+++ myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/HtmlResponseWriterImpl.java Mon Jan 23 16:31:27 2006
@@ -15,19 +15,16 @@
  */
 package org.apache.myfaces.renderkit.html;
 
-import org.apache.myfaces.config.MyfacesConfig;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.renderkit.RendererUtils;
 import org.apache.myfaces.renderkit.html.util.DummyFormResponseWriter;
 import org.apache.myfaces.renderkit.html.util.DummyFormUtils;
 import org.apache.myfaces.renderkit.html.util.HTMLEncoder;
-import org.apache.myfaces.renderkit.html.util.JavascriptUtils;
 import org.apache.myfaces.renderkit.html.util.UnicodeEncoder;
-import org.apache.myfaces.renderkit.RendererUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 
 import javax.faces.FacesException;
 import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
@@ -153,34 +150,6 @@
 
     public void endDocument() throws IOException
     {
-        flush();
-        if (_writeDummyForm)
-        {
-            DummyFormUtils.writeDummyForm(this, _dummyFormParams);
-        }
-
-        FacesContext facesContext = FacesContext.getCurrentInstance();
-        MyfacesConfig myfacesConfig = MyfacesConfig.getCurrentInstance(facesContext.getExternalContext());
-        if (myfacesConfig.isDetectJavascript())
-        {
-            if (! JavascriptUtils.isJavascriptDetected(facesContext.getExternalContext()))
-            {
-
-                startElement(HTML.SCRIPT_ELEM,null);
-                writeAttribute(HTML.SCRIPT_TYPE_ATTR,HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT,null);
-                StringBuffer script = new StringBuffer();
-                script.append("document.location.replace('").
-                        append(facesContext.getApplication().getViewHandler().getResourceURL(facesContext, "/_javascriptDetector_")).append("?goto=").append(facesContext.getApplication().getViewHandler().getActionURL(facesContext, facesContext.getViewRoot().getViewId())).append("');");
-                writeText(script.toString(),null);
-                endElement(HTML.SCRIPT_ELEM);
-            }
-        }
-
-        if (myfacesConfig.isAutoScroll())
-        {
-            JavascriptUtils.renderAutoScrollFunction(facesContext, this);
-        }
-
         _writer.flush();
     }
 

Modified: myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/util/AddResource.java
URL: http://svn.apache.org/viewcvs/myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/util/AddResource.java?rev=371739&r1=371738&r2=371739&view=diff
==============================================================================
--- myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/util/AddResource.java (original)
+++ myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/util/AddResource.java Mon Jan 23 16:31:27 2006
@@ -15,13 +15,6 @@
  */
 package org.apache.myfaces.renderkit.html.util;
 
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Set;
-
 import org.apache.commons.lang.builder.EqualsBuilder;
 import org.apache.commons.lang.builder.HashCodeBuilder;
 import org.apache.commons.logging.Log;
@@ -36,6 +29,8 @@
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
 
 /**
  * This is a utility class to render link to resources used by custom components.
@@ -101,6 +96,14 @@
     public static final Position BODY_END = new Position(1);
     public static final Position BODY_ONLOAD = new Position(2);
 
+    private StringBuffer originalResponse;
+    private boolean parserCalled = false;
+    private int headerInsertPosition = -1;
+    private int bodyInsertPosition = -1;
+    private int beforeBodyPosition = -1;
+    private int afterBodyContentInsertPosition = -1;
+    private int beforeBodyEndPosition = -1;
+
     private AddResource(String contextPath)
     {
         _contextPath = contextPath;
@@ -671,25 +674,61 @@
     }
 
     /**
-     * Add the resources to the <head> of the page.
-     * If the head tag is missing, but the <body> tag is present, the head tag is added.
-     * If both are missing, no resource is added.
-     *
-     * The ordering is such that the user header CSS & JS override the MyFaces' ones.
+     * Parses the response to mark the positions where code will be inserted
      */
-    public void writeWithFullHeader(HttpServletRequest request, String bufferedResponse,
+    public void parseResponse(HttpServletRequest request, String bufferedResponse,
             HttpServletResponse response) throws IOException
     {
 
-        StringBuffer originalResponse = new StringBuffer(bufferedResponse);
+        originalResponse = new StringBuffer(bufferedResponse);
 
         ParseCallbackListener l = new ParseCallbackListener();
         ReducedHTMLParser.parse(originalResponse, l);
 
-        int headerInsertPosition = l.getHeaderInsertPosition();
-        int bodyInsertPosition = l.getBodyInsertPosition();
-        int beforeBodyPosition = l.getBeforeBodyPosition();
-        int afterBodyContentInsertPosition = l.getAfterBodyContentInsertPosition();
+        headerInsertPosition = l.getHeaderInsertPosition();
+        bodyInsertPosition = l.getBodyInsertPosition();
+        beforeBodyPosition = l.getBeforeBodyPosition();
+        afterBodyContentInsertPosition = l.getAfterBodyContentInsertPosition();
+        beforeBodyEndPosition = l.getAfterBodyEndPosition()-7;  // 7, which is the length of </body>
+
+        parserCalled = true;
+    }
+
+    /**
+     * Writes the javascript code necessary for myfaces in every page, just befode the closing &lt;/body&gt; tag
+     */
+    public void writeMyFacesJavascriptBeforeBodyEnd(HttpServletRequest request,
+            HttpServletResponse response) throws IOException
+    {
+         if (!parserCalled)
+         {
+            throw new IOException("Method parseResponse has to be called first");
+         }
+
+        ResponseWriter writer = new HtmlResponseWriterImpl(response.getWriter(), HtmlRendererUtils
+                .selectContentType(request.getHeader("accept")), null);
+
+        if (beforeBodyEndPosition >= 0)
+        {
+            String myFacesJavascript = (String) request.getAttribute("org.apache.myfaces.myFacesJavascript");
+            originalResponse.insert(beforeBodyEndPosition, myFacesJavascript);
+        }
+    }
+
+    /**
+     * Add the resources to the &lt;head&gt; of the page.
+     * If the head tag is missing, but the &lt;body&gt; tag is present, the head tag is added.
+     * If both are missing, no resource is added.
+     *
+     * The ordering is such that the user header CSS & JS override the MyFaces' ones.
+     */
+    public void writeWithFullHeader(HttpServletRequest request,
+            HttpServletResponse response) throws IOException
+    {
+        if (!parserCalled)
+        {
+            throw new IOException("Method parseResponse has to be called first");
+        }
 
         boolean addHeaderTags = false;
 
@@ -787,6 +826,16 @@
 
         }
 
+    }
+
+    /**
+     * Writes the response
+     */
+    public void writeResponse(HttpServletRequest request,
+            HttpServletResponse response) throws IOException
+    {
+        ResponseWriter writer = new HtmlResponseWriterImpl(response.getWriter(), HtmlRendererUtils
+                .selectContentType(request.getHeader("accept")), null);
         writer.write(originalResponse.toString());
     }
 
@@ -1068,6 +1117,7 @@
         private int bodyInsertPosition = -1;
         private int beforeBodyPosition = -1;
         private int afterBodyContentInsertPosition = -1;
+        private int afterBodyEndPosition = -1;
 
         public void openedStartTag(int charIndex, int tagIdentifier)
         {
@@ -1099,6 +1149,10 @@
 
         public void closedEndTag(int charIndex, int tagIdentifier)
         {
+            if (tagIdentifier == ReducedHTMLParser.BODY_TAG)
+            {
+                afterBodyEndPosition = charIndex;
+            }
         }
 
         public void attribute(int charIndex, int tagIdentifier, String key, String value)
@@ -1123,6 +1177,10 @@
         public int getAfterBodyContentInsertPosition()
         {
             return afterBodyContentInsertPosition;
+        }
+
+        public int getAfterBodyEndPosition() {
+            return afterBodyEndPosition;
         }
     }
 }