Firefox 4, which shipped on March 22, 2011, enhances performance, adds more support for HTML5 and other evolving Web technologies, and further improves security. This article provides information about this release and what features are available for Web developers, add-on developers, and Gecko platform developers alike.
Features for web developersGecko 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.
HTMLA look at improvements to web forms. Among these changes are added input types in the <input>
element, data validation, and more.
Gecko now supports the new HTML5 elements related to sections in a document: <article>
, <section>
, <nav>
, <aside>
, <hgroup>
, <header>
and <footer>
.
This attribute, common to all elements, is used to hide content in a webpage that is not currently relevant to the user.
Gecko now also supports the following new HTML5 elements: <mark>
, <figure>
, and <figcaption>
.
A guide to using the new WebSockets API for real-time communication between a web application and a server. Note that WebSockets as implemented in Firefox 4 is not compatible with the final standard, and should not generally be used.
The following changes were made to the CanvasRenderingContext2D
interface to bring our <canvas>
implementation closer to being in line with the specification:
arc()
now correctly throws an INDEX_SIZE_ERR
exception.createLinearGradient()
and createRadialGradient()
now throws NOT_SUPPORTED_ERR
instead of SYNTAX_ERR
.miterLimit
to a negative value no longer throws an exception; instead, it properly ignores non-positive values.lineWidth
to a negative value no longer throws an exception; instead, it properly ignores non-positive values.putImageData()
method now supports the optional parameters dirtyX
, dirtyY
, dirtyWidth
, and dirtyHeight
.<textarea>
elements are now resizable by default; you can use the resize
CSS property to disable this.canvas.getContext
and canvas.toDataURL
no longer throw an exception when called with unrecognized arguments.<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 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.<spacer>
element, which was absent in all other browsers, has been removed.<isindex>
element, when created by calling Document.createElement()
, is now created as a simple element with no properties or methods.click()
on <input>
elements to open the file picker. See the example in the article Using files from web applications.<input>
element supports a new mozactionhint
attribute, which lets you specify the label for the enter key on virtual keyboards.<script>
elements inside <iframe>
, <noembed>
, and <noframes>
elements now get executed, which they weren't in previous versions of Firefox. This is in compliance with the specification, and matches the behavior of other browsers.New CSS transitions support is available in Firefox 4.
Support for -moz-calc
has been added. This lets you specify <length>
values as mathematical expressions.
Support for :-moz-any
to group selectors and factorize combinators.
The -moz-image-rect()
function makes it possible to use subrectangles of images as a background-image
.
Support for touch properties is added. Details, and real article names, to come later.
You can use the -moz-element
CSS function and the document.mozSetImageElement()
DOM function to use arbitrary HTML elements as backgrounds.
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.
-moz-font-feature-settings
Lets you customized advanced features of OpenType fonts. -moz-tab-size
Specifies the width in space characters of a tab character (U+0009) when rendering text. resize
Lets you control the dimensions in which an element may be resized. New CSS pseudo-classes Pseudo-class Description :-moz-handler-crashed
Used to style elements whose plugins have crashed. :-moz-placeholder
Applied to placeholder text in form fields. :-moz-submit-invalid
Applied to the submit button on forms when one or more of the form's fields doesn't validate. :-moz-window-inactive
Applied to elements in inactive windows. :invalid
Automatically applied to <input>
fields when their contents are invalid. :optional
Automatically applied to <input>
fields that don't specify the required
attribute. :required
Automatically applied to <input>
fields that specify the required
attribute. :valid
Automatically applied to <input>
fields when their contents validate successfully. New CSS pseudo-selectors Pseudo-selector Description :-moz-focusring
Lets you specify the appearance of an element when Gecko believes it should have a focus indication rendered. New CSS functions Function Description :-moz-any
Lets you group selectors and factorize combinators. -moz-calc
Lets you specify <length>
values as mathematical expressions. -moz-element
Lets you use an arbitrary element as a background for background-image
and background
. -moz-image-rect
Lets you use a subrectangle of an image as a background-image
or background
. Renamed CSS properties Old Name New Name Notes -moz-background-size
background-size
The name -moz-background-size
is no longer supported. -moz-border-radius
border-radius
The old name is supported for a limited time to allow you time to update your sites. Rendering changes have also been made to match the latest version of the specification. -moz-box-shadow
box-shadow
Miscellaneous CSS changes
text-shadow
property now caps the blur radius to 300px for sanity and performance reasons.overflow
property no longer applies to table-group elements (<thead>
, <tbody>
, and <tfoot>
).-moz-appearance
property now supports the -moz-win-borderless-glass
value, which applies a borderless Aero Glass look to an element.-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.<length>
units has been revised to better match other browsers, and to more accurately translate absolute lengths into screen pixel counts based on the device's DPI.The developing WebGL standard is now supported by Firefox.
Tips and tricks for getting the most out of graphics and video performance in Firefox 4.
The new open WebM video format is supported by Gecko 2.0.
Support for SMIL animation of SVG is now available.
You can now use SVG with the <img>
element, as well as a CSS background-image
.
buffered
attribute support
The buffered
attribute on <video>
and <audio>
elements is now supported, letting you determine which ranges of a media file have been buffered. The TimeRanges
DOM interface has been implemented to support this.
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 <video>
and <audio>
elements, as well as the nsIDOMHTMLMediaElement
interface.
You can now specify lists for the values of the x
, y
, dx
, and dy
properties on SVG <text>
and <tspan>
elements. This lets you control the positioning of each character in a string individually.
Support has been added for JavaScript typed arrays; this allows you to manipulate buffers containing raw data using native data types. Several APIs make use of this, including the File API, WebGL, and WebSockets.
The Range
object now has range.getClientRects()
and range.getBoundingClientRect()
methods.
Support for the Internet Explorer-originated setCapture()
and releaseCapture()
APIs has been added. See Firefox bug 503943.
The existing document history object, available through the window.history
object, now supports the new HTML5 pushState()
and replaceState()
methods.
A new event has been added which, in concert with the window.mozRequestAnimationFrame()
method and window.mozAnimationStartTime
property, provides a way to create animations that are synchronized with one another.
Support has been added for touch and multi-touch events.
Several HTML elements have had their DOM interfaces changed to the ones required by the HTML5 specification, as shown below.
Interface in Firefox 3.6 Interface in Firefox 4 HTML ElementHTMLSpanElement
HTMLElement
<abbr>
, <acronym>
, <address>
, <b>
, <bdo>
, <big>
, <blink>
, <center>
, <cite>
, <code>
, <dd>
, <dfn>
, <dt>
, <em>
, <i>
, <kbd>
, <listing>
, <nobr>
, <plaintext>
, <s>
, <samp>
, <small>
, <strike>
, <strong>
, <sub>
, <sup>
, <tt>
, <u>
, <var>
, <xmp>
HTMLDivElement
HTMLElement
<noembed>
, <noframes>
, <noscript>
HTMLWBRElement
HTMLElement
<wbr>
Miscellaneous DOM changes
<textarea>
element can now be controlled via the DOM, via the wrap
DOM attribute. Firefox bug 41464<script>
elements created using Document.createElement()
and inserted into a document now behave according to the HTML5 specification by default. Scripts with the src
attribute execute as soon as available (without maintaining ordering) and scripts without the src
attribute execute synchronously. To make script-inserted scripts that have the src
attribute execute in the insertion order, set .async=false
on them.File
objects now offer a url
property.HTMLElement.isContentEditable
property has been implemented.Document.currentScript
property lets you determine which <script>
element's script is currently executing. The new beforescriptexecute
and afterscriptexecute
events are fired before and after a script element executes.mozSourceNode
property to the DataTransfer
object.Selection.modify()
method to the Selection
object; this lets you easily alter the current text selection or cursor position in a browser window.window.directories
object and the directories
feature for window.open
, which are not supported in any other browser, has been removed. Use personalbar
instead. Firefox bug 474058MouseEvent.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.Document
readystatechange
event has been implemented.Document.createElement()
method no longer accepts <
and >
around the tag name in quirks mode.Element.setCapture()
and Document.releaseCapture()
methods have been added, allowing elements to continue tracking mouse events even while the mouse is outside their normal tracking area after a mousedown
event has occurred.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.Navigator.appVersion
and Navigator.userAgent
. Use Navigator.language
or the Accept-Language
header instead. Firefox bug 572656XMLHttpRequest
object now exposes the response as a JavaScript typed array as well as a string, using the Gecko-specific mozResponseArrayBuffer
property.mozPressure
property indicating the amount of pressure on supported pressure-sensitive input devices.URL.createObjectURL()
and URL.revokeObjectURL()
methods let you create object URLs which reference local files.DOMImplementation.createHTMLDocument()
method lets you create a new HTML document.Node.mozMatchesSelector()
now throws a SYNTAX_ERR
exception if the specified selector string is invalid, instead of incorrectly returning false
.element.style.fill = 'lime'
. See style
for details.privatebrowsingmode
attribute that describes the state of private browsing mode, including an indication of whether private browsing is temporary or permanent for the session.window.getComputedStyle()
method is now optional, as it is in every other major browser.StorageEvent
object now matches the latest version of the specification.setTimeout()
and setTimeout()
method is now a preference, dom.min_timeout_value
.MozAfterPaint
event is no longer sent by default, due to a potential security issue. It can be re-enabled by setting a preference.Content Security Policy (CSP) is a Mozilla proposal designed to help web designers and server administrators specify how content on their websites interacts. The goal is to help detect and mitigate attacks including cross-site scripting and data injection attacks.
HTTP Strict Transport Security is a security feature that lets a website tell browsers that it should only be communicated with using HTTPS, instead of using HTTP.
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.
As a means to reduce the amount of data and entropy sent out in HTTP requests (see Firefox bug 572650), the crypto strength and language tokens have been removed from the user agent string.
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 toolsThe Web Console tool is a useful debugging aid for web developers and extension developers alike.
Note: The Error Console is disabled by default starting in Gecko 2.0. You can re-enable it by changing the devtools.errorconsole.enabled
preference to true
and restarting the browser.
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.
If you're a theme developer, you should read Theme changes in Firefox 4 to understand some critical changes you'll need to be aware of.
JavaScript code modulesThe 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.
The JS-ctypes API makes it possible to call C-compatible foreign library functions without using XPCOM.
The new Add-ons Manager provides information about installed add-ons, support for managing them, and provides ways to install and remove add-ons.
The new popup notifications module makes it easy to present attractive, non-modal notifications to the user. You can see how to use this API in Using popup notifications.
You can now load JavaScript code modules using chrome: URLs, even inside JAR files.
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.
The PerfMeasurement.jsm
code module provides an API to measure CPU-level performance data in JavaScript code.
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.ChromeWorker
A new type of worker for privileged code; this lets you use things like js-ctypes from workers in extensions and application code.
Support for (non-standard) touch events has been added; these let you track multiple fingers moving on a touch screen at the same time.
Several changes were made to the <xul:tabbrowser>
element that impact extensions that interact with tabs. In addition to supporting app tabs, these changes also change the tab bar into a standard toolbar, which lets the user drag toolbar buttons into it.
TabClose
, TabSelect
, and TabOpen
events no longer bubble up to the <xul:tabbrowser>
element (gBrowser
). Event listeners for those events should be added to gBrowser.tabContainer
rather than to gBrowser
directly.<xul:tabbrowser>
. It can therefore be overlaid directly with XUL overlays. It can also be accessed more directly in JavaScript via gBrowser.tabContextMenu
. See this blog post for more details.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.showOnlyTheseTabs
method; this is used by Firefox Panorama.getIcon
method, which lets you get a tab's favicon without having to pull up the <xul:browser>
element.tabbrowser.tabs
property, which lets you easily get a list of the tabs in a <xul:tabbrowser>
element.pinTab
and unpinTab
methods let you pin and unpin tabs (that is, switch them between being app tabs and regular tabs).getTabModalPromptBox
method and tabModalPromptShowing
attribute to the <xul:tabbrowser>
to support tab-modal alerts.<xul:popup>
element is no longer supported; you should use <xul:menupopup>
instead. (If you continue using popup
, you will encounter glitches, since the element has no special meaning anymore. For example, <xul:menuseparator>
can appear transparent when used in a <xul:popup>
.)<xul:menupopup>
XUL element now has a triggerNode
property, which indicates the node on which the event occurred that caused the popup to open. This also required the addition of a trigger event parameter to the openPopup
method. Also, the anchorNode
property has been added; it returns the anchor specified when the popup was created.<xul:panel>
element now offers fade
and flip
attributes, which are used to configure the behavior of new "arrow" style notification panels.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 unless you create the preference dom.allow_XUL_XBL_for_file
and set it to true
. There is, however, a whitelist feature that can be used to allow specific domains to load remote XUL.
readonly
attribute now correctly works for XBL fields.<xul:resizer>
element now lets you use the element
attribute to specify an element to resize, instead of resizing the window.<xul:resizer>
element now has a type
attribute that lets you specify that the resizer is for a window instead of an element, to prevent the window resizer from being drawn twice."active"
attribute no longer gets set on active XUL windows. Instead, you can use the new :-moz-window-inactive
pseudoclass in order to assign different styles to background windows.emptytext
attribute is now deprecated; you should use placeholder
instead.<xul:window>
element now offers an accelerated
attribute; when true, the hardware layer manager is permitted to accelerate the window.<xul:stack>
element now supports the bottom
and right
attributes.<xul:toolbox>
customization, allowing you to detect changes to toolbars.alternatingbackground
attribute for <xul:tree>
elements is no longer supported; you can use the :-moz-tree-row
pseudo-class instead.<xul:tabs>
element now has a tabbox
property, replacing the old _tabbox
property, which has been deprecated (and was never documented).<xul:window>
elements now have the drawintitlebar
attribute; if this is true
, the window's content area includes the title bar, allowing drawing into the title bar.TabPinned
and TabUnpinned
events are available, allowing you to detect when tabs are pinned and unpinned.TabAttrModified
event is sent when a tab's label
, crop
, busy
, image
, or selected
attributes change.<xul:tab>
elements now have a pinned
attribute, letting you determine whether or not a tab is currently pinned.setDirectionIndicator
class on <xul:tree>
elements hasn't done anything for some time now; now it's not used at all anymore.<xul:window>
element now has a chromemargin
attribute that lets you set the margin between chrome and content on each side of a window; you can use this to draw into the title bar, for example.<xul:window>
element now has a disablechrome
attribute; this is used to hide most of the chrome in a window when it's being used to display in-browser UI, such as about:addons
.<xul:window>
element now has a disablefastfind
attribute, which lets you disable the find bar in a window when the content doesn't support it. This is used, for example, by the add-ons panel.<xul:toolbox>
, by setting the toolboxid
property of the <xul:toolbar>
. Also, the <xul:toolbox>
element now has a externalToolbars
property, which lists all the toolbars that are considered members of the toolbox.The status bar has been removed in favor of the new add-on bar. You'll need to update your extension to use this if you've been adding UI to the status bar in the past.
You can now hide the browser's chrome when it's desirable to do so; for example, about:addons
does this.
mozIStorageBindingParamsArray
interface now has a length attribute that indicates the number of mozIStorageBindingParams
objects in the array.mozIStorageStatement.bindParameters()
method now returns an error if the specified mozIStorageBindingParamsArray
is empty.mozIStorageConnection.clone()
method, which lets you clone an existing database connection.mozIStorageConnection.asyncClose()
method, which lets you close a database connection asynchronously; you specify a callback to be notified when the close operation is complete.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.SQLITE_CONSTRAINT
error is now reported as NS_ERROR_STORAGE_CONSTRAINT
instead of as NS_ERROR_FAILURE
.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.
Details about changes to XPCOM that impact compatibility in Firefox 4.
This new method returns the global object with which an object is associated; this replaces a common use case of the now-removed __parent__
.
nsINavHistoryResult
, nsINavHistoryQueryOptions
, and nsINavHistoryContainerResultNode
interfaces. More significantly, the nsINavHistoryResultViewer
interface has been renamed to nsINavHistoryResultObserver
.places-connection-closed
notification is available to know when the Places service has completed its shutdown process.<menupopup type="places">
has been removed. Instead, you need to create and populate a menu with Places information manually, instead of having it done for you. See Displaying Places information using views: Menu view for details.nsIDocShell
and nsIWebBrowser
interfaces now have a new isActive
attribute, which is used to allow optimization of code paths for documents that aren't currently visible.nsIMemory
method nsIMemory.isLowMemory()
has been deprecated. You should use "memory-pressure" notifications to watch for low memory situations instead.nsIChannelEventSink.onChannelRedirect()
needs to be updated to use nsIChannelEventSink.asyncOnChannelRedirect()
instead. This accepts a callback handler that must be called when a redirect is successfully completed.nsINavHistoryResultObserver.batching()
method has been added, providing a way to group Places operations into batches, reducing the number of update notifications delivered, which can improve performance when observers are performing relatively involved tasks (such as refreshing views).nsIPref
interface has finally been removed. If you haven't already switched to nsIPrefService
, now is the time.nsISessionStore
and nsISessionStartup
interfaces received changes to support on-demand session restore. See the nsISessionStore.restoreLastSession()
method.nsIPrincipal
methods nsIPrincipal.subsumes()
and nsIPrincipal.checkMayLoad()
, as well as its origin
, csp
, and URI
attributes, are now available from script; previously they were only available from native code.nsIPrompt
interface now supports tab-modal alerts; see Using tab-modal prompts for details.nsIEffectiveTLDService.getPublicSuffixFromHost()
method now correctly rejects host name starting with a period (".").mozIJSSubScriptLoader.loadSubScript()
method now has an optional argument allowing you to specify the character set of the script; if one is not provided, ASCII is assumed (as was always assumed previously).nsIAccessProxy
interface has been removed. It was an implementation detail that has outlived its usefulness.nsIContentView
and nsIContentViewManager
interfaces have been added for Firefox Mobile. It represents a scrollable content view whose contents are actually drawn by a separate process.nsIDiskCacheStreamInternal
interface has been added.nsIExternalURLHandlerService
interface has been added.nsISyncJPAKE
interface has been added. See Firefox bug 601645.nsIINIParserWriter
interface was added in Gecko 1.9.2.4 to support writing to INI files.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.
omni.jar
, which improves startup performance by reducing I/O. For details, read About omni.jar.accessibility.disablecache
preference is no longer supported; it was only exposed for debugging purposes and is no longer used.Only the root chrome.manifest
file is loaded now; if you need secondary manifest files to be loaded, you can use the manifest
command in your root chrome.manifest
to load them.
The Gopher protocol is no longer supported natively. Continued support is available via the OverbiteFF extension.
In order to support out-of-process plugins and other multiple-process features, a new API has been introduced to support sending messages across processes.
You can now create extensions that can be installed, uninstalled, and upgraded (or downgraded) without requiring a browser restart.
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 Firefox bug 533891.
nsIExtensionManager
has been replaced by AddonManager.
Firefox no longer creates child HWNDs for its internal use on Windows. If you've written an extension that uses native code to manipulate these HWNDs, your extension will not work on Firefox 4. You'll need to either stop using HWNDs or wrap your code that relies on HWNDs in an NPAPI plugin. That's a lot of work, so if you can avoid using HWNDs directly, you should.
The three finger up and down swipe gestures on trackpads have been changed to, by default, open and close Firefox Panorama view (neé TabCandy). To change these back to the previous scroll-to-top and scroll-to-bottom commands, open about:config and set browser.gesture.swipe.down
to cmd_scrollBottom
and browser.gesture.swipe.up
to cmd_scrollTop
.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.3