1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.custom.document;
20
21 import java.io.IOException;
22 import java.util.List;
23 import java.util.Map;
24
25 import javax.faces.component.UIComponent;
26 import javax.faces.component.UIViewRoot;
27 import javax.faces.component.behavior.ClientBehavior;
28 import javax.faces.component.behavior.ClientBehaviorHolder;
29 import javax.faces.context.FacesContext;
30 import javax.faces.context.ResponseWriter;
31
32 import org.apache.myfaces.renderkit.html.util.AddResource;
33 import org.apache.myfaces.renderkit.html.util.AddResourceFactory;
34 import org.apache.myfaces.renderkit.html.util.ExtensionsPhaseListener;
35 import org.apache.myfaces.shared_tomahawk.renderkit.html.util.JavascriptUtils;
36 import org.apache.myfaces.shared_tomahawk.renderkit.html.util.ResourceUtils;
37 import org.apache.myfaces.shared_tomahawk.renderkit.ClientBehaviorEvents;
38 import org.apache.myfaces.shared_tomahawk.renderkit.html.HTML;
39 import org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRendererUtils;
40 import org.apache.myfaces.tomahawk.util.TomahawkResourceUtils;
41
42
43
44
45
46
47
48
49
50
51
52
53
54 public class DocumentBodyRenderer extends AbstractDocumentRenderer
55 {
56 public static final String RENDERER_TYPE = "org.apache.myfaces.DocumentBody";
57 private String BODY_ELEM = "body";
58 private String[] ATTRS = new String[] {"onload", "onunload", "onresize", "onkeypress", "style", "styleClass", "id"};
59
60 private final String ONRESIZE = "onresize";
61 private final String RESIZE = "resize";
62
63 protected String getHtmlTag()
64 {
65 return BODY_ELEM;
66 }
67
68 protected Class getDocumentClass()
69 {
70 return DocumentBody.class;
71 }
72
73 protected void openTag(FacesContext facesContext, ResponseWriter writer, UIComponent uiComponent)
74 throws IOException
75 {
76
77
78 Map<String, List<ClientBehavior>> behaviors = null;
79 if (uiComponent instanceof ClientBehaviorHolder && JavascriptUtils.isJavascriptAllowed(facesContext.getExternalContext()))
80 {
81 behaviors = ((ClientBehaviorHolder) uiComponent).getClientBehaviors();
82 if (!behaviors.isEmpty())
83 {
84 ResourceUtils.renderDefaultJsfJsInlineIfNecessary(facesContext, writer);
85 }
86 super.openTag(facesContext, writer, uiComponent);
87
88 if (behaviors.isEmpty())
89 {
90 HtmlRendererUtils.writeIdIfNecessary(writer, uiComponent, facesContext);
91 }
92 else
93 {
94 writer.writeAttribute(HTML.ID_ATTR, uiComponent.getClientId(facesContext), null);
95 }
96
97 HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, uiComponent, behaviors);
98 HtmlRendererUtils.renderBehaviorizedAttribute(facesContext, writer, HTML.ONLOAD_ATTR, uiComponent,
99 ClientBehaviorEvents.LOAD, behaviors, HTML.ONLOAD_ATTR);
100 HtmlRendererUtils.renderBehaviorizedAttribute(facesContext, writer, HTML.ONUNLOAD_ATTR, uiComponent,
101 ClientBehaviorEvents.UNLOAD, behaviors, HTML.ONUNLOAD_ATTR);
102 HtmlRendererUtils.renderBehaviorizedAttribute(facesContext, writer, ONRESIZE, uiComponent,
103 RESIZE, behaviors, ONRESIZE);
104
105 HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
106 HTML.BODY_PASSTHROUGH_ATTRIBUTES_WITHOUT_EVENTS);
107 }
108 else
109 {
110 super.openTag(facesContext, writer, uiComponent);
111 HtmlRendererUtils.writeIdIfNecessary(writer, uiComponent, facesContext);
112 HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
113 HTML.BODY_PASSTHROUGH_ATTRIBUTES);
114 HtmlRendererUtils.renderHTMLAttribute(writer, uiComponent, ONRESIZE, ONRESIZE);
115 }
116 }
117
118 protected void writeBeforeEnd(FacesContext facesContext) throws IOException
119 {
120 super.writeBeforeEnd(facesContext);
121
122 AddResource addResource = AddResourceFactory.getInstance(facesContext);
123 if (!addResource.requiresBuffer())
124 {
125
126
127
128 ExtensionsPhaseListener.writeCodeBeforeBodyEnd(facesContext);
129
130
131 facesContext.getExternalContext().getRequestMap().put(ExtensionsPhaseListener.ORG_APACHE_MYFACES_MY_FACES_JAVASCRIPT, "");
132 }
133
134 UIViewRoot root = facesContext.getViewRoot();
135 for (UIComponent child : root.getComponentResources(facesContext,
136 TomahawkResourceUtils.BODY_LOCATION))
137 {
138 child.encodeAll(facesContext);
139 }
140 }
141 }