mozilla

Revision 42069 of Firefox 4 for developers

  • Revision slug: Firefox_4_for_developers
  • Revision title: Firefox 4 for developers
  • Revision id: 42069
  • Created:
  • Creator: janettest
  • Is current revision? No
  • Comment 1 words added, 1 words removed

Revision Content

{{ draft() }}

Firefox 4, which entered beta in late June 2010, enhances performance, adds more support for HTML5 and other evolving Web technologies, and further improves security. This article provides initial information about this upcoming release and what features are available for Web developers, add-on developers, and Gecko platform developers alike.

Many of these features can already be tried in the Firefox 4 beta releases, or (if you're feeling adventurous) in nightly trunk builds.

Note: This article is a work in progress, as are all the articles linked from this page. Many article names are placeholders, and some topics will likely be broken up into multiple articles.

Features for web developers

Gecko now uses the HTML5 parser, which fixes bugs, improves interoperability, and improves performance. It also lets content embed SVG and MathML directly in the HTML markup.

HTML

Meet the HTML5 parser
A look at what the HTML5 parser means to you, and how to embed SVG and MathML into your content inline.
Forms in HTML5
A look at improvements to web forms in HTML5. Among these changes are added input types in the {{ HTMLElement("input") }} element, data validation, and more.
HTML5 Sections
Gecko now supports the new HTML5 elements related to sections in a document: {{ HTMLElement("article") }}, {{ HTMLElement("section") }}, {{ HTMLElement("nav") }}, {{ HTMLElement("aside") }}, {{ HTMLElement("hgroup") }}, {{ HTMLElement("header") }} and {{ HTMLElement("footer") }}.
HTML5 hidden attribute
This attribute, common to all elements, is used to hide content in a webpage that is not currently relevant to the user.
Other HTML5 elements
Gecko now also supports the following new HTML5 elements: {{ HTMLElement("mark") }}, {{ HTMLElement("figure") }}, and  {{ HTMLElement("figcaption") }}.
WebSockets
A guide to using the new WebSockets API for real-time communication between a web application and a server.

Miscellaneous HTML changes

  • {{ HTMLElement("textarea") }} elements are now resizable by default; you can use the {{ cssxref("resize") }} CSS property to disable this.
  • canvas.getContext and canvas.toDataURL no longer throw an exception when called with unrecognized arguments.
  • The {{ HTMLElement("canvas") }} element now supports the Mozilla-specific mozGetAsFile() method, which lets you obtain a memory-based file containing an image of the canvas's contents. See {{ domxref("HTMLCanvasElement") }} for details.
  • canvas2dcontext.lineCap and canvas2dcontext.lineJoin no longer throw an exception when set to an unrecognized value.
  • canvas2dcontext.globalCompositeOperation no longer throws an exception when set to an unrecognized value, and no longer supports the non-standard darker value.
  • Support for the obsolete {{ HTMLElement("spacer") }} element, which was absent in all other browsers, has been removed.
  • Gecko now supports calling click() on {{ HTMLElement("input") }} elements to open the file picker. See the example in the article Using files from web applications.

CSS

CSS transitions
New CSS transitions support is available in Firefox 4.
Computed values in CSS
Support for calc() to compute values in CSS is in progress. See {{ bug("363249") }}.
Selector grouping
Support for {{ cssxref(":-moz-any") }} to group selectors and factorize combinators.
Background image subrectangle support
The {{ cssxref("-moz-image-rect") }} property makes it possible to use subrectangles of images as a background image.
CSS touch properties
Support for touch properties is added. Details, and real article names, to come later.
Using arbitrary elements as CSS backgrounds
You can use the {{ cssxref("-moz-element") }} CSS function and the {{ domxref("document.mozSetImageElement()") }} DOM function to use arbitrary HTML elements as backgrounds.
Privacy and the :visited selector
Changes have been made to what information can be obtained about the style of visited links using CSS selectors. This may affect some web applications.

Miscellaneous CSS changes

  • -moz-border-radius has been renamed to {{ cssxref("border-radius") }}.
    • -moz-border-radius is supported as an alias for a short transitional period
    • The handling of percentage values changed to match the latest specification
    • Rounded corners now clip content and images (except you specify {{ cssxref("overflow") }}:visible)
  • The {{ cssxref("text-shadow") }} property now caps the blur radius to 300px for sanity and performance reasons.
  • The {{ cssxref(":-moz-window-inactive") }} pseudoclass has been implemented.
  • The {{ cssxref("-moz-tab-size") }} property lets you specify the width in space characters of a tab character (U+0009) when rendering text.
  • The CSS3 {{ cssxref("resize") }} property has been implemented.
  • The -moz-background-size property has been renamed to its final {{ cssxref("background-size") }} naming; -moz-background-size is no longer supported.
  • The {{ cssxref("overflow") }} property no longer applies to table-group elements (<thead>, <tbody>, and <tfoot>).
  • The {{ cssxref(":-moz-focusring") }} pseudo-selector lets you specify the appearance of an element when Gecko believes the element should have a focus indication rendered.
  • The {{ cssxref("-moz-element") }} CSS function lets you use an arbitrary element as a background for {{ cssxref("background-image") }} and {{ cssxref("background") }}.
  • The {{ cssxref("-moz-appearance") }} property now supports the -moz-win-borderless-glass value, which applies a borderless Aero Glass look to an element.
  • The {{ cssxref(":valid") }} and {{ cssxref(":invalid") }} pseudo-classes are now automatically applied to validating {{ HTMLElement("input") }} fields.
  • The {{ cssxref(":-moz-submit-invalid") }} pseudo-class is applied to the submit button on form fields when one or more form fields doesn't validate.
  • The {{ cssxref(":required") }} pseudo-class is now automatically applied to {{ HTMLElement("input") }} fields that specify the required attribute; the {{ cssxref(":optional") }} pseudo-class is applied to all other fields.
  • The {{ cssxref(":-moz-placeholder") }} pseudo-class has been added, to let you style placeholder text in form fields.
  • The {{ cssxref(":-moz-handler-crashed") }} pseudo-class has been added; this styles elements whose plugins have crashed.
  • The -moz-device-pixel-ratio media feature has been added, allowing the use of the device pixels per CSS pixel ratio to be used in Media Queries.

Graphics and video

WebGL
The developing WebGL standard is now supported by Firefox.
Optimizing graphics performance
Tips and tricks for getting the most out of graphics and video performance in Firefox 4.
Support for WebM video
The new open WebM video format is supported by Gecko 2.0.
SMIL animation
Support for SMIL animation of SVG is now available. See {{ bug("482402") }}.
Using SVG as images and as CSS backgrounds
You can now use SVG with the {{ htmlelement("img") }} element, as well as the background image in CSS. See {{ bug("272288") }}, {{ bug("276431") }} and {{ bug("231179") }}.
Media buffered attribute support
The buffered attribute on {{ HTMLElement("video") }} and {{ HTMLElement("audio") }} elements is now supported, letting you determine which ranges of a media file have been buffered. The {{ domxref("TimeRanges") }} DOM interface has been implemented to support this.
Media preload attribute
The preload attribute from the HTML5 specification has been implemented, replacing the previously-implemented (and no longer supported) autobuffer attribute. This affects the {{ HTMLElement("video") }} and {{ HTMLElement("audio") }} elements, as well as the {{ interface("nsIDOMHTMLMediaElement") }} interface.
Raw video codec
Support for the OggYUV raw video format has been implemented for use with the {{ HTMLElement("video") }} element.

DOM

Obtaining boundary rectangles for ranges
The Range object now has getClientRects() and getBoundingClientRect() methods. See {{ bug("396392") }}.
Capturing mouse events on arbitrary elements
Support for the Internet Explorer-originated setCapture() and releaseCapture() APIs has been added. See {{ bug("503943") }}.
Manipulating the browser history
The existing document history object, available through the {{ domxref("window.history") }} object, now supports the new HTML5 pushState() and replaceState() methods.
Animations using MozBeforePaint
A new event has been added which, in concert with the {{ domxref("window.mozRequestAnimationFrame()") }} method and {{ domxref("window.mozAnimationStartTime") }} property, provides a way to create animations that are synchronized with one another.
Touch and multi-touch events
Support has been added for touch and multi-touch events.

Miscellaneous DOM changes

  • The wrapping of a {{ HTMLElement("textarea") }} element can now be controlled via the DOM, via the wrap DOM attribute. {{ bug("41464") }}
  • DOM {{ domxref("file") }} objects now offer a url property.
  • FormData support for XMLHttpRequest.
  • The {{ domxref("element.isContentEditable") }} property has been implemented.
  • Added the mozSourceNode property to the DragTransfer object.
  • Added the selection.modify() method to the {{ domxref("Selection") }} object; this lets you easily alter the current text selection or cursor position in a browser window.
  • Support for the window.directories object and the directories feature for {{ domxref("window.open") }}, which are not supported in any other browser, has been removed. Use personalbar instead. {{ Bug("474058") }}
  • The {{ domxref("event.mozInputSource") }} property has been added to DOM user interface events; this non-standard property lets you determine the type of device that generated an event.
  • The {{ domxref("document.onreadystatechange") }} event has been implemented.
  • The {{ domxref("document.createElement") }} method no longer accepts < and > around the tag name in quirks mode.
  • The {{ domxref("window.mozPaintCount") }} property has been added; it lets you determine how many times a document has been painted. This can be useful when testing performance of your web application.
  • The language token has been removed from {{ domxref("window.navigator.appVersion") }} and {{ domxref("window.navigator.userAgent") }}. Use {{ domxref("window.navigator.language") }} or the Accept-Language header instead.  {{ Bug("572656") }}
  • The {{ domxref("document.height") }} and {{ domxref("document.width") }} properties have been removed. {{ Bug("585877") }}
  • The XMLHttpRequest object now exposes the response as a JavaScript typed array as well as as a string, using the Gecko-specific mozResponseArrayBuffer property.
  • Mouse events now include a mozPressure property indicating the amount of pressure on supported pressure-sensitive input devices.
  • The {{ domxref("window.createBlobURL()") }} and {{ domxref("window.revokeBlobURL()") }} methods let you create blob URLs which reference local files.
  • The {{ domxref("DOMImplementation.createHTMLDocument()") }} method lets you create a new HTML document.

Security

Introducing Content Security Policy
Content Security Policy (CSP) is a Mozilla proposal designed to help web designers and server administrators specify how content on their web sites interacts. The goal is to help detect and mitigate attacks including cross-site scripting and data injection attacks.
HTTP Strict Transport Security
HTTP Strict Transport Security is a security feature that lets a web site tell browsers that it should only be communicated with using HTTPS, instead of using HTTP.
The X-FRAME-OPTIONS response header
The X-FRAME-OPTIONS HTTP response header introduced in Internet Explorer 8 is now supported by Firefox. This allows sites to indicate whether or not their pages can be used in frames, and if so, whether or not to restrict that to the same origin.
User Agent string changes
As a means to reduce the amount of data and entropy sent out in HTTP requests, the crypto strength and language tokens have been removed from the user agent string.

JavaScript

For an overview of the changes implemented in JavaScript 1.8.5, see New in JavaScript 1.8.5. JavaScript in Firefox 4 will have additional adherence to the ECMAScript 5 standard.

Developer tools

Using the Web Console
The Web Console tool is a useful debugging aid for web developers and extension developers alike.

{{ gecko_callout_heading("2.0") }}

The Error Console is disabled by default starting in Firefox 4. You can re-enable it by changing the devtools.errorconsole.enabled preference to true and restarting the browser.

Changes for Mozilla and add-on developers

For helpful tips on updating existing extensions for Firefox 4, see Updating extensions for Firefox 4. There are several key changes that break compatibility with existing add-ons, so be sure to read that article.

JavaScript code modules

Services.jsm
The Services.jsm code module provides getters that make it easy to obtain references to commonly-used services, such as the preferences service or the window mediator, among others.
JS-ctypes API
The JS-ctypes API makes it possible to call C-compatible foreign library functions without using XPCOM.
Add-ons Manager
The new Add-ons Manager provides information about installed add-ons, support for managing them, and provides ways to install and remove add-ons.
Loading code modules from chrome: URLs
You can now load JavaScript code modules using chrome: URLs, even inside JAR files.
DownloadLastDir.jsm
The DownloadLastDir.jsm code module provides the gDownloadLastDir global variable, which contains a string you can use to learn the path of the directory into which the last download occurred. This module handles issues related to private browsing for you.

Miscellaneous changes to code modules

  • The NetUtil.jsm code module now offers the readInputStreamToString() method, which lets you read arbitrary bytes from a stream into a string, even if the stream includes zeroes.

DOM changes

{{ domxref("ChromeWorker") }}
A new type of worker for privileged code; this lets you use things like js-ctypes from workers in extensions and application code.
Touch events
Support for (non-standard) touch events has been added; these let you track multiple fingers moving on a touch screen at the same time.

XUL

Changes to the tabbrowser element

Several changes were made to the {{ XULElem("tabbrowser") }} element that impact extensions that interact with tabs.

  • TabClose/TabSelect/TabOpen events no longer bubble up to the {{ XULElem("tabbrowser") }} element (gBrowser). Event listeners for those events should be added to gBrowser.tabContainer rather than to gBrowser directly.
  • The tab context menu is no longer an anonymous child of the {{ XULElem("tabbrowser") }}. It can therefore be overlaid directly with XUL overlays. It can also be accessed more directly in JS via gBrowser.tabContextMenu. See this blog post for more details.
  • The new {{ XULProp("visibleTabs") }} property was added to let you get an array of the currently visible tabs; this lets you determine which tabs are visible in the current tab set. This is used by Firefox Panorama, for example.
  • Added the new {{ XULMeth2("showOnlyTheseTabs") }} method; this is used by Firefox Panorama.
  • Added the new {{ XULMeth2("getIcon") }} method, which lets you get a tab's favicon without having to pull up the {{ XULElem("browser") }} element.
  • Added the new {{ XULProp("tabbrowser.tabs") }} property, which lets you easily get a list of the tabs in a {{ XULElem("tabbrowser") }} element.
  • The new {{ XULMeth2("pinTab") }} and {{ XULMeth2("unpinTab") }} methods let you pin and unpin tabs (that is, switch them between being app tabs and regular tabs).

Remote XUL support removed

Remote XUL is no longer supported; this affects XUL documents being served through HTTP; also, you can no longer load XUL documents using file:// URLs. There is, however, a whitelist feature that can be used to allow specific domains to load remote XUL. The Remote XUL Manager extension lets you manage this whitelist.

Miscellaneous XUL changes

  • The {{ xulattr("readonly") }} attribute now correctly works for fields.
  • The {{ xulelem("resizer") }} element now lets you use the {{ xulattr("element") }} attribute to specify an element to resize, instead of resizing the window.
  • The "active" attribute no longer gets set on active XUL windows. Instead, you can use the new {{ cssxref(":-moz-window-inactive") }} pseudoclass in order to assign different styles to background windows.
  • The {{ xulattr("emptytext") }} attribute is now deprecated; you should use {{ xulattr("placeholder") }} instead.
  • The {{ xulelem("popup") }} element is no longer supported; you should use {{ xulelem("menupopup") }} instead.
  • The {{ xulelem("window") }} element now offers a {{ xulattr("accelerated") }} attribute; when true, the hardware layer manager is permitted to accelerate the window.
  • The {{ xulelem("stack") }} element now supports the {{ xulattr("bottom") }} and {{ xulattr("right") }} attributes.
  • The {{ xulattr("alternatingbackground") }} attribute for {{ xulelem("tree") }} elements is no longer supported; you can use the {{ cssxref(":-moz-tree-row") }} pseudo-class instead.
  • The Bookmarks Toolbar overflow button with anonid chevronPopup is no longer anonymous; it has an id of PlacesChevron.
  • The {{ xulelem("tabs") }} element now has a {{ xulprop("tabbox") }} property, replacing the old _tabbox property, which has been deprecated (and was never documented).
  • XUL {{ xulelem("window") }} elements now have the {{ xulattr("drawintitlebar") }} attribute; if this is true, the window's content area includes the title bar, allowing drawing into the title bar.
  • New TabPinned and TabUnpinned events are available, allowing you to detect when tabs are pinned and unpinned.
  • {{ xulelem("tab") }} elements now have a {{ xulattr("pinned") }} attribute, letting you determine whether or not a tab is currently pinned.

Storage

Miscellaneous storage API changes

  • The {{ interface("mozIStorageBindingParamsArray") }} interface now has a length attribute that indicates the number of {{ interface("mozIStorageBindingParams") }} objects in the array.
  • The {{ ifandmethod("mozIStorageStatement", "bindParameters") }} now returns an error if the specified {{ interface("mozIStorageBindingParamsArray") }} is empty.
  • Added the {{ ifmethod("mozIStorageConnection", "clone") }} method, which lets you clone an existing database connection.
  • Added the {{ ifmethod("mozIStorageConnection", "asyncClose") }} method, which lets you close a database connection asynchronously; you specify a callback to be notified when the close operation is complete.
  • Added the {{ ifmethod("mozIStorageConnection", "setGrowthIncrement") }} method, which lets you specify the amount by which a database file is grown at a time, in order to help SQLite reduce fragmentation.
  • The SQLITE_CONSTRAINT error is now reported as NS_ERROR_STORAGE_CONSTRAINT instead of as NS_ERROR_FAILURE.

XPCOM

In addition to the specific changes referenced below, it's important to note that there are no longer any frozen interfaces. All interfaces are now unfrozen, regardless of what the documentation may say. We'll update the documentation over time.

XPCOM changes in Gecko 2.0
Details about changes to XPCOM that impact compatibility in Firefox 4.
Components.utils.getGlobalForObject()
This new method returns the global object with which an object is associated; this replaces a common use case of the now-removed __parent__.

Places

  • Places query results may now be observed by multiple observers, and queries may be executed asynchronously. This means there have been some changes to the {{ interface("nsINavHistoryResult") }}, {{ interface("nsINavHistoryQueryOptions") }}, and {{ interface("nsINavHistoryContainerResultNode") }} interfaces. More significantly, the {{ interface("nsINavHistoryResultViewer") }} interface has been renamed to {{ interface("nsINavHistoryResultObserver") }}.
  • Some new notifications have been added to enable the browser to track the shutdown process of the Places service more reliably. Of these, most are for internal use only, but the places-connection-closed notification is available to know when the Places service has completed its shutdown process.

Interface changes

  • The {{ interface("nsIDocShell") }} and {{ interface("nsIWebBrowser") }} interfaces now have a new isActive attribute, which is used to allow optimization of code paths for documents that aren't currently visible.
  • The {{ interface("nsIMemory") }} method isLowMemory() has been deprecated. You should use "memory-pressure" notifications to watch for low memory situations instead.

Memory management

Infallible memory allocation
Mozilla now provides infallible memory allocators that are guaranteed not to return null. You should read this article to learn how they work and how to explicitly request fallible versus infallible memory allocation.

Other changes

Gopher support removed
The Gopher protocol is no longer supported natively. Continued support is available via the OverbiteFF extension.
Default plugin removed
The default plugin has been removed. The application plugins folder has also been removed by default, however support for installing plugins via this folder still exists. See {{ bug("533891") }}.
Extension Manager replaced with AddonManager
nsIExtensionManager has been replaced by AddonManager.

See also

{{ languages( { "de": "de/Firefox_4_für_Entwickler", "ja": "ja/Firefox_4_for_developers", "zh-tw": "zh_tw/Firefox_4_for_developers"} ) }}

Revision Source

<p>{{ draft() }}</p>
<p>Firefox 4, which entered beta in late June 2010, enhances performance, adds more support for HTML5 and other evolving Web technologies, and further improves security. This article provides initial information about this upcoming release and what features are available for Web developers, add-on developers, and Gecko platform developers alike.</p>
<p>Many of these features can already be tried in the <a class=" external" href="http://www.mozilla.com/en-US/firefox/beta/" title="http://www.mozilla.com/en-US/firefox/beta/">Firefox 4 beta</a> releases, or (if you're feeling adventurous) in <a class=" external" href="http://nightly.mozilla.org/" title="http://nightly.mozilla.org/">nightly trunk builds</a>.</p>
<div class="note"><strong>Note:</strong> This article is a work in progress, as are all the articles linked from this page. Many article names are placeholders, and some topics will likely be broken up into multiple articles.</div>
<h2>Features for web developers</h2>
<p>Gecko now uses the <a href="/en/HTML/HTML5" title="en/HTML/HTML5">HTML5</a> parser, which fixes bugs, improves interoperability, and improves performance. It also lets content embed <a href="/en/SVG" title="en/SVG">SVG</a> and <a href="/en/MathML" title="en/MathML">MathML</a> directly in the HTML markup.</p>
<h3>HTML</h3>
<dl> <dt><a href="/en/HTML/HTML5/HTML5_Parser" title="en/HTML/HTML5/HTML5 Parser">Meet the HTML5 parser</a></dt> <dd>A look at what the HTML5 parser means to you, and how to embed SVG and MathML into your content inline.</dd> <dt><a href="/en/HTML/HTML5/Forms_in_HTML5" title="en/HTML/Forms in HTML5">Forms in HTML5</a></dt> <dd>A look at improvements to web forms in HTML5. Among these changes are added input types in the {{ HTMLElement("input") }} element, data validation, and more.</dd> <dt><a href="/en/Sections_and_Outlines_of_an_HTML5_document" title="en/Sections and Outlines of an HTML5 document">HTML5 Sections</a></dt> <dd>Gecko now supports the new HTML5 elements related to sections in a document: {{ HTMLElement("article") }}, {{ HTMLElement("section") }}, {{ HTMLElement("nav") }}, {{ HTMLElement("aside") }}, {{ HTMLElement("hgroup") }}, {{ HTMLElement("header") }} and {{ HTMLElement("footer") }}.</dd> <dt><a href="/en/HTML/Global_attributes#attr-hidden" title="https://developer.mozilla.org/en/HTML/Global_attributes#attr-hidden">HTML5 hidden attribute</a></dt> <dd>This attribute, common to all elements, is used to hide content in a webpage that is not currently relevant to the user.</dd> <dt>Other HTML5 elements</dt> <dd>Gecko now also supports the following new HTML5 elements: {{ HTMLElement("mark") }}, {{ HTMLElement("figure") }}, and  {{ HTMLElement("figcaption") }}.</dd> <dt>WebSockets</dt> <dd>A guide to using the new WebSockets API for real-time communication between a web application and a server.</dd>
</dl>
<h4>Miscellaneous HTML changes</h4>
<ul> <li>{{ HTMLElement("textarea") }} elements are now resizable by default; you can use the {{ cssxref("resize") }} CSS property to disable this.</li> <li><code>canvas.getContext</code> and <code>canvas.toDataURL</code> no longer throw an exception when called with unrecognized arguments.</li> <li>The {{ HTMLElement("canvas") }} element now supports the Mozilla-specific <code>mozGetAsFile()</code> method, which lets you obtain a memory-based file containing an image of the canvas's contents. See {{ domxref("HTMLCanvasElement") }} for details.</li> <li><code>canvas2dcontext.lineCap</code> and <code>canvas2dcontext.lineJoin</code> no longer throw an exception when set to an unrecognized value.</li> <li><code>canvas2dcontext.globalCompositeOperation</code> no longer throws an exception when set to an unrecognized value, and no longer supports the non-standard <code>darker</code> value.</li> <li>Support for the obsolete {{ HTMLElement("spacer") }} element, which was absent in all other browsers, has been removed.</li> <li>Gecko now supports calling <code>click()</code> on {{ HTMLElement("input") }} elements to open the file picker. See the <a href="/en/Using_files_from_web_applications#Using_hidden_file_input_elements_using_the_click()_method" title="en/Using files from web applications#Using hidden file input elements using the click() method">example</a> in the article <a href="/en/Using_files_from_web_applications" title="en/Using files from web applications">Using files from web applications</a>.</li>
</ul>
<h3>CSS</h3>
<dl> <dt><a href="/en/CSS/CSS_transitions" title="en/CSS/CSS transitions">CSS transitions</a></dt> <dd>New CSS transitions support is available in Firefox 4.</dd> <dt>Computed values in CSS</dt> <dd>Support for<code> calc() </code>to compute values in CSS is in progress. See {{ bug("363249") }}.</dd> <dt>Selector grouping</dt> <dd>Support for {{ cssxref(":-moz-any") }} to group selectors and factorize combinators.</dd> <dt>Background image subrectangle support</dt> <dd>The {{ cssxref("-moz-image-rect") }} property makes it possible to use subrectangles of images as a background image.</dd> <dt>CSS touch properties</dt> <dd>Support for touch properties is added. Details, and real article names, to come later.</dd> <dt><a href="/en/CSS/-moz-element" title="en/CSS/-moz-element">Using arbitrary elements as CSS backgrounds</a></dt> <dd>You can use the {{ cssxref("-moz-element") }} CSS function and the {{ domxref("document.mozSetImageElement()") }} DOM function to use arbitrary HTML elements as backgrounds.</dd> <dt><a href="/en/CSS/Privacy_and_the_:visited_selector" title="en/CSS/Privacy and the :visited selector">Privacy and the :visited selector</a></dt> <dd>Changes have been made to what information can be obtained about the style of visited links using CSS selectors. This may affect some web applications.</dd>
</dl>
<h4>Miscellaneous CSS changes</h4>
<ul> <li><code>-moz-border-radius </code>has been renamed to {{ cssxref("border-radius") }}. <ul> <li><code>-moz-border-radius </code>is supported as an alias for a short transitional period</li> <li>The handling of percentage values changed to match the latest specification<code><br> </code></li> <li>Rounded corners now clip content and images (except you specify {{ cssxref("overflow") }}<code>:visible</code>)</li> </ul> </li> <li>The {{ cssxref("text-shadow") }} property now caps the blur radius to 300px for sanity and performance reasons.</li> <li>The {{ cssxref(":-moz-window-inactive") }} pseudoclass has been implemented.</li> <li>The {{ cssxref("-moz-tab-size") }} property lets you specify the width in space characters of a tab character (U+0009) when rendering text.</li> <li>The CSS3 {{ cssxref("resize") }} property has been implemented.</li> <li>The<code> -moz-background-size </code>property has been renamed to its final {{ cssxref("background-size") }} naming; -moz-background-size is no longer supported.</li> <li>The {{ cssxref("overflow") }} property no longer applies to table-group elements (<code>&lt;thead&gt;</code>, <code>&lt;tbody&gt;</code>, and <code>&lt;tfoot&gt;</code>).</li> <li>The {{ cssxref(":-moz-focusring") }} pseudo-selector lets you specify the appearance of an element when Gecko believes the element should have a focus indication rendered.</li> <li>The {{ cssxref("-moz-element") }} CSS function lets you use an arbitrary element as a background for {{ cssxref("background-image") }} and {{ cssxref("background") }}.</li> <li>The {{ cssxref("-moz-appearance") }} property now supports the<code> -moz-win-borderless-glass </code>value, which applies a borderless Aero Glass look to an element.</li> <li>The {{ cssxref(":valid") }} and {{ cssxref(":invalid") }} pseudo-classes are now automatically applied to validating {{ HTMLElement("input") }} fields.</li> <li>The {{ cssxref(":-moz-submit-invalid") }} pseudo-class is applied to the submit button on form fields when one or more form fields doesn't validate.</li> <li>The {{ cssxref(":required") }} pseudo-class is now automatically applied to {{ HTMLElement("input") }} fields that specify the required attribute; the {{ cssxref(":optional") }} pseudo-class is applied to all other fields.</li> <li>The {{ cssxref(":-moz-placeholder") }} pseudo-class has been added, to let you style placeholder text in form fields.</li> <li>The {{ cssxref(":-moz-handler-crashed") }} pseudo-class has been added; this styles elements whose plugins have crashed.</li> <li>The <code><a href="/En/CSS/Media_queries#-moz-device-pixel-ratio" title="En/CSS/Media queries#-moz-device-pixel-ratio">-moz-device-pixel-ratio</a></code> media feature has been added, allowing the use of the device pixels per CSS pixel ratio to be used in <a href="/En/CSS/Media_queries" title="En/CSS/Media queries">Media Queries</a>.</li>
</ul>
<h3>Graphics and video</h3>
<dl> <dt> </dt><dt><a href="/en/WebGL" title="en/WebGL">WebGL</a></dt> <dd>The developing WebGL standard is now supported by Firefox.</dd> <dt>Optimizing graphics performance</dt> <dd>Tips and tricks for getting the most out of graphics and video performance in Firefox 4.</dd> <dt><a href="/En/Media_formats_supported_by_the_audio_and_video_elements#WebM" title="En/Media formats supported by the audio and video elements#WebM">Support for WebM video</a></dt> <dd>The new open <a class=" external" href="http://www.webmproject.org/" title="http://www.webmproject.org/">WebM</a> video format is supported by Gecko 2.0.</dd> <dt>SMIL animation</dt> <dd>Support for SMIL animation of SVG is now available. See {{ bug("482402") }}.</dd> <dt>Using SVG as images and as CSS backgrounds</dt> <dd>You can now use SVG with the {{ htmlelement("img") }} element, as well as the background image in CSS. See {{ bug("272288") }}, {{ bug("276431") }} and {{ bug("231179") }}.</dd> <dt>Media <code>buffered</code> attribute support</dt> <dd>The <code>buffered</code> attribute on {{ HTMLElement("video") }} and {{ HTMLElement("audio") }} elements is now supported, letting you determine which ranges of a media file have been buffered. The {{ domxref("TimeRanges") }} DOM interface has been implemented to support this.</dd> <dt>Media <code>preload</code> attribute</dt> <dd>The <code>preload</code> attribute from the HTML5 specification has been implemented, replacing the previously-implemented (and no longer supported) <code>autobuffer</code> attribute. This affects the {{ HTMLElement("video") }} and {{ HTMLElement("audio") }} elements, as well as the {{ interface("nsIDOMHTMLMediaElement") }} interface.</dd> <dt>Raw video codec</dt> <dd>Support for the <a class=" external" href="http://wiki.xiph.org/OggYUV" title="http://wiki.xiph.org/OggYUV">OggYUV</a> raw video format has been implemented for use with the {{ HTMLElement("video") }} element.</dd>
</dl>
<h3>DOM</h3>
<dl> <dt>Obtaining boundary rectangles for ranges</dt> <dd>The Range object now has <code>getClientRects()</code> and <code>getBoundingClientRect()</code> methods. See {{ bug("396392") }}.</dd> <dt>Capturing mouse events on arbitrary elements</dt> <dd>Support for the Internet Explorer-originated <code>setCapture()</code> and <code>releaseCapture()</code> APIs has been added. See {{ bug("503943") }}.</dd> <dt><a href="/en/DOM/Manipulating_the_browser_history" title="en/DOM/Manipulating the browser history">Manipulating the browser history</a></dt> <dd>The existing document history object, available through the {{ domxref("window.history") }} object, now supports the new HTML5 <code>pushState()</code> and <code>replaceState()</code> methods.</dd> <dt><a href="/en/DOM/Animations_using_MozBeforePaint" title="en/DOM/Animations using MozBeforePaint">Animations using MozBeforePaint</a></dt> <dd>A new event has been added which, in concert with the {{ domxref("window.mozRequestAnimationFrame()") }} method and {{ domxref("window.mozAnimationStartTime") }} property, provides a way to create animations that are synchronized with one another.</dd> <dt>Touch and multi-touch events</dt> <dd>Support has been added for touch and multi-touch events.</dd>
</dl>
<h4>Miscellaneous DOM changes</h4>
<ul> <li>The wrapping of a {{ HTMLElement("textarea") }} element can now be controlled via the DOM, via the <code>wrap</code> DOM attribute. {{ bug("41464") }}</li> <li>DOM {{ domxref("file") }} objects now offer a <code>url</code> property.</li> <li><a href="/En/XMLHttpRequest/Using_XMLHttpRequest#Using_FormData_objects" title="en/XMLHttpRequest/Using XMLHttpRequest#Using FormData objects">FormData</a> support for XMLHttpRequest.</li> <li>The {{ domxref("element.isContentEditable") }} property has been implemented.</li> <li>Added the <a href="/En/DragDrop/DataTransfer#mozSourceNode" title="En/DragDrop/DataTransfer#mozSourceNode"><code>mozSourceNode</code></a> property to the <a href="/En/DragDrop/DataTransfer" title="En/DragDrop/DataTransfer"><code>DragTransfer</code></a> object.</li> <li>Added the <a href="/en/DOM/Selection/modify" title="en/DOM/selection/modify"><code>selection.modify()</code></a> method to the {{ domxref("Selection") }} object; this lets you easily alter the current text selection or cursor position in a browser window.</li> <li>Support for the <code>window.directories</code> object and the <code>directories</code> feature for {{ domxref("window.open") }}, which are not supported in any other browser, has been removed. Use <code>personalbar</code> instead. {{ Bug("474058") }}</li> <li>The {{ domxref("event.mozInputSource") }} property has been added to DOM user interface events; this non-standard property lets you determine the type of device that generated an event.</li> <li>The {{ domxref("document.onreadystatechange") }} event has been implemented.</li> <li>The {{ domxref("document.createElement") }} method no longer accepts <code>&lt;</code> and <code>&gt;</code> around the tag name in quirks mode.</li> <li>The {{ domxref("window.mozPaintCount") }} property has been added; it lets you determine how many times a document has been painted. This can be useful when testing performance of your web application.</li> <li>The language token has been removed from {{ domxref("window.navigator.appVersion") }} and {{ domxref("window.navigator.userAgent") }}. Use {{ domxref("window.navigator.language") }} or the <a href="/en/Content_negotiation" title="en/Content negotiation">Accept-Language header</a> instead.  {{ Bug("572656") }}</li> <li>The {{ domxref("document.height") }} and {{ domxref("document.width") }} properties have been removed. {{ Bug("585877") }}</li> <li>The <a href="/en/XMLHttpRequest" title="en/XMLHttpRequest">XMLHttpRequest</a> object now exposes the response as a JavaScript typed array as well as as a string, using the Gecko-specific <code>mozResponseArrayBuffer</code> property.</li> <li><a href="/en/DOM/Event/UIEvent/MouseEvent" title="en/DOM/Event/UIEvent/MouseEvent">Mouse events</a> now include a <code>mozPressure</code> property indicating the amount of pressure on supported pressure-sensitive input devices.</li> <li>The {{ domxref("window.createBlobURL()") }} and {{ domxref("window.revokeBlobURL()") }} methods let you create blob URLs which reference local files.</li> <li>The {{ domxref("DOMImplementation.createHTMLDocument()") }} method lets you create a new HTML document.</li>
</ul>
<h3>Security</h3>
<dl> <dt><a href="/en/Introducing_Content_Security_Policy" title="en/Introducing Content Security Policy">Introducing Content Security Policy</a></dt> <dd>Content Security Policy (CSP) is a Mozilla proposal designed to help web designers and server administrators specify how content on their web sites interacts. The goal is to help detect and mitigate attacks including cross-site scripting and data injection attacks.</dd> <dt><a href="/en/Security/HTTP_Strict_Transport_Security" title="en/Security/HTTP Strict Transport Security">HTTP Strict Transport Security</a></dt> <dd>HTTP Strict Transport Security is a security feature that lets a web site tell browsers that it should only be communicated with using HTTPS, instead of using HTTP.</dd> <dt><a href="/en/The_X-FRAME-OPTIONS_response_header" title="en/The X-FRAME-OPTIONS response header">The X-FRAME-OPTIONS response header</a></dt> <dd>The X-FRAME-OPTIONS HTTP response header introduced in Internet Explorer 8 is now supported by Firefox. This allows sites to indicate whether or not their pages can be used in frames, and if so, whether or not to restrict that to the same origin.</dd> <dt><a href="/En/User_Agent_Strings_Reference" title="En/User_Agent_Strings_Reference">User Agent string</a> changes</dt> <dd>As a means to <a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=572650">reduce the amount of data and entropy sent out in HTTP requests</a>, the crypto strength and language tokens have been removed from the user agent string.</dd>
</dl>
<h3>JavaScript</h3>
<p>For an overview of the changes implemented in JavaScript 1.8.5, see <a href="/en/JavaScript/New_in_JavaScript/1.8.5" title="en/New in JavaScript 1.8.5">New in JavaScript 1.8.5</a>. JavaScript in Firefox 4 will have additional adherence to the ECMAScript 5 standard.</p>
<h3>Developer tools</h3>
<dl> <dt><a href="/en/Using_the_Web_Console" title="en/Using the Web Console">Using the Web Console</a></dt> <dd>The Web Console tool is a useful debugging aid for web developers and extension developers alike.</dd>
</dl>
<div class="geckoVersionNote">
<p>{{ gecko_callout_heading("2.0") }}</p>
<p>The Error Console is disabled by default starting in Firefox 4. You can re-enable it by changing the <code>devtools.errorconsole.enabled</code> preference to <code>true</code> and restarting the browser.</p>
</div>
<h2>Changes for Mozilla and add-on developers</h2>
<p>For helpful tips on updating existing extensions for Firefox 4, see <a href="/en/Extensions/Updating_extensions_for_Firefox_4" title="en/Extensions/Updating extensions for Firefox 4">Updating extensions for Firefox 4</a>. There are several key changes that break compatibility with existing add-ons, so be sure to read that article.</p>
<h3>JavaScript code modules</h3>
<dl> <dt><a href="/en/JavaScript_code_modules/Services.jsm" title="en/JavaScript code modules/Services.jsm">Services.jsm</a></dt> <dd>The <code>Services.jsm</code> code module provides getters that make it easy to obtain references to commonly-used services, such as the preferences service or the window mediator, among others.</dd> <dt><a href="/en/JavaScript_code_modules/ctypes.jsm" title="en/JavaScript code modules/ctypes.jsm">JS-ctypes API</a></dt> <dd>The JS-ctypes API makes it possible to call C-compatible foreign library functions without using XPCOM.</dd> <dt><a href="/en/Addons/Add-on_Manager" title="en/Addons/Add-on Manager">Add-ons Manager</a></dt> <dd>The new Add-ons Manager provides information about installed add-ons, support for managing them, and provides ways to install and remove add-ons.</dd> <dt><a href="/en/JavaScript_code_modules/Using#Locating_the_code_module" title="en/JavaScript code modules/Using JavaScript code modules#Locating the code module">Loading code modules from chrome: URLs</a></dt> <dd>You can now load JavaScript code modules using <strong>chrome:</strong> URLs, even inside JAR files.</dd> <dt>DownloadLastDir.jsm</dt> <dd>The <a href="/en/JavaScript_code_modules/DownloadLastDir.jsm" title="en/JavaScript/Code modules/DownloadLastDir.jsm"><code>DownloadLastDir.jsm</code></a> code module provides the <code>gDownloadLastDir</code> global variable, which contains a string you can use to learn the path of the directory into which the last download occurred. This module handles issues related to private browsing for you.</dd>
</dl>
<h4>Miscellaneous changes to code modules</h4>
<ul> <li>The <code>NetUtil.jsm</code> code module now offers the <a href="/en/JavaScript_code_modules/NetUtil.jsm#readInputStreamToString()" title="en/JavaScript/Code modules/NetUtil.jsm#readInputStreamToString()"><code>readInputStreamToString()</code></a> method, which lets you read arbitrary bytes from a stream into a string, even if the stream includes zeroes.</li>
</ul>
<h3>DOM changes</h3>
<dl> <dt>{{ domxref("ChromeWorker") }}</dt> <dd>A new type of worker for privileged code; this lets you use things like <a href="/en/js-ctypes" title="en/js-ctypes">js-ctypes</a> from workers in extensions and application code.</dd> <dt><a href="/en/DOM/Touch_events" title="en/DOM/Touch events">Touch events</a></dt> <dd>Support for (non-standard) touch events has been added; these let you track multiple fingers moving on a touch screen at the same time.</dd>
</dl>
<h3>XUL</h3>
<h4>Changes to the tabbrowser element</h4>
<p>Several changes were made to the {{ XULElem("tabbrowser") }} element that impact extensions that interact with tabs.</p>
<ul> <li>TabClose/TabSelect/TabOpen events no longer bubble up to the {{ XULElem("tabbrowser") }} element (gBrowser). Event listeners for those events should be added to gBrowser.tabContainer rather than to gBrowser directly.</li> <li>The tab context menu is no longer an anonymous child of the {{ XULElem("tabbrowser") }}. It can therefore be overlaid directly with <a href="/en/XUL_Overlays" title="en/XUL Overlays">XUL overlays</a>. It can also be accessed more directly in JS via gBrowser.tabContextMenu. See <a class=" external" href="http://www.gavinsharp.com/blog/2010/03/31/accessingmodifying-the-firefox-tab-context-menu-from-extensions/" title="http://www.gavinsharp.com/blog/2010/03/31/accessingmodifying-the-firefox-tab-context-menu-from-extensions/">this blog post</a> for more details.</li> <li>The new {{ XULProp("visibleTabs") }} property was added to let you get an array of the currently visible tabs; this lets you determine which tabs are visible in the current tab set. This is used by Firefox Panorama, for example.</li> <li>Added the new {{ XULMeth2("showOnlyTheseTabs") }} method; this is used by Firefox Panorama.</li> <li>Added the new {{ XULMeth2("getIcon") }} method, which lets you get a tab's favicon without having to pull up the {{ XULElem("browser") }} element.</li> <li>Added the new {{ XULProp("tabbrowser.tabs") }} property, which lets you easily get a list of the tabs in a {{ XULElem("tabbrowser") }} element.</li> <li>The new {{ XULMeth2("pinTab") }} and {{ XULMeth2("unpinTab") }} methods let you pin and unpin tabs (that is, switch them between being app tabs and regular tabs).</li>
</ul>
<h4>Remote XUL support removed</h4>
<p>Remote XUL is no longer supported; this affects XUL documents being served through HTTP; also, you can no longer load XUL documents using <span class="nowiki"><code>file://</code></span> URLs. There is, however, a whitelist feature that can be used to allow specific domains to load remote XUL. The <a class=" link-https" href="https://addons.mozilla.org/en-US/firefox/addon/235281/" title="https://addons.mozilla.org/en-US/firefox/addon/235281/">Remote XUL Manager extension</a> lets you manage this whitelist.</p>
<h4>Miscellaneous XUL changes</h4>
<ul> <li>The {{ xulattr("readonly") }} attribute now correctly works for fields.</li> <li>The {{ xulelem("resizer") }} element now lets you use the {{ xulattr("element") }} attribute to specify an element to resize, instead of resizing the window.</li> <li>The "active" attribute no longer gets set on active XUL windows. Instead, you can use the new {{ cssxref(":-moz-window-inactive") }} pseudoclass in order to assign different styles to background windows.</li> <li>The {{ xulattr("emptytext") }} attribute is now deprecated; you should use {{ xulattr("placeholder") }} instead.</li> <li>The {{ xulelem("popup") }} element is no longer supported; you should use {{ xulelem("menupopup") }} instead.</li> <li>The {{ xulelem("window") }} element now offers a {{ xulattr("accelerated") }} attribute; when true, the hardware layer manager is permitted to accelerate the window.</li> <li>The {{ xulelem("stack") }} element now supports the {{ xulattr("bottom") }} and {{ xulattr("right") }} attributes.</li> <li>The {{ xulattr("alternatingbackground") }} attribute for {{ xulelem("tree") }} elements is no longer supported; you can use the {{ cssxref(":-moz-tree-row") }} pseudo-class instead.</li> <li>The Bookmarks Toolbar overflow button with anonid chevronPopup is no longer anonymous; it has an id of PlacesChevron.</li> <li>The {{ xulelem("tabs") }} element now has a {{ xulprop("tabbox") }} property, replacing the old <code>_tabbox</code> property, which has been deprecated (and was never documented).</li> <li>XUL {{ xulelem("window") }} elements now have the {{ xulattr("drawintitlebar") }} attribute; if this is <code>true</code>, the window's content area includes the title bar, allowing drawing into the title bar.</li> <li>New <code>TabPinned</code> and <code>TabUnpinned</code> events are available, allowing you to <a href="/../../../../en/Code_snippets/Tabbed_browser#Notification_when_a_tab_is_pinned_or_unpinned" title="https://developer.mozilla.org/en/Code_snippets/Tabbed_browser#Notification_when_a_tab_is_pinned_or_unpinned">detect when tabs are pinned and unpinned</a>.</li> <li>{{ xulelem("tab") }} elements now have a {{ xulattr("pinned") }} attribute, letting you determine whether or not a tab is currently pinned.</li>
</ul>
<h3>Storage</h3>
<h4>Miscellaneous storage API changes</h4>
<ul> <li>The {{ interface("mozIStorageBindingParamsArray") }} interface now has a length attribute that indicates the number of {{ interface("mozIStorageBindingParams") }} objects in the array.</li> <li>The {{ ifandmethod("mozIStorageStatement", "bindParameters") }} now returns an error if the specified {{ interface("mozIStorageBindingParamsArray") }} is empty.</li> <li>Added the {{ ifmethod("mozIStorageConnection", "clone") }} method, which lets you clone an existing database connection.</li> <li>Added the {{ ifmethod("mozIStorageConnection", "asyncClose") }} method, which lets you close a database connection asynchronously; you specify a callback to be notified when the close operation is complete.</li> <li>Added the {{ ifmethod("mozIStorageConnection", "setGrowthIncrement") }} method, which lets you specify the amount by which a database file is grown at a time, in order to help SQLite reduce fragmentation.</li> <li>The <code>SQLITE_CONSTRAINT</code> error is now reported as <code>NS_ERROR_STORAGE_CONSTRAINT</code> instead of as <code>NS_ERROR_FAILURE</code>.</li>
</ul>
<h3>XPCOM</h3>
<p>In addition to the specific changes referenced below, it's important to note that there are no longer any frozen interfaces. All interfaces are now unfrozen, regardless of what the documentation may say. We'll update the documentation over time.</p>
<dl> <dt><a href="/en/XPCOM/XPCOM_changes_in_Gecko_2.0" title="en/XPCOM/XPCOM changes in Gecko 2.0">XPCOM changes in Gecko 2.0</a></dt> <dd>Details about changes to XPCOM that impact compatibility in Firefox 4.</dd> <dt><a href="/en/Components.utils.getGlobalForObject" title="en/Components.utils.getGlobalForObject">Components.utils.getGlobalForObject()</a></dt> <dd>This new method returns the global object with which an object is associated; this replaces a common use case of the now-removed <code>__parent__</code>.</dd>
</dl>
<h3>Places</h3>
<ul> <li>Places query results may now be observed by multiple observers, and queries may be executed asynchronously. This means there have been some changes to the {{ interface("nsINavHistoryResult") }}, {{ interface("nsINavHistoryQueryOptions") }}, and {{ interface("nsINavHistoryContainerResultNode") }} interfaces. More significantly, the {{ interface("nsINavHistoryResultViewer") }} interface has been renamed to {{ interface("nsINavHistoryResultObserver") }}.</li> <li>Some <a href="/en/Observer_Notifications#Places" title="en/Observer Notifications#Places">new notifications</a> have been added to enable the browser to track the shutdown process of the Places service more reliably. Of these, most are for internal use only, but the <code>places-connection-closed</code> notification is available to know when the Places service has completed its shutdown process.</li>
</ul>
<h3>Interface changes</h3>
<ul> <li>The {{ interface("nsIDocShell") }} and {{ interface("nsIWebBrowser") }} interfaces now have a new <code>isActive</code> attribute, which is used to allow optimization of code paths for documents that aren't currently visible.</li> <li>The {{ interface("nsIMemory") }} method <a href="/en/XPCOM_Interface_Reference/nsIMemory/isLowMemory" title="en/XPCOM Interface Reference/nsIMemory/isLowMemory"><code>isLowMemory()</code></a> has been deprecated. You should use <a href="/en/XPCOM_Interface_Reference/nsIMemory#Low_memory_notifications" title="en/XPCOM Interface Reference/nsIMemory#Low memory notifications">"memory-pressure" notifications</a> to watch for low memory situations instead.</li>
</ul>
<h3>Memory management</h3>
<dl> <dt><a href="/en/Infallible_memory_allocation" title="en/Infallible memory allocation">Infallible memory allocation</a></dt> <dd>Mozilla now provides infallible memory allocators that are guaranteed not to return null. You should read this article to learn how they work and how to explicitly request fallible versus infallible memory allocation.</dd>
</dl>
<h2>Other changes</h2>
<dl> <dt>Gopher support removed</dt> <dd>The Gopher protocol is no longer supported natively. Continued support is available via the <a class=" link-https" href="https://addons.mozilla.org/addon/7685/">OverbiteFF</a> extension.</dd> <dt>Default plugin removed</dt> <dd>The default plugin has been removed. The application plugins folder has also been removed by default, however support for installing plugins via this folder still exists. See {{ bug("533891") }}.</dd> <dt>Extension Manager replaced with AddonManager</dt> <dd><a href="/en/XPCOM_Interface_Reference/nsIExtensionManager" title="en/nsIExtensionManager">nsIExtensionManager</a> has been replaced by <a href="/en/Addons/Add-on_Manager/AddonManager" title="en/Addons/Add-on_Manager/AddonManager">AddonManager</a>.</dd>
</dl>
<h2>See also</h2>
<ul> <li><a href="/en/Firefox_3.6_for_developers" title="en/Firefox 3.6 for developers">Firefox 3.6 for developers<br> </a></li> <li><a class="internal" href="/En/Firefox_3.5_for_developers" title="En/Firefox 3.5 for developers">Firefox 3.5 for developers</a></li> <li><a class="internal" href="/en/Firefox_3_for_developers" title="en/Firefox 3 for developers">Firefox 3 for developers</a></li> <li><a class="internal" href="/en/Firefox_2_for_developers" title="en/Firefox 2 for developers">Firefox 2 for developers</a></li> <li><a class="internal" href="/en/Firefox_1.5_for_developers" title="en/Firefox 1.5 for developers">Firefox 1.5 for developers</a></li>
</ul>
<p>{{ languages( { "de": "de/Firefox_4_für_Entwickler", "ja": "ja/Firefox_4_for_developers", "zh-tw": "zh_tw/Firefox_4_for_developers"} ) }}</p>
Revert to this revision