[
https://issues.apache.org/jira/browse/MYFACES-3659?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13536245#comment-13536245
]
Leonardo Uribe commented on MYFACES-3659:
-----------------------------------------
I agree the relevant point to modify is ComponentTagHandlerDelegate. I think
the idea is change line 229:
mctx.markForDeletion(c);
With something like this:
if (_relocatableResourceHandler == null)
{
mctx.markForDeletion(c);
}
else
{
mctx.markRelocatableResourceForDeletion(c);
}
and add the necessary methods in FaceletCompositionContext to deal with this
special case.
I would prefer to let renderTarget code as is, if it does not help. After all,
if it doesn't work for javascript, there is no incentive to do it.
The algorithm in javax.faces.component._DeltaStateHelper keeps track of the
changes. It is a complex algorithm, highly optimized and widely tested. When an
attribute is removed, it keeps track of the removal in the delta using a null
value, when the removal is done after markInitialState is called. This null
value requires to save not only the value, but all the route until
UIComponentBase, so a the end you have some additional arrays and so on. Since
h:outputScript and h:outputStylesheet are very common, those additional bytes
will be added to the state, but that's not really necessary in this case,
because the attribute is "transient", so it is better to use
TransientStateHelper or FacesContext attribute map.
> Conditional include of scripts and stylesheets
> -----------------------------------------------
>
> Key: MYFACES-3659
> URL: https://issues.apache.org/jira/browse/MYFACES-3659
> Project: MyFaces Core
> Issue Type: Bug
> Affects Versions: 2.1.6
> Environment: MyFaces 2.1.6, Tomahawk20 1.1.11
> Reporter: dennis hoersch
> Attachments: patch-MYFACES-3659.diff, patch-MYFACES-3659.zip
>
>
> I am inserting a script 'X.js' dependent on a condition (c:if). The default
> case is to include it. If I change the underlying value within an action so
> that the condition evaluates to false, the script is still included. Also
> after any other following action.
> Using F5 in Firefox the page is now rendered without the script.
> The script 'X.js' was added to the view root and is never 'forgot' or
> removed. It is the same if the script is included in a composite component.
> In that case I even observed that the order of the scripts changes and the
> script 'X.js' is included before other basic scripts like jQuery on which
> 'X.js' depends.
> ----
> <h:form id="form">
> <c:set var="sessionScope"
> value="#{facesContext.externalContext.sessionMap}" />
>
> <h:commandButton value="deactivate"
> rendered="#{empty sessionScope.__isActive_ or
> sessionScope.__isActive_}">
> <f:setPropertyActionListener target="#{sessionScope.__isActive_}"
> value="#{false}" />
> </h:commandButton>
> <h:commandButton value="activate"
> rendered="#{not empty sessionScope.__isActive_ and not
> sessionScope.__isActive_}">
> <f:setPropertyActionListener target="#{sessionScope.__isActive_}"
> value="#{true}" />
> </h:commandButton>
>
> <h:commandButton value="do nothing" />
>
> <h:outputScript library="js" name="jQuery.js" target="body" />
>
> <c:if test="#{empty sessionScope.__isActive_ or sessionScope.__isActive_}">
> BLA
> <h:outputScript library="js" name="X.js" target="body" />
> </c:if>
> </h:form>
> ----
> Am I doing something wrong? Is there another (or better) way to include
> scripts conditionally?
> (
> If I change 'HtmlOutputScriptHandler' to set the script transient, it works
> in the first glance, but I don't know the impact...
> @Override
> public void onComponentPopulated(FaceletContext ctx, UIComponent c,
> UIComponent parent) {
> super.onComponentPopulated(ctx, c, parent);
> c.setTransient(true);
> }
> )
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira