New in Seaside 3.0

Modularization

The monolithic Seaside package has been split into several independent modules. We expect this to have several advantages:

Ports to existing and future platforms should be easier. The new platform layer is called Grease and independent of Seaside.

It allows for smaller Seaside installations. For example you can have Seaside without the tests or without Kom and use Swazoo 2 instead.

Hardened environments can run without any development tools like the toolbar, halos, inspector, walkback and friends. This reduces the chance that setup flaws result in users being able to exploit the application.

Internal

Internally Seaside now uses its own method for string conversion (#seasideString) instead of a very brittle and confusing combination of #asString and #displayString. We also introduced a GRObject class for objects that should receive #initialize upon creation. This should not affect users.

First class mime types and locales

Seaside now has first class objects (WAMimeType and WALocale) instead of Strings. This should leave most users unaffected because they can get away using Strings just the same as for WAUrl. Except one place though and that is WAFile >> #contentType which now returns an instance of WAMimeType.

Request Context

WARequestContext provides a lot of functionality that earlier WASession did provide. It also provides new functionality that earlier was not available at all.

#application, #session, and (new) #requestContext have been implemented on GRObject, which means they are accessible from any Seaside object. Note that they will signal a WARequestContextNotFound error if there is no current request context available.

Moved rendering and redirecting methods from WASession to WARequestContext- The code entry paths for request handlers changed so that they all expect a WARequestContext instead of a WARequest. WASession was changed so that its #responseForContext: method sets a value for WACurrentRequestContext. All methods from then on in your application can access the request context through that process variable by calling self requestContext from most Seaside objects.

Rewrites and major refactorings

Mostly rewritten configuration system (with tests!)

Pluggable WACache removes the need for WALRUCache and WAExpiringHandler and should give much more flexibility in caching policies

The Render Loop was refactored to remove WARenderLoop and re-implement the two continuations to prevent entering each one twice and hopefully make the flow clearer. There is now one continuation for the action phase and one for the render phase.

WARequestHandlers can be decorated and are on a request processing stack.

#with: in WATextInput and WASubmitButton as a synonym to #text:, what is much more consistent.

WARequestCookies is a Collection of instances of WARequestCookie instead of a Dictionary.

WACookie supports many more features.

The session cookie key is now _s.

The mime type and character set are configured in the application instead of the session.

Support for non-ASII URLs (and parameters).

WARequest>>fields contains both GET and POST fields (important for action url of <form>s)

Remote address now part of WARequest, you don’t need to access the native request anymore.

Experimental upload streaming on Squeak and Kom.

Lightweight mime document class that implementors can use.

Dialogs should no longer produce invalid HTML.

WARequest>>url now returns a WAUrl object.

Callbacks are no longer executed while traversing the component tree. This means that components and decorations no longer have the opportunity to affect the execution of components and decorations below them on the tree. #processCallbackStream: and #processChildCallbacks: no longer exist and are not called.

Tons of new tests.

Sessions no longer (re-)register themselves with the Application. This may change some weird edge-case behaviour if users were expecting to be able to render their components after unregistering a session. This should not be possible as the session is unavailable by the time the render request arrives.

The session cookie value is no longer added by the Application to the GET parameters in the incoming request. This means that the incoming request reflects the actual parameters passed in by the user.