qooxdoo 3.0 (2013-07-22)


This release comes with many new features and improvements besides a large number of bugfixes.



qooxdoo's GUI toolkit for feature-rich applications has become much more lightweight.

While keeping most of its sophisticated feature set, every desktop widget now consists of just one DOM element (from 2-5 before) and corresponding JavaScript object representation. So a typical desktop application now comes with less than 50% of elements, a fact that improved UI performance on all devices tested.

3D DOM View: reduced number of DOM elements
Illustrating the reduced DOM elements: previous qooxdoo (left) vs. qooxdoo 3.0 (right)

The optimizations were only possible by revisiting the browser support: We took further advantage of native features built into modern browsers. At the same time we implemented graceful degradation in older browsers (like IE8) and discontinued support for some legacy browsers (like IE6 and IE7). Moreover, this release already embraces future browsers (like IE11 Preview).

Chances are good you won't have to change anything in your existing qx.Desktop application. See the documentation if your application needs some manual adjustment (e.g. if you created a custom theme).

We have been able to achieve a good user experience in running qx.Desktop apps on touch devices. For instance, on hybrid devices (like Windows 8 convertibles) or tablet devices like the iPad. To further support the latter scenario, we introduced a new setting for you to opt-in to mouse event emulation on touch devices. This further increases subjective performance when using your fingers to interact with desktop apps.

Go ahead and give the widget browser or feedreader a try on the iPad.


  • The qx.Website API Viewer saw some improvements: Many new API samples were added, consisting of HTML and CSS as well as JavaScript code. Most of them can be executed and edited on jsFiddle with just one click.
  • Beside qx.io.rest.Resource there exists now also qx.bom.rest.Resource which brings REST to qx.Website (exposed as q.rest.Resource) in company with a FakeServer (q.fakeServer) for testing purposes.
  • In addition to providing qx.Website as a single all-in-one script file we also offer separate module builds (i.e. q-core-3.0.min.js, q-animation-3.0.min.js, …) which are freely combinable.


  • iOS devices use "-webkit-overflow-scrolling:touch" instead of iScroll.
  • Using SCSS instead of LESS as the CSS-precompiling technology LESS to SCSS. With this comes the powerful new possibility to customize our qx.Mobile standard theme Indigo.
  • Support for BlackBerry 10 OS.
  • Support for displays with different device pixel ratios (1.5x, 2x, 3x).
  • New container widget: Drawer.
  • A longtap event has been added. You can test the event on the events page of the mobile showcase.

Community / Tooling

  • A new qooxdoo-contrib infrastructure was being rolled out. With the new release the Github-based catalog will be used to find and download contributions. (See dedicated blog post).
  • New tool chain jobs:
    • watch (auto-building the application)
    • watch-scss (auto-building CSS files from SCSS, mobile apps)
    • source-server (mini webserver for the source version)
    • source-httpd-config (web server configuration for the source version)
    • source-server-reload (auto-reload application in the browser)
    • validate-config, validate-manifest (validate config.json, Manifest.json)
  • Cold cache built speed-ups through pre-compiled information of the framework classes.
  • Enhanced manual including special characters in search strings (`.`, `-`, `#`, `@`), and upper-case words.

Bugfixes & Enhancements

See this detailed list of issues resolved for qooxdoo 3.0, which includes the fixes of the accompanying qooxdoo 2.1.2 patch release. Besides fixes for defects, many enhancements made it into qooxdoo 3.0. See here for a detailed list of issues that were resolved for 3.0 exclusively.


Some manual migration steps might be necessary when upgrading from the previous releases, see the Migration guide. Deprecation warnings in the development ("source") version shouldn't negatively affect your app in production ("build"), but it is recommended to get rid of those warnings. A bugfix-only replacement is available as qooxdoo 2.1.2, the corresponding patch release.


Browser Support

  • Windows 8.1 and Internet Explorer 11 (Preview) are correctly identified and fully supported. (#7492)
  • Improved feature detection for pointerEvents. (#6851)


  • Serializer now supports serializing qooxdoo classes / mixins / interfaces (#7369)
  • Added a cancel method for requestAnimationFrame based frame sequences (#6994)
  • Use HighResolutionTime for requestAnimationFrame if supported (#7003)
  • Added a wrapper for the PageVisibility API (#5391)
  • Added basecall feature (i.e. this.base(arguments, varargs)) from qx.Class also for qx.Bootstrap classes (#7404)
  • Resolved error when overriding a generated property method (#4726)

Data Binding

  • Only fire a change event on array splice if the content really changed. (#5777)
  • Call the converter in case the property chain for binding breaks (#6880)
  • Added a set of convenience methods to the data array (#6787)
  • Fixed the bubble handling when removing and adding the same instance with splice (#7132)
  • Fixed Single Value Binding cleanup (#6947)
  • Added two new properties to the array's change event data: added and removed items. (#6207)


  • New mock HTTP backend based on Sinon.JS (#7188)
  • getResponse() does no longer return null for error status (#6680)
  • Added a isDisposed() method to the bom requests (#6848)
  • Fixed JSONP handling in combination with REST (#7533)


  • Cloning DOM nodes now works as expected for collection with child nodes (#7358)
  • It's now possible to add native 'MSPointer*' events to any DOM node if necessary (#7342)
  • Animation of the attributes 'width' and 'height' now work for all IE browsers (7310)
  • API Viewer code samples can now contain HTML and CSS as well as JavaScript code. Samples flagged as 'executable' will be opened in jsFiddle. (#7224)
  • q()/qxWeb() now optionally accepts a collection as context. (#7264)
  • Event module: New method allOff() removes all listeners (optionally of a given type) from the collection items. (#7202)
  • Touch events are now normalized (using MSPointer events in modern IEs). (#7147)
  • Do not apply the keep frame if the animation has been stopped before end (#7418)
  • Fixed stopping of JS based animations (#7015)
  • Two animations can run on one element when two collections are used (#6948)
  • Added support for prefixed css keys in animations (#7002)
  • Updated mustache.js to version 0.7.2 (#6866)


  • Added build-module-all and build-module-all-min jobs which build module tailored qxWeb js-files (#6849)
  • Added q.rest.resource module (#7332)
  • Added q.dev.fakeServer module (#7331)
  • Added renderToNode() method to template module (#7300)
  • Fixed slice(): q('div').slice(0, 0) now returns [] (#7322)
  • Fixed empty(): fixed destroying of child elems in IE (#7323)
  • Fixed replaceClass(): only adds a class as replacement (#7265)
  • Added code samples for modules Core, CSS, Manipulating, Traversing (#7064)


UI Core

  • Fixed scroll handling on container edges (#6175)
  • Allow to release child controls (#6932)
  • Prevent dragover and dragleave events on the drag&drop cursor (#6909)
  • Close all menus on scroll via mouse wheel to make sure the positioning does not break. (#7009)
  • Added mouse emulation for touch devices (#7145)
  • Make use of AnimationFrame in the queue manager (#7153)
  • Prevent click events after drop (#6951)
  • Added a method to stop scroll animations (#7211)
  • Removed the container element (#7302)
  • Associated buddy is toggled if qx.ui.basic.Label is clicked (#6881)
  • Fixed qx.ui.toolbar.ToolBar items show property regression (#6823)
  • Added missing initialization of shortcut string for qx.ui.core.Command (#7036)
  • Fixed hiding of all popups in qx.ui.popup.Manager (#7126)

Data Binding

  • Form controller resets form item values when bound model is set to null (#6060)
  • Enhanced documentation of changeSelection event for data bound selections (#6110)


  • Fire changeValue event when maxLength is set and value has changed (#7158)
  • Double form renderer aligns labels right (#7489)
  • Prevent selection of null on mouse wheel on an empty select box (#7007)
  • MenuButton now has its own appearance id plus theming. (including a down arrow) (#6981)
  • Make sure 0 (and only 0) will be accepted as value when the input field is set to required (#7052)


  • Fixed resetSource of IFrames (#7443)
  • Fixed wrong selection when opening qx.ui.table.celleditor.SelectBox (#6889)
  • Added "top-right" and "bottom-right" as icon position to the atom (#6347)


  • If a appearance can't be resolved correctly (e.g. a nested child control) a info message is shown to aid the developer how this fix this issue (#7086)
  • Apply decorator styles to the content element (#7273)
  • Allow disabling of dynamic theme change (#7138)
  • React more specific on theme changes (#6979)


  • New container widget Drawer, similar to the iOS or Android drawer widgets. It is a kind of “pull-down” menu which can be added to the application’s root or any qx.ui.mobile.container.Composite.
  • qx.Mobile now supports the BlackBerry 10 OS (#7415)
  • Mobile labels and list items now support runtime locale changes. (#7099)
  • OrientationChange Event always returned the wrong mode on Galaxy Nexus. (#7163)
  • Tap event fired unintentionally when scrolling back and forth, then releasing. (#7374)
  • Replaced __selectedIndex through selectedIndex property in menu, for firing event 'changeSelection'
  • Updated __selection to property in qx.ui.mobile.form.SelectBox for firing event "changeSelection" on every property apply
  • qx.ui.mobile.form.SelectBox.setSelection method did not fire "changeSelection" event (#7228)
  • Picker widget not "stopping" button events (#7152)
  • Carousel scrolls to wrong position when user switches between TextArea on different CarouselPages (#7205)
  • qx.ui.mobile.form.Form.showRow hides the row (#7210)
  • Unexpected behaviour in the qx.ui.mobile.container.Carousel (#7065)
  • Zoom gesture on an Android mobile platform don't work (#7115)
  • Update styling of qx.Mobile radio buttons and check boxes (#7494)
  • Added MS prefix to qx.Mobile SASS gradient mixins
  • Improved responsiveness of checkboxes and radio buttons (#6993)
  • Use Android ICS Input Field Fix (#7361)
  • Use double-sized resolution images for Retina Display (#7058)
  • Use overflow:scroll / -webkit-overflow-scrolling: touch; in iOS5 instead of iScroll (edit) (#5313)
  • Form Renderer access to labels and rows (#7426)
  • New: shownPage as property of carousel (#7397)
  • Modified qx.Mobile's widget _removeAll method for returning removed children
  • qx.Mobile ScrollComposite should have a scroll lock for vertical and horizontal direction (#7144)
  • qx.Mobile Page has a "wait" lifecycle state (#7262)
  • Added the platform type as a CSS class into Mobile's root div, for being able to react on platform specific CSS bugs
  • Added "watch-scss" job to qx.Mobile Showcase
  • qx.ui.mobile.form.SelectBox: Added getSelectionDialog method
  • Enhance MScroll options (#6384)
  • Added a "inAnimation" state for preventing double execution of any animation
  • Added CSS class flag for detecting the portrait or landscape mode on root's widget
  • Add SCSS Support to the Toolchain (#6859)
  • Merge qx.Mobile Dialog with qx.Mobile Popup (#7069)
  • Migrated theming from LESS to SCSS/SASS (#7047)
  • Provide a way to create application-specific themes in qx.Mobile (#7039)
  • Carousel's scrollLoop does not work on swipe (#7018)
  • A longtap event has been added (#6964)
  • Added a changeCurrentIndex event to the carousel (#7022)



  • Updated ace to version 1.1.01 (#6867)
  • Added a link to jsFiddle (#7040)
  • Added possibility to resize the mobile playground vie predefined settings (#7428)

API Viewer

  • Display mixin items included from other mixins. (#7468)
  • Fixed hyperlinks which give HTTP 301, 404 or links to missing manual pages within js source files (#6988)

Test Runner

  • Updated Sinon.JS to version 1.7.1 (#7184)


  • New watch job auto-builds your application when source files change.
  • New watch-scss job for mobile applications, to auto-build CSS files from SCSS files when they change.
  • New source-server job to start a mini webserver to export the source version of an app.
  • New source-httpd-config to generate configuration snippets for popular web servers, to export the source version of an app.
  • New source-server-reload job to automatically reload an application in the browser when it has changed.
  • New validate-config job to validate an application's config.json.
  • New validate-manifest job to validate an application's Manifest.json.
  • New build-module-all job to build separate qx.Website modules.
  • New build-module-all-min job to build separate qx.Website modules (minified).


  • New dependencies job to speed up cold-cache compilation of applications using the current library.
  • Start a mini webserver to export the SDK's index.html (for better demo and API consumption).
  • Check for undocumented class properties. (#7472)
  • Warnings for incomplete API documentation can now be displayed on the shell, in the API Viewer, or both. (#5939)
  • The 'api' job can now optionally calculate the percentage of undocumented API items for each package. (#7019)


  • Compiler hints: `#` compiler hints are deprecated; use `@` hints in JSDoc comments instead.
  • Compiler hints: `@lint ignoreUndefined` is deprecated; use `@ignore` instead.
  • Reduced icon images (physically & registered) in build (#7045)
  • Added support for CSS at-rules (e.g. @keyframes, @-moz-document and @media etc.) in patched pyScss version (#7064)


  • Changed exclude configuration key semantics: A leading `=` in front of an excluded class will now remove also all classes required by this class from the build.
  • Add new configuration key lint-check/ignore-shadowing-locals.
  • Added Manifest.json validation via JSON Schema (#6674)
  • Added config.json validation via JSON Schema (#5426)


  • Updated CLDR data to v.23.1

Code Validation

Code Formatting

  • Fix of various pretty-printing issues (switch-case formatting, statement parsing, trailing comments, 'keep-column', 'comment-cols', 'padding' options)


  • Updated docs of qx.Bootstrap.define and q.define (#7251)
  • Manual search now also finds words with . (dots), - (hyphens), @, # and upper case words. (#7292)


  • Migration job: Fix bug in the migration that could potentially corrupt code. The new implementation uses pretty-printing (with default options), so your code will be re-formatted. This is only relevant for users that haven't already migrated to 2.1.
  • Compiler hints: `#` compiler hints are deprecated; use `@` hints in JSDoc comments instead. This affects all of #asset, #require, #use, #ignore and #cldr. See the migration guide.
  • Compiler hints: `@lint ignoreUndefined` is deprecated; use `@ignore` instead.

API Changes

  • The method setTextColor in the class qx.ui.embed.HtmlArea has been renamed to setTextForegroundColor. The method still exists but is inherited from the widget API. So ode won't break but does not work as expected anymore if not updated.
  • Renamed the 'event.pointer' environment key to 'css.pointerevents' (#7483)
  • qx.ui.mobile.container.Carousel: Renamed setShowTransition to setTransitionDuration
  • The change event of the data array features two new properties: added and removed each holding an array of items. The items property is therefore deprecated. (#6207)

Missing Features / Known Issues

  • Theming: Double borders are not supported on widgets inheriting from qx.ui.form.AbstractField in Internet Explorer 8 (#7571)
  • Generator jobs source-server and source-server-reload with IE9/IE10: There is a known issue with newer IE's talking to the Python mini web server that is used by the tool chain. Those browsers easily stall on file requests, thereby stalling the web server as well. The work-around is to use a more elaborate web server like Apache or nginx (which is an easy install on Windows, just an unzip of the archive), and use the source-httpd-config job to generate a suitable config snippet for the application's source version.