Firefox 20 for developers
=========================

Firefox 20 was released on April, 2nd 2013. This article provides information about the changes in this release that will affect developers.

Changes for Web developers
--------------------------

### HTML

* Support for the `download` attribute on the `<a>` and `<area>` element has been added (Firefox bug 676619).
* The value `auto` for the global attribute `dir` has been implemented (Firefox bug 548206).
* The global attribute contextmenu now works on Firefox for Android (Firefox bug 736321).
### JavaScript

* Support for the `WeakMap.prototype.clear()` method, recently added to the Harmony (ECMAScript 2015) draft proposal has been added (Firefox bug 814562).
* Support for the `Math.imul()` method, a C-style 32-bit multiplication function. Though proposed for Harmony (ECMAScript 2015) it has not yet been accepted and still is non-standard (Firefox bug 808148).
* Web apps using draggable text with Kinetic 3.x are working, even when using the Cairo canvas backend (Firefox bug 835064).
* The `for each...in` statement has been deprecated and should not be used. Consider using the new `for...of` statement (Firefox bug 804834).
* Support for the `Map.prototype.keys()`, `Map.prototype.values()`, and `Map.prototype.entries()` has been added (Firefox bug 817368).
### CSS

* CSS Flexbox is now available by default in pre-release builds only (excluding beta versions). It can be enabled in release and beta versions by setting the `layout.css.flexbox.enabled` about:config preference to `true`.
* The `mask-type` property from the CSS Masking specification has been added (Firefox bug 793617).
* Experimental support for the `:scope` pseudo-class has been added. Enabled by default in Aurora and Nightly, it can be enabled in release and beta versions by setting the `layout.css.scope-pseudo.enabled` about:config preference to `true` (Firefox bug 648722).
### DOM/APIs

* `HTMLMediaElement` supports now `playbackRate` (both read and write), with pitch correction. Pitch correction can be controlled using the property `mozPreservesPitch` (Firefox bug 495040).
* CSSOM: Support for the new `CSSGroupingRule` and `CSSConditionRule` has been added (Firefox bug 814907).
* CSSOM: On `CSSRule` the constant CSSRule.MOZ\_KEYFRAME\_RULE and CSSRule.MOZ\_KEYFRAMES\_RULE have been unprefixed to CSSRule.KEYFRAME\_RULE and CSSRule.KEYFRAMES\_RULE. The prefixed version is temporarily kept for helping Web author to transition their code Firefox bug 816431).
* CSSOM: It is now possible to set the value of `conditionText` for `CSSMediaRule` (Firefox bug 815021).
* The `DOMParser` `parseFromStream` and `parseFromBuffer` methods are no longer available from web content (Firefox bug 816410).
* The `XMLSerializer` `serializeToStream` method is no longer available from web content (Firefox bug 816410).
* `TextDecoder` and `TextEncoder` interfaces are now available in Workers (Firefox bug 795542).
* Support for the `CSS.supports()` method has been added, behind the `layout.css.supports-rule.enabled` pref (off by default) (Firefox bug 779917).
* Support for UndoManager has been added (Firefox bug 617532).
* The CSSOM `Document.caretPositionFromPoint()` method, which returns a `CaretPosition` has been implemented.
* The index argument of the `HTMLTableRowElement.insertCell()` and `HTMLTableElement.insertRow()` methods has been made optional as per HTML specification.
* `Navigator.getUserMedia`, still prefixed as `Navigator.mozGetUserMedia` is now activated by default.
* The third, optional, `transfer` argument of `Window.postMessage` is now supported. It allows to transfer a sequence of transferable objects to the destination (Firefox bug 822094).
* The non-standard `Window.sizeToContent()` method now clamps the minimal size: the window cannot be forced anymore to small sizes preventing the user from interacting with (Firefox bug 764240).
* Blend modes, such as `overlay`, `color-burn`, `hue`, etc. have been added to the Canvas `CanvasRenderingContext2D.globalCompositeOperation` property (Firefox bug 748433).
* The prefixed version of `window.indexedDB` — `window.mozIndexedDB` — was reintroduced to Gecko, so that bad cross-browser prefixing code (such as `var indexedDB = window.indexedDB || window.webkitIndexedDB …`) doesn't break in Firefox. A better approach is `window.indexedDB = window.indexedDB || window.webkitIndexedDB …` (see Firefox bug 770844.)
### SVG

* The implementation of the `contentScriptType` and `contentStyleType` properties has been removed from `SVGSVGElement` along with the removal from SVG2 (Firefox bug 819731).
### MathML

* To help MathML authors debugging "invalid-markup" errors in their documents, MathML parsing errors (such as having too many / too few child elements) and warnings about deprecated attributes or wrong attribute values are now reported to the error console.
* The `scriptminsize` attribute now accepts unitless values and percent values. They are interpreted as multiples of the default value ("`8pt`").
* Unitless values are now also allowed for the `mathsize` and `fontsize` attributes; they multiply the default value.
Changes for add-on and Mozilla developers
-----------------------------------------

* EcmaScript for XML (E4X) is now fully disabled for all chrome and content scripts. It was previously disabled for content in Firefox 17 and has been removed entirely for Firefox 21. Use DOMParser/DOMSerializer or a non-native JXON algorithm instead.
* The `nsIDOMParserJS` interface no longer exists (Firefox bug 816410). See `nsIDOMParser` for alternatives.
* Content Preferences: The `nsIContentPrefService` interface is now deprecated and the asynchronous `nsIContentPrefService2` storage API has been implemented.
* The `nsIProfile` and `nsIProfileChangeStatus` interfaces have been removed, along with other code supporting the pre-Firefox profile management system. You probably weren't using these interfaces, but if you were, you should stop doing so. This prevents defunct parts of the profile management system from vetoing the shutdown process.
* The `nsIEventSource` interface no longer exists (Firefox bug 819639).
See also
--------

* Firefox 20 Release Notes
* Add-on Compatibility for Firefox 20
### Older versions

* Firefox 19 for developers
* Firefox 18 for developers
* Firefox 17 for developers
* Firefox 16 for developers
* Firefox 15 for developers
* Firefox 14 for developers
* Firefox 13 for developers
* Firefox 12 for developers
* Firefox 11 for developers
* Firefox 10 for developers
* Firefox 9 for developers
* Firefox 8 for developers
* Firefox 7 for developers
* Firefox 6 for developers
* Firefox 5 for developers
* Firefox 4 for developers
* Firefox 3.6 for developers
* Firefox 3.5 for developers
* Firefox 3 for developers
* Firefox 2 for developers
* Firefox 1.5 for developers