Don't reload the page if you couldn't set the cookie (caused infinite
reload loop).
When redirecting to a local URL, keep us in the same session, even if
cookies are off.
Added disabled-panes option to navigations.  This allows titles and
spacers in navigation menus.
CSS-related tweaks.
Don't add view captions to tables (we show them separately).
Bug fix.
Add "force-hostname" feature, by which an app with multiple hostnames
can redirect to the canonical one.
Force-hostname feature also requires changes to the ssl-redirect-acceptor.
Bug fix: sorting on a CLSQL slot with a :column didn't work.

Given this:

(def-view-class frob ()
  ((wedged? :accessor frob-wedged? :initform nil :type boolean
            :column is_wedged) ...))

(defview frob-table-view (:type table)
  (wedged? :present-as predicate))

Clicking on the "Wedged?" column header to sort on that column would get
an SQL error, because the slot name was not being translated to the
column name 'is_wedged'.

(Ironically, it worked if the slot came from a mixin view, but not in the
simple case.)
Prepend "field-" to a form field name to get the HTML class for the field.

I happened to use "text" as both a field name and an HTML class, and
had a CSS rule for the class.  I think it's better design to have a prefix
to (nearly) prevent these collisions.
Support for disabled form fields.  Somewhat experimental but seems to work.
Bug fix: WITH-TRANSACTION returned T on success rather than the values
of the last form in the body.
Incompatible change: view validators now receive the object and an alist
of the new field values to be stored in it.

(I needed the object to do the validation, and I thought that interning
keywords on every validator call was not the Right Thing.  Since I was
changing the interface anyway, to pass the object, I decided to use an
alist for the field values.)
Fix two minor bugs in LAZY-NAVIGATION.
Bug fix: widgets were being marked dirty during initialization.  More...

() Weblocks does some MOP hacking to cause widgets to be marked dirty
when one of their slots is modified.  But, this was happening even when
the widget was being initialized; causing their RENDER-WIDGET methods to
be called unnecessarily.  This was at least a performance bug.  Now, a
widget is never marked dirty until it has been rendered the first time.

() I undid some changes I had previously made to quiet warnings issued
when strings and functions were used as widgets.  It eventually became
clear this was not a good idea; only widgets should be in the widget tree.
I added a couple of calls to MAKE-WIDGET to better enforce this, and
restored the warnings.  (I also made it an error to pass a string in the
list of children passed to MAKE-WIDGET; an error that's easy to make is
to forget to wrap a call to something like WITH-HTML or RENDER-LINK in a
lambda, and this detects that.)

() I added a :DOM-CLASS argument to MAKE-WIDGET.

() Finally, I added a convenience macro MAKE-FLOW-WIDGET that makes it
easier to use flows.
Whoops -- incorrectly removed debugging code in previous commit.

Also, that commit should have had this in its message:

Oh, one more thing.  Functions passed to MAKE-WIDGET are now invoked with
the resulting widget as their first argument.  This is an incompatible
change, but it's convenient when you want to call ANSWER in the function
body.
Oops -- MAKE-FLOW-WIDGET shouldn't assign a DOM ID.
Bug fix: the progress indicator image often didn't work, because it was
being loaded using a relative path.
Bug fix: (setf widget-children) was discarding children in one case.
Specifically, when an empty list of children was supplied, and the type
alist didn't already have an entry for the type given, all children
were discarded.
Support for non-AJAX drilldowns in datagrids.  With these, the browser's
"back" button returns from the drilldown widget to the datagrid, as the
user might expect.

Example: you can have a datagrid of frobs selected by a 'navigation' at
'http://foo.com/frobs/'; the :drilldown-link-url-fn can return URLs like
'http://foo.com/frobs/42'.  To do this, wrap the datagrid in a custom
subclass of 'on-demand-selector', with a :lookup-function that, if given
an empty list of tokens, returns the datagrid itself, otherwise returns
the drilldown widget named by the first token.