I was moving some parts of a Seaside app to be stateless, and session
independent, so I created a restful handler that directly renders the
output using a WABuilder, in this way:
| component |
component := GwApplicationLayout new.
component bodyComponent: (GwApplicationHomeComponent new)
^ WAHtmlCanvas builder
rootBlock: [ :root | component updateRoot: root ];
render: [ :html | html render: component ]
There I add a ContainerDecoration that I use depending on whether the
body component is embedded or not. But for some reason such decoration
was not being visited during the rendering (and it was rendered when
within a regular WAApplication).
So I noticed that the WARenderingContext used for the WABuilder in the
above method is set up differently than the one in
WARenderPhaseContinuation, where in the last one, it sets a
WARenderingGuide as its visitor (instead of a plain WARenderVisitor).
The catch is that the WARenderVisitor never goes through the
decorations, while WAPresenterVisitor delegates in the client (a
WARenderingGuide) to do it, which it does.
self client visit: aPainter
| renderer |
renderer := aPainter rendererClass context: self renderContext.
aPainter renderContentOn: renderer.
Is there a reason for not using a render context configured to use the
same visitor in both cases?
I "fixed" it by creating my own subclass of WABuilder and using a
special method of #render:on: where I set the request context to use
the same visitor:
context visitor: (WARenderingGuide client: context visitor).
But of course this only works for painters that might have decorators,
but it seems to be harmless in other types of canvases.
ps: I am the only one using Decorators? I found them very useful when
adding chrome or special presentations such as in this case, wrapping
them with some css container, otherwise they'll use the full width and
be ready to be embedded somewhere else.
Esteban A. Maringolo