1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.primefaces.extensions.application;
23
24 import java.util.Arrays;
25 import java.util.List;
26
27 import javax.faces.application.ProjectStage;
28 import javax.faces.component.UIOutput;
29 import javax.faces.component.UIViewRoot;
30 import javax.faces.context.FacesContext;
31 import javax.faces.event.AbortProcessingException;
32 import javax.faces.event.SystemEvent;
33 import javax.faces.event.SystemEventListener;
34 import javax.faces.lifecycle.ClientWindow;
35 import javax.servlet.http.Cookie;
36 import javax.servlet.http.HttpServletResponse;
37
38 import org.primefaces.clientwindow.PrimeClientWindow;
39 import org.primefaces.clientwindow.PrimeClientWindowUtils;
40 import org.primefaces.config.PrimeConfiguration;
41 import org.primefaces.config.PrimeEnvironment;
42 import org.primefaces.context.PrimeApplicationContext;
43 import org.primefaces.context.PrimeRequestContext;
44 import org.primefaces.util.LocaleUtils;
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 public class PrimeFacesScriptProcessor implements SystemEventListener {
67
68 @Override
69 public boolean isListenerForSource(final Object source) {
70 return source instanceof UIViewRoot;
71 }
72
73 @Override
74 public void processEvent(final SystemEvent event) throws AbortProcessingException {
75
76
77 boolean shouldDiscard = Arrays.stream(Thread.currentThread().getStackTrace())
78 .anyMatch(element -> "org.apache.myfaces.lifecycle.RestoreViewExecutor".equals(element.getClassName()));
79 if (shouldDiscard) {
80
81 return;
82 }
83
84 final FacesContext context = event.getFacesContext();
85 final StringBuilder script = new StringBuilder(4000);
86
87 encodeSettingScripts(context, script);
88 encodeInitScripts(context, script);
89
90 addJS(context, script.toString());
91 }
92
93 protected void encodeSettingScripts(final FacesContext context, final StringBuilder writer) {
94 final PrimeRequestContext requestContext = PrimeRequestContext.getCurrentInstance(context);
95 final PrimeApplicationContext applicationContext = requestContext.getApplicationContext();
96 final PrimeConfiguration configuration = applicationContext.getConfig();
97
98 final ProjectStage projectStage = context.getApplication().getProjectStage();
99
100 writer.append("if(window.PrimeFaces){");
101
102 writer.append("PrimeFaces.settings.locale='").append(LocaleUtils.getCurrentLocale(context)).append("';");
103 writer.append("PrimeFaces.settings.viewId='").append(context.getViewRoot().getViewId()).append("';");
104 writer.append("PrimeFaces.settings.contextPath='").append(context.getExternalContext().getRequestContextPath())
105 .append("';");
106
107 writer.append("PrimeFaces.settings.cookiesSecure=")
108 .append(requestContext.isSecure() && configuration.isCookiesSecure()).append(";");
109 if (applicationContext.getConfig().getCookiesSameSite() != null) {
110 writer.append("PrimeFaces.settings.cookiesSameSite='").append(configuration.getCookiesSameSite())
111 .append("';");
112 }
113
114 if (configuration.isClientSideValidationEnabled()) {
115 writer.append("PrimeFaces.settings.validateEmptyFields=").append(configuration.isValidateEmptyFields())
116 .append(";");
117 writer.append("PrimeFaces.settings.considerEmptyStringNull=")
118 .append(configuration.isInterpretEmptyStringAsNull()).append(";");
119 }
120
121 if (configuration.isLegacyWidgetNamespace()) {
122 writer.append("PrimeFaces.settings.legacyWidgetNamespace=true;");
123 }
124
125 if (configuration.isEarlyPostParamEvaluation()) {
126 writer.append("PrimeFaces.settings.earlyPostParamEvaluation=true;");
127 }
128
129 if (configuration.isPartialSubmitEnabled()) {
130 writer.append("PrimeFaces.settings.partialSubmit=true;");
131 }
132
133 if (projectStage != ProjectStage.Production) {
134 writer.append("PrimeFaces.settings.projectStage='").append(projectStage.toString()).append("';");
135 }
136
137 if (context.getExternalContext().getClientWindow() != null) {
138
139 final ClientWindow clientWindow = context.getExternalContext().getClientWindow();
140 if (clientWindow instanceof PrimeClientWindow) {
141
142 boolean initialRedirect = false;
143
144 final Object cookie = PrimeClientWindowUtils.getInitialRedirectCookie(context, clientWindow.getId());
145 if (cookie instanceof Cookie) {
146 final Cookie servletCookie = (Cookie) cookie;
147 initialRedirect = true;
148
149
150 servletCookie.setMaxAge(0);
151 ((HttpServletResponse) context.getExternalContext().getResponse()).addCookie(servletCookie);
152 }
153 writer.append(
154 String.format("PrimeFaces.clientwindow.init('%s', %s);",
155 PrimeClientWindowUtils.secureWindowId(clientWindow.getId()),
156 initialRedirect));
157 }
158 }
159
160 writer.append("}");
161 }
162
163 protected void encodeInitScripts(final FacesContext context, final StringBuilder writer) {
164 final PrimeRequestContext requestContext = PrimeRequestContext.getCurrentInstance(context);
165 final List<String> scripts = requestContext.getInitScriptsToExecute();
166
167 if (!scripts.isEmpty()) {
168 final boolean moveScriptsToBottom = requestContext.getApplicationContext().getConfig()
169 .isMoveScriptsToBottom();
170
171 if (!moveScriptsToBottom) {
172 writer.append("$(function(){");
173 }
174
175 for (final String script : scripts) {
176 writer.append(script);
177 writer.append(';');
178 }
179
180 if (!moveScriptsToBottom) {
181 writer.append("});");
182 }
183 }
184 }
185
186 private void addJS(final FacesContext context, final String script) {
187 final UIOutput js = new UIOutput();
188 js.setRendererType("javax.faces.resource.Script");
189
190
191
192 final PrimeEnvironment environment = PrimeApplicationContext.getCurrentInstance(context).getEnvironment();
193 if (!environment.isMojarra()) {
194 js.setId("primfaces-script-processor");
195 }
196 final UIOutput content = new UIOutput();
197 content.setValue(script);
198 js.getChildren().add(content);
199 context.getViewRoot().addComponentResource(context, js);
200 }
201 }