in tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/PageRenderer.java [98:255]
public void encodeBeginInternal(final FacesContext facesContext, final T component) throws IOException {
final TobagoConfig tobagoConfig = TobagoConfig.getInstance(facesContext);
final TobagoContext tobagoContext = TobagoContext.getInstance(facesContext);
if (tobagoContext.getFocusId() == null && !StringUtils.isBlank(component.getFocusId())) {
tobagoContext.setFocusId(component.getFocusId());
}
final TobagoResponseWriter writer = getResponseWriter(facesContext);
// reset responseWriter and render page
facesContext.setResponseWriter(writer);
if (tobagoConfig.isPreventFrameAttacks()) {
ResponseUtils.ensureXFrameOptionsHeader(facesContext);
}
ResponseUtils.ensureNoCacheHeader(facesContext);
ResponseUtils.ensureContentSecurityPolicyHeader(facesContext, tobagoConfig.getContentSecurityPolicy());
if (LOG.isDebugEnabled()) {
for (final Object o : component.getAttributes().entrySet()) {
final Map.Entry entry = (Map.Entry) o;
LOG.debug("*** '" + entry.getKey() + "' -> '" + entry.getValue() + "'");
}
}
final ExternalContext externalContext = facesContext.getExternalContext();
final String contextPath = externalContext.getRequestContextPath();
final Object request = externalContext.getRequest();
final Object response = externalContext.getResponse();
final Application application = facesContext.getApplication();
final ViewHandler viewHandler = application.getViewHandler();
final UIViewRoot viewRoot = facesContext.getViewRoot();
final String viewId = viewRoot.getViewId();
final String formAction = externalContext.encodeActionURL(viewHandler.getActionURL(facesContext, viewId));
final PartialViewContext partialViewContext = facesContext.getPartialViewContext();
final String contentType = writer.getContentTypeWithCharSet();
ResponseUtils.ensureContentTypeHeader(facesContext, contentType);
if (tobagoConfig.isSetNosniffHeader()) {
ResponseUtils.ensureNosniffHeader(facesContext);
}
final String clientId = component.getClientId(facesContext);
final Markup markup = component.getMarkup();
final TobagoClass spread = markup != null && markup.contains(Markup.SPREAD) ? TobagoClass.SPREAD : null;
final Locale locale = viewRoot.getLocale();
if (!partialViewContext.isAjaxRequest() || partialViewContext.isRenderAll()) {
writer.startElement(HtmlElements.HTML);
if (locale != null) {
final String language = locale.getLanguage();
if (language != null) {
writer.writeAttribute(HtmlAttributes.LANG, language, false);
}
}
writer.writeClassAttribute(spread);
encodeHead(facesContext, component, tobagoContext, writer, viewRoot, contextPath);
writer.startElement(HtmlElements.BODY);
writer.writeClassAttribute(spread);
}
writer.startElement(HtmlElements.TOBAGO_PAGE);
writer.writeAttribute(CustomAttributes.LOCALE, locale.toString(), false);
writer.writeClassAttribute(
BootstrapClass.CONTAINER_FLUID,
spread,
component.getCustomClass());
writer.writeIdAttribute(clientId);
HtmlRendererUtils.writeDataAttributes(facesContext, writer, component);
// write the config
writer.writeAttribute(HtmlAttributes.FOCUS_ON_ERROR, Boolean.toString(tobagoContext.getFocusOnError()), false);
writer.writeAttribute(HtmlAttributes.WAIT_OVERLAY_DELAY_FULL, tobagoContext.getWaitOverlayDelayFull());
writer.writeAttribute(HtmlAttributes.WAIT_OVERLAY_DELAY_AJAX, tobagoContext.getWaitOverlayDelayAjax());
encodeBehavior(writer, facesContext, component);
writer.startElement(HtmlElements.FORM);
writer.writeClassAttribute(spread);
writer.writeAttribute(HtmlAttributes.ACTION, formAction, true);
writer.writeIdAttribute(component.getFormId(facesContext));
writer.writeAttribute(HtmlAttributes.METHOD, getMethod(component), false);
final String enctype = tobagoContext.getEnctype();
if (enctype != null) {
writer.writeAttribute(HtmlAttributes.ENCTYPE, enctype, false);
}
// TODO: enable configuration of 'accept-charset'
writer.writeAttribute(HtmlAttributes.ACCEPT_CHARSET, AbstractUIPage.FORM_ACCEPT_CHARSET.name(), false);
// TODO evaluate 'accept' attribute usage
//writer.writeAttribute(HtmlAttributes.ACCEPT, );
writer.writeAttribute(DataAttributes.CONTEXT_PATH, contextPath, true);
writer.startElement(HtmlElements.INPUT);
writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.HIDDEN);
writer.writeNameAttribute(ClientBehaviorContext.BEHAVIOR_SOURCE_PARAM_NAME);
writer.writeIdAttribute(ClientBehaviorContext.BEHAVIOR_SOURCE_PARAM_NAME);
writer.writeAttribute(HtmlAttributes.DISABLED, true);
writer.endElement(HtmlElements.INPUT);
final String lastFocusId = clientId + ComponentUtils.SUB_SEPARATOR + "lastFocusId";
writer.startElement(HtmlElements.TOBAGO_FOCUS);
writer.writeIdAttribute(lastFocusId);
writer.startElement(HtmlElements.INPUT);
writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.HIDDEN);
writer.writeNameAttribute(lastFocusId);
writer.writeIdAttribute(lastFocusId + ComponentUtils.SUB_SEPARATOR + "field");
writer.writeAttribute(HtmlAttributes.VALUE, tobagoContext.getFocusId(), true);
writer.endElement(HtmlElements.INPUT);
writer.endElement(HtmlElements.TOBAGO_FOCUS);
if (tobagoConfig.isCheckSessionSecret()) {
final Secret secret = Secret.getInstance(facesContext);
if (secret != null) {
writer.startElement(HtmlElements.INPUT);
writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.HIDDEN);
writer.writeAttribute(HtmlAttributes.NAME, Secret.KEY, false);
writer.writeAttribute(HtmlAttributes.ID, Secret.KEY, false);
writer.writeAttribute(HtmlAttributes.VALUE, secret.getSecret(), false);
writer.endElement(HtmlElements.INPUT);
} else {
LOG.warn("Missing session secret!");
}
}
// placeholder for menus
writer.startElement(HtmlElements.DIV);
writer.writeClassAttribute(TobagoClass.PAGE__MENU_STORE);
writer.endElement(HtmlElements.DIV);
writer.startElement(HtmlElements.DIV);
writer.writeClassAttribute(TobagoClass.PAGE__POPOVER_STORE);
writer.endElement(HtmlElements.DIV);
// placeholder for toasts
writer.startElement(HtmlElements.DIV);
writer.writeClassAttribute(TobagoClass.PAGE__TOAST_STORE);
writer.endElement(HtmlElements.DIV);
writer.startElement(HtmlElements.SPAN);
writer.writeIdAttribute(clientId + ComponentUtils.SUB_SEPARATOR + "faces-state-container");
writer.flush();
if (!partialViewContext.isAjaxRequest() || partialViewContext.isRenderAll()) {
viewHandler.writeState(facesContext);
}
writer.endElement(HtmlElements.SPAN);
if (component.getFacet("backButtonDetector") != null) {
final UIComponent hidden = component.getFacet("backButtonDetector");
hidden.encodeAll(facesContext);
}
}