Welcome to another round of tidbits from the qooxdoo world. WebTech09 has passed with some interesting presentations and meeting people (see more in this weekly), and now we're off to higher goals...

1.0 Beta

1.0 - we're getting there. As announced earlier we plan to ship a 1.0 beta of qooxdoo this coming week. It's a preview release, and everybody is invited to check it out and provide feedback. If you want to hold your breath, hold it around Wednesday :-) .

Framework

Script Core

A small change can sometimes reveal bugs which are otherwise hard to find. Fabian changed the event which triggers the placement of a widget from resize to appear and suddenly disappear events from widgets were not fired any more. With this trail in mind we found out that unregistering an appear event will also unregister a disappear event and vice versa since only the target hash code was used to store the data. The fix was quick and easy: store the data using both the target hash code and the event type.

Data Binding

We added some work into the data binding this week. First, we added a data store for JSONP. On top of that, we added a YQL data store. The whole story can found in a separate blog post.

Performance

Performance is always an issue and with the 1.0 release on the horizon even more. We have identified a few bottle necks, which we could remove:

  • setStyle vs. setStyles: All CSS styles in qooxdoo are applied by calling qx.bom.element.Style.setStyle(). This resulted in a lot of function calls and some duplicate operations. To solve this we have enhanced the setStyles() function which is able to set several styles at once. We basically have manually inlined the code of setStyle() and moved as much as possible out of the loop.
  • Assertions: Even if assertions are mostly used in debug code, it's still important that the checks are as fast as possible. The assertion class has been reworked internally which gained some significant performance improvements.
  • Dispose: While measuring performance we were surprised how expensive disposing of objects is. One small optimization was the deprecation of the _disposeFields method, which basically sets the given fields to null. Instead we set the fields directly to null which is equally concise but way faster.

History Manager

New browsers including IE8 Firefox 3.6 and newer WebKit based browsers support the hashchange event, which is fired whenever the fragment identifier (hash) of the URL changes. If available we now make use of this new feature to detect hash changes instead of the more expensive polling technique. In addition some issues in IE have been fixed as well.

Bugs

For a complete list of bugs fixed during the last working week, use this bugzilla query.

Applications

We introduced a new feature for the API Viewer this week: The throw information will be displayed for every method which can throw errors. qx.data.MBinding is a good example for this new feature.

Generator Configuration

The generator has a new command line option -m (or --macro for the long form) that  allows you to pass macros and their definition to the generator. Example:

generate.py -m foo:bar myjob

where foo is the macro name and bar the assigned value. You can specify multiple -m options. The effect is as if you wrote these definitions in the global let section of the configuration file  you use. Since these macros are evaluated very early, you can use them e.g. in top-level include keys if you want to parameterize an include file. In this vein, macros are now also supported in jobs' extend and run keys; this was formerly not supported, as these keys are among the earliest keys that are evaluated in a job (prior to full macro expansion), as they guide job construction.

That's it for this week, see you around next time.