Accessibility/AT-SPI Support

  • Revision slug: Accessibility//AT-SPI_Support
  • Revision title: Accessibility/AT-SPI Support
  • Revision id: 143972
  • Created:
  • Creator: DavidBolter
  • Is current revision? No
  • Comment /* Supported AT-SPI Roles */

Revision Content

Mozilla AT-SPI Support for Linux/UNIX Assistive Technology Developers

This FAQ explains how makers of Linux- or UNIX- based screen readers, voice dictation packages, onscreen keyboards, magnification software and other assitive technologies can support Gecko-based software. The base of our support for these products is AT-SPI (Assistive Technology Service Provider Interface) and the keyboard API/user interface.

For Firefox and all other Gecko-based products: this documentation only applies to up-to-date builds of Firefox -- currently not available on official releases. Grab the current build of Firefox which supports these features

To Do

  • Document dynamic content, such as how to track mutations
  • Document text selection
  • Update list of supported features for each role
  • Go through XXX notes and file bugs or deal with questions
  • Add DHTML examples
  • Go through Bill's notes in HTML examples and remove or integrate
  • Explain embedded object characters and other new things in http://www.mozilla.org/access/unix/new-atk
  • Describe how to know where forced and soft line breaks are
  • Fix HTML Examples table, the wiki format is messed up

Definitions

Here are some basic definitions that you'll need for this document to make sense:


Gecko:
The rendering engine for Firefox, Thunderbird, Nvu, Mozilla Seamonkey and other applications. Gecko is the internal engine that Mozilla uses to render any kind of web content. It supports HTML, XHTML, Cascading Style Sheets (CSS) and the Document Object Model (DOM).
Assistive Technology Service Provider Interface (AT-SPI)
an API devised by Sun Microsystems so that accessibility aids can track what's going on inside the user interface of any software package that supports it. If you seriously need to understand AT-SPI, you'll need to read the docs on gnome.org and play with the available sample apps and code, such as at-poke. Please note that the web docs are sometimes out of date, and the latest AT-SPI is available on CVS.
DOM: Document Object Model
This is the W3C's specification for how web content is exposed to Javascript and other languages. It covers content, style and events. Inside the Gecko process, code has full access to DOM APIs. However, exposing the entire DOM to external software packages is quite involved, partially because changes to the DOM in Firefox must occur on the main thread. We have chosen a subset of readonly methods in the DOM needed for assistive technology vendors. Events such as focus changes must be tracked through AT-SPI events, rather than DOM events.
XUL: eXtensible User-interface Language
The XML-based language used by Firefox and Mozilla to develop the UI. Similar to HTML in that it can be combined with CSS and Javascript to make powerful applications. Contains more desktop-style widgets than HTML and follows a box layout model, rather than being text-flow based.
AJAX: Asynchronous JavaScript And XML
AJAX is a method of building interactive web applications that process user requests, user actions immediately in real time, unlike an HTTP request, during which users must wait for a whole page to reload or for a new page to load. Data is therefore stored and retrieved dynamically much faster.
Roles, states and events
please read the AT-SPI documentation if you are unfamiliar with these.


AT-SPI tree vs. DOM tree - what's the relation?

The AT-SPI tree and the DOM tree are parallel structures, although the AT-SPI tree is a subset of the DOM tree. QueryInterface() can be used to switch between the interfaces (Accessible, AccessibleText, AccessibleValue, etc.).

What is exposed? Any DOM node that ...


  • Is focusable
  • Is formatted with a blank line before and after (display:block in web jargon)
  • Conveys important information about the structure of the document, such as a heading
  • Contains a value that can change
  • Uses a dynamic content role attribute that is not equal to "presentation"
  • Uses one of the universal dynamic content property attributes, which are currently aaa:describedby, aaa:labelledby, aaa:required or aaa:invalid
  • Uses an onclick handler
  • Is in list of accessible elements in the role table


Linux/UNIX Applications Based on the Gecko Layout Engine

Gecko is a rendering engine that Firefox, SeaMonkey, Netscape and yelp use. Gecko can render a variety of content, not just HTML and supports key web standards such as Cascading Style Sheets, Javascript and the W3C DOM. Gecko also handles the users keystrokes and mouse clicks. Gecko is the core architecture that we are adding accessibility to, in order to support basic accessibility in all applications that are based on it.

The Mozilla Gecko engine must be version 1.9 or later to have high quality AT-SPI support, as documented here.

Embedded Clients

Embedded clients use Gecko only in the content window, at the moment for HTML and generic XML only. They typically use standard Windows controls for their user interface -- the area outside of the client content window, plus the context menu.

  • Yelp help viewer. No version is yet known to be available that uses a recent enough version of the Mozilla Gecko engine, for quality AT-SPI support.
  • Evolution email: no version is yet known to be available that uses a recent enough version of the Mozilla Gecko engine, for quality AT-SPI support.
  • Many more applications exist and are expected to be released


XUL-Based Clients

XUL-based clients make full use of the Gecko architecture, not only for HTML content, as well as for menus, dialogs and the entire user interface via an XML language called XUL (eXtensible User-interface Language). None of the user interface contains standard Windows controls -- not even the menus! This is done to ensure a common look and feel across all supported platforms, and to allow for different skins (appearances).

Determining if Accessibility is Enabled in a Firefox Installation

See the about:accessibilityenabled Firefox extension.

How to Find the Content Window and Load the Document

In XUL-based clients, screen readers may need to find the content window so that they know where to start grabbing the AT-SPI tree, in order to load the current document into a buffer in their own process.

Use RELATION_EMBEDS on the ROLE_FRAME, which is at the root of each top level window. This will point to the root content accessible(s) for that XUL window.

When you see the content window receive focus, first check the role. If it is a ROLE_DOCUMENT_FRAME then this should be treated as a document for the default modality of the screen reader. If it is a ROLE_EMBEDDED, ROLE_DIALOG or ROLE_ALERT then stay in focus tracking mode -- there is no need to parse the document. In addition, if it is a ROLE_ALERT, a screen reader should treat it as a message box -- that is, to read the entire contents. These roles can occur on content because of the new Accessible DHTML technology which allows the author to specify the type of document or container.

Gecko also helps determine when to load a new window by firing the following document events: document:load-complete, document:reload and document:load-stopped

Supported AT-SPI Interfaces

Interface Supported Notes
Accessible Yes

See supported object attributes below

Action Yes All methods
Application Yes All methods
Component Yes All methods
Desktop No
Document Yes All methods?
EditableText Yes All methods
Event Yes

See supported events below

Hyperlink Yes Any object embedded in text is considered a hyperlink!
Hypertext Yes Any text with objects embedded in it is considered a hypertext!
Image No ROLE_IMAGE is supported, and is enough
LoginHelper No
Registry No?
Relation Yes

See supported relations below

Role Yes

See supported roles below

Selection Yes Not yet supported for text
Selector No
State Yes

See supported states below

StreamableContent No Could apply to plugins, but probably not objects rendered by Gecko
Table Yes In addition, the object attribute layout-guess=true when Gecko thinks the table is for layout, not for data
Text Yes

See supported text attributes below

Value Yes

Supported AT-SPI Roles

The following roles are currently supported:

  • XXX Needs updating -- this list is copied from MSAA document
Role Supported? Special features
ROLE_INVALID Not a role that can be supported
ROLE_ACCELERATOR_LABEL No
ROLE_ALERT XUL: <browsermessage><br /> DHTML: xhtml2:role="wairole:alert"
ROLE_ANIMATION No. Animated images use ROLE_GRAPHIC with STATE_ANIMATED.
ROLE_ARROW No
ROLE_CALENDAR No
ROLE_CANVAS No<br /> *** XXX File bug to support for <canvas> ***
ROLE_CHECK_BOX XUL: <checkbox><br /> HTML: <input type="checkbox"><br /> DHTML: role="wairole:checkbox" Fires object:state-changed when radiobutton is set/unset when checkbox is toggled. *** Note: Some objects which appear to be checkboxes are in fact cyclers and have ROLE_CELL. Look for the "cycles" attribute to handle these.
ROLE_CHECK_MENU_ITEM XUL: <menuitem type="checkbox"><br /> DHTML: *** XXX file bug to support via role="wairole:menuitemcheckbox" *** Supports STATE_CHECKED
ROLE_COLOR_CHOOSER No
ROLE_COLUMN_HEADER XUL: tree column headers<br /> HTML: <th><br /> DHTML: role="wairole:columnheader"
ROLE_COMBO_BOX XUL: <menulist><br /> HTML: <select size="1"><br /> DHTML: role="wairole:combobox" What event do we fire for changes in closed combo box?
ROLE_DATE_EDITOR No
ROLE_DESKTOP_ICON No
ROLE_DESKTOP_FRAME No
Role Supported? Special features
ROLE_DIAL No
ROLE_DIALOG <p> XUL: <dialog><br /> DHTML: role="wairole:dialog"</p> accessible name exposes the <title> of the current dialog
ROLE_DIRECTORY_PANE No
ROLE_DRAWING_AREA No
ROLE_FILE_CHOOSER Supported for native filepicker
ROLE_FILLER No
ROLE_FONT_CHOOSER No
ROLE_FRAME Top level window
ROLE_GLASS_PANE No
ROLE_HTML_CONTAINER No
ROLE_ICON No
ROLE_IMAGE XUL: <image><br /> HTML: <img> XUL: <image><br /> HTML: <img>
ROLE_INTERNAL_FRAME No
ROLE_LABEL XUL: <label><br /> HTML: <label><br /> DHTML: role="wairole:label" Supports RELATION_LABEL_FOR (although technically anthing can) <p> XUL: <label> or <description><br /> HTML: <label><br /> DHTML: role="wairole:label"</p>
ROLE_LAYERED_PANE No
ROLE_LIST XUL: <listbox><br /> HTML: <select size=""> where size > 1 -- STATE_READONLY is off<br /> HTML: <ol> or <ul> -- STATE_READONLY is on<br /> DHTML: role="wairole:list"
ROLE_LIST_ITEM XUL: <listitem><br /> HTML: <li>, <option> or <optgroup> <br /> DHTML: role="wairole:listitem" Sets STATE_SELECTED if the current listitem is selected.<br /> <br /> *** XXX Perhaps should support object attribute "level" when in ROLE_TREE or ROLE_TREE_TABLE, see <a href="#obj-attr">object attributes</a> section ***
ROLE_MENU XUL: <menuitem> with children<br /> DHTML: role="wairole:menuitem" with child menuitems *** XXX does this work? ***
ROLE_MENU_BAR XUL: <menubar><br /> DHTML: role="wairole:menubar"
Role Supported? Special features
ROLE_MENU_ITEM <p> XUL: <menuitem><br /> DHTML: role="wairole:menuitem"</p>
ROLE_OPTION_PANE No
ROLE_PAGE_TAB XUL: <tab><br /> DHTML: role="wairole:tab"
ROLE_PAGE_TAB_LIST <p> XUL: <tab><br /> DHTML: role="wairole:tablist"</p>
ROLE_PANEL XUL: <radiogroup>, <groupbox>, <iframe><br /> HTML: <fieldset>, <frame>, <iframe><br /> DHTML: role="wairole:group", role="wairole:radiogroup"
ROLE_PASSWORD_TEXT XUL: <textbox type="password"><br /> HTML: <input type="password"><br /> DHTML: role="wairole:secret"
ROLE_POPUP_MENU No, apparently we use ROLE_MENU even for the context menu. XXX *** Is this right? *** Supports Text and EditableText interfaces
ROLE_PROGRESS_BAR XUL: <progressmeter><br /> DHTML: role="wairole:progressbar" <p> Fires "object:property-change:accessible-value" when progressbar moves by at least 3%</p> <p> Supports Value interface</p>
ROLE_PUSH_BUTTON <p> XUL: <button><br /> HTML: <input type="button"> or<button><br /> DHTML: role="wairole:button"</p>
ROLE_RADIO_BUTTON XUL: <radio><br /> HTML: <input type="radio"><br /> DHTML: role="wairole:radio" <p> Fires object:state-changed when radiobutton is set/unset</p>
ROLE_RADIO_MENU_ITEM XUL: <menuitem type="radio"><br /> DHTML: *** XXX file bug to support via role="wairole:menuitemradio" * Supports STATE_CHECKED
ROLE_ROOT_PANE No
ROLE_ROW_HEADER DHTML: role="wairole:columnheader"
ROLE_SCROLL_BAR Not yet, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=285167">bug 285167</a>
ROLE_SCROLL_PANE No
Role Supported? Special features
ROLE_SEPARATOR XUL: <separator><br /> HTML: <hr><br /> DHTML: role="wairole:separator"
ROLE_SLIDER XUL:slider should be supported soon via <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=109215"> <span style="color: #0000ff">bug 109215</span></a><br /> DHTML: role="wairole:slider" Fires "object:property-change:accessible-value" when slider thumb is moved<br /> <br /> Supports Value interface
ROLE_SPIN_BUTTON DHTML: role="wairole:spinbutton" Fires "object:property-change:accessible-value" when changed<br /> <br /> Supports Value interface
ROLE_SPLIT_PANE No
ROLE_STATUS_BAR XUL: <statusbar>
ROLE_TABLE HTML: <table><br /> DHTML: role="wairole:grid" Supports Table interface<br /> Supports object attribute "layout-guess", see <a href="#obj-attr">object attributes</a> section
ROLE_TABLE_CELL HTML: <td><br /> DHTML: role="wairole:gridcell" *** XXX Perhaps should support object attribute "level" when in ROLE_TREE or ROLE_TREE_TABLE, see <a href="#obj-attr">object attributes</a> section ***
ROLE_TABLE_COLUMN_HEADER HTML: <th><br /> DHTML: role="wairole:columnheader" *** XXX Actually, do we use this one or ROLE_COLUMN_HEADER? ***
ROLE_TABLE_ROW_HEADER DHTML: role="wairole:rowheader" *** XXX Actually, do we use this one or ROLE_ROW_HEADER? ***
ROLE_TEAROFF_MENU_ITEM No
ROLE_TERMINAL No
ROLE_TEXT HTML: fallback for display-block styled elements with no known semantic role for the tag<br /> DHTML: role="wairole:description"<br /> XXX *** We are using ROLE_TEXT for DHTML descriptions but ROLE_LABEL for XUL ones, that's inconsistent XXX Supports Text interface
ROLE_TOGGLE_BUTTON No
ROLE_TOOL_BAR XUL: <toolbar><br /> DHTML: role="wairole:toolbar"
ROLE_TOOL_TIP XUL: <tooltip> or tooltiptext attribute
ROLE_TREE No, XXX *** We should use this when there is only 1 column in the tree ***<br /> DHTML: ?
ROLE_TREE_TABLE XUL: <tree><br /> DHTML: role="wairole:tree" ?
ROLE_UNKNOWN No
ROLE_VIEWPORT No
ROLE_WINDOW No
ROLE_HEADER No
Role Supported? Special features
ROLE_FOOTER No
ROLE_PARAGRAPH HTML: <p>
ROLE_RULER No
ROLE_APPLICATION Root accessible object, parent of top level ROLE_FRAME's
ROLE_AUTOCOMPLETE XUL: <textbox type="autocomplete">
ROLE_EDITBAR No
ROLE_EMBEDDED DHTML: role="wairole:application"
ROLE_ENTRY  XUL: <textbox><br /> HTML: <input type="text"> or <textarea><br /> DHTML: role="wairole:textfield" or<br /> role="wairole:textarea" Supports Text interface
ROLE_CHART No
ROLE_CAPTION HTML: <caption>
ROLE_DOCUMENT_FRAME HTML: <body> without a role on the <html> or <body> element (unless that is wairole:document)<br /> DHTML: role="wairole:document" Supports Document interface<br /> Fires object:state-changed for busy state when document load begins or ends
ROLE_HEADING HTML: <h1>, <h2>, <h3>, <h4>, <h5>, <h6> Supports Text interface<br /> <br /> Supports object attribute "level", see <a href="#obj-attr">object attributes</a> section ***
ROLE_PAGE No
ROLE_SECTION HTML: <div> Supports Text interface
ROLE_FORM HTML: <form> Supports Text interface
ROLE_REDUNDANT_OBJECT No
ROLE_LINK XUL: <label class="text-link"><br /> HTML: <a>, <area><br /> DHTML: role="wairole:link"
ROLE_INPUT_METHOD_WINDOW No
Role Supported? Special features

Supported AT-SPI States

The following states are currently supported:

State Supported? Where used
STATE_INVALID No Not a usable state -- should not be confused with STATE_INVALID_ENTRY for form controls, which is supported
STATE_ACTIVE Yes Top level window
STATE_ARMED No *** XXX Where should this be supported? Same as MSAA's STATE_HASPOPUP? ***
STATE_BUSY Yes Documents which are loading
STATE_CHECKED Yes Checkboxes as well as checkable menuitems and treeitems
STATE_COLLAPSED Yes Outline items which have children but are not expanded -- always used with STATE_EXPANDABLE
STATE_DEFUNCT Yes Old objects which are no longer available
STATE_EDITABLE Yes Anything that supports the EditableText interface
STATE_ENABLED Yes Form controls
STATE_EXPANDABLE Yes Outline items which have children
STATE_EXPANDED Yes Outline items which are expandable and the children are shown -- always used with STATE_EXPANDABLE
STATE_FOCUSABLE Yes Nearly any element can be focusable
STATE_FOCUSED Yes Only 1 item at a time is ever focused -- always used with STATE_FOCUSABLE
STATE_HAS_TOOLTIP No *** XXX Need to file bug ***
STATE_HORIZONTAL No *** XXX need to file a bug for this and STATE_VERTICAL -- check XUL CSS ***
STATE_ICONIFIED No
STATE_MODAL Yes Modal dialog boxes
STATE_MULTI_LINE Yes ROLE_ENTRY -- always used with STATE_EDITABLE
STATE_MULTISELECTABLE Yes ROLE_TREE, ROLE_LIST, ROLE_TREE_TABLE. Indicates that Enter will insert a new line.
STATE_OPAQUE No
STATE_PRESSED Yes ROLE_BUTTON
STATE_RESIZABLE No
STATE_SELECTABLE Yes ROLE_TREEITEM, ROLE_TABLE_CELL, ROLE_LIST_ITEM
STATE_SELECTED Yes ROLE_TREEITEM, ROLE_TABLE_CELL, ROLE_LIST_ITEM -- always used with STATE_SELETABLE
STATE_SENSITIVE No Where should this be used?
STATE_SHOWING Yes Anything
STATE_SINGLE_LINE Yes ROLE_ENTRY -- always used with STATE_EDITABLE. Indicates that Enter will submit the default button.
STATE_STALE No Where should this be used?
STATE_TRANSIENT Yes Where should this be used?
STATE_VERTICAL No *** XXX need to file a bug for this and STATE_HORIZONTAL -- check XUL CSS ***
STATE_VISIBLE Yes Absence of this state is important on documents, popups and tree items
STATE_MANAGES_DESCENDANTS No Not needed, although potentially useful for trees
STATE_INDETERMINATE No *** XXX File bug to support this based on nsIAccessible::STATE_MIXED. Should work on ROLE_CHECK_BOX, ROLE_TREE_ITEM, ROLE_LIST_ITEM, ROLE_PROGRESS_BAR ***
STATE_REQUIRED Yes XForms form controls, and any element with aaa:required="true"
STATE_TRUNCATED No Where should we use this?
STATE_ANIMATED Yes Animated images.
STATE_INVALID_ENTRY Yes XForms form controls, and any element with aaa:invalid="true"
STATE_SUPPORTS_AUTOCOMPLETION No *** XXX File bug to support this ***
STATE_SELECTABLE_TEXT Yes Anything that supports the Text interface
STATE_IS_DEFAULT Yes Default ROLE_BUTTON's, such as OK in XUL dialogs or Submit in HTML
STATE_VISITED Yes ROLE_LINK

Supported AT-SPI Relations

The following relations are currently supported:


enum {RELATION_LABEL_FOR = 0x1002 };
enum {RELATION_DESCRIPTION_FOR = 0x100f };

These two relations can be used on object to determine what form control is being labelled or desribed.


enum {RELATION_LABELLED_BY = 0x1003 };
enum {RELATION_DESCRIBED_BY = 0x100e };


These two relations are they inverse; they can be used on form controls. If the form control has an accName, you can get the IAccessible that it was labelled by in order to get more formatting information. It is also useful to check for a description.

Note that the label and description relations may be used to prevent redundant information from being presented by the screen reader, since the label and description can occur both on their own, and in the name or description fields of an IAccessible.


enum {RELATION_EMBEDS = 0x1009 };


This relation is used on the root accessible object for a top level Mozilla window, corresponding to what's returned for OBJID_CLIENT for that window. It points to the accessible object corresponding to the root of content in that window. This relation is very useful for finding the content quickly, and will be the proper method for finding content in Firefox 3 and beyond.


enum {RELATION_CONTROLLED_BY = 0x1000 };
enum {RELATION_CONTROLLER_FOR = 0x1001 };


These two relations show what form controls may dynamically change areas of the document, in response to user changes in the form controls themselves. Both controlled_by and controller_for are set in markup from the single dynamic content accessibility dynamic content aaa:controls attribute. The inverse controlled_by relation is automatically calculated.


enum {RELATION_FLOWS_TO = 0x1006 };
enum {RELATION_FLOWS_FROM = 0x1007 };


These two relations allow the reading flow to break out of the normal DOM flow. Both flows_to and flows_from are set in markup from the single dynamic content accessibility aaa:flowsto relation -- the inverse flow_from relation is automatically calculated.

Supported AT-SPI Object Attributes

The following object attributes are currently supported:

Note: see AJAX:WAI_ARIA_Live_Regions/API_Support for additional special object attributes that improve the processing of live changes.

Object attribute Applies to (content/UI/any/{{mediawiki.external('role')}}) Possible values
atomic any "true" when the entire region should be presented as a whole, when changes within it are considered important enough to automatically present. Often goes with live property. Generally set via ARIA properties.
channel any "notify" when live changes can be presented alongside changes of the same politeness level. If a second channel is not available, the live changes should be prioritized slightly higher than changes of the same politeness. The attribute container-channel gives the computed value for this node (e.g. if there is any container element with the channel attribute the closes thing with the channel attribute wins).
checkable any widget that has internal STATE_CHECKABLE "true" when the widget is known to behave like a checkbox. Note some widgets which appear to be checkboxes might in fact be cyclers (see "cycles" below). Action 0 is named either "check" or "uncheck".
cycles ROLE_CELL "true" when the tree cell is a cycler, which means each click will cycle to the next option. In this case action 0 is called "cycles", which moves to the next option in the same way a manual click does.
datatype any widget that accepts input A qname that refers to an XSD (schema) defined type. For example, a datatype may be xsd:integer. When this is not specified, the default is string, unless the Value interface is exposed, which indicates the type is numeric. For more information please read about schema datatypes.
formatting any object that supports the hypertext interface "block" if the object uses block formatting, and thus starts on a new line and ends with a hard line break that is not visible in the actual text. For example, a heading, paragraph or list item are typically formatted as a block, but there is no requirement that they do so. Their formatting may have been changed with CSS. An example of this is often horizontal navigation bars with list items that are formatted with CSS display: inline.
haspopup any "true" when the object displays a pop-up menu or window when invoked.
id any Any value, defined by UI/content developers. Used to indicate a persistant identifier for any object, useful for scripting
layout-guess ROLE_TABLE "true" when Gecko's heuristic determines that it is a table that is probably used for layout, not for table.
Value not set means it is probably a data table.
level any For headings, the heading level. For outline items, the indentation level. For diagrams with levels, each item can have its level specified.
live any A hint as to whether changes within the current region or subtree should be automatically presented. Possible values are "off" which is the same as not being set -- this means the region is not live. Other possible values are "polite", "assertive" and "rude", which is a suggestion for the policy when interrupting the user for changes to this region. Please see the ARIA States and Properties module for more information. Additional information may be provide by the object attributes atomic and relevant.
posinset any If this item is in a group, what is the item number within the group, where the size is defined by the setsize attribute. The first item should have posinset="1", and the last item should have a posinset value equal to the setsize-1.
relevant any Space delimited string with keywords describing what kinds of changes in the subtree are informational, as opposed to presentational. If not specified, the default should be considered "additions text", which indicates that newly created objects and changes to text and text equivalents should be considered relevant, and that the hiding or removal of items is not. Please see the ARIA States and Properties module for more information.
setsize any If this item is in a group, this indicates the number of items in the group. This is useful when combined with the posinset object attribute.
sort any container if "ascending" or "descending", then child items within the container are currently sorted as indicated.
tag any The actual markup tag used to create this element (also used in XUL)
xml-roles any If a dynamic content accessibility role string is used, it is exposed here. This may provide more information than the AT-SPI role, which is best-fit. In the future, this may be a space or comma delimited list of roles

Supported AT-SPI Text Attributes

The following text attributes are currently supported:


Text attribute Possible values
static "true" for list bullet/numbering text or layout-inserted text (such as via CSS pseudo styles :before or :after)

Supported AT-SPI Document Attributes

The following document attributes are currently supported:

Document attribute Possible values Notes
W3C-doctype Equivalent to what is specified in the <!DOCTYPE> header This attribute cannot change for the lifetime of a document.
DocURL The location of the current document, including possibly a named anchor jumped to, for example http://www.mozilla.org#maincontent The document:attributes-changed event is fired if the DocURL changes due to a named anchor jump.
MimeType The mime or media type, such as text/plain, text/html, image/jpeg, image/svg+xml, application/xml+xhtml and application/vnd.mozilla.xul+xml. This attribute cannot change for the lifetime of a document.

Supported AT-SPI Events

The following events are currently supported:

  • object:focus
  • object:property-change ... *** XXX fill in list of properties we support this for ***
  • object:state-changed for ... *** XXX fill in list of states we support this for ***
  • object:text-changed:delete
  • object:text-changed:insert
  • object:text-selection-changed
  • object:text-caret-moved
  • object:selection-changed
  • window:activate
  • window:deactivate
  • document:load-complete
  • document:reload
  • document:load-stopped
  • document:attributes-changed


The event object:link-selected is purposely not supported, but focus events are fired on ROLE_LINK objects instead.

AT-SPI Features We Currently Do Not Support

As just stated, the event object::link-selected is purposely not supported, but focus events are fired on ROLE_LINK objects instead.

See Firefox 3 dependencies, and in particular the New ATK blocking bugs.

Known Differences with Other Applications

*** XXX To Be Done ***

Avoiding Memory Leaks

It is the assistive technology's responsibility to watch for events that indicate when windows or content subtrees are being destroyed, and to release all Accessible objects related to that window. In addition, STATE_DEFUNCT is set on objects that should be released by the assistive technology. XXX *** Indicate what events, I think we need to add object:children-changed:foo support ***

To help developers in that regard, there is Memory Leak monitor, a Firefox extension.

Keyboard User Interface and API

Fortunately, Gecko uses the standard keyboard API's for each supported platform.

The Mozilla keyboard shortcuts for content are similar to what is used in other browsers. Here is a list of Firefox keyboard shortcuts.


HTML Examples

Each AT-SPI accessible object is encapsulated in braces ("{}"), and meaningful AT-SPI interfaces and attributes, including specializations, are represented as name/value pairs inside the braces.
For convenience, accessible text is shown merely as 'text="contents of the text"'.
* = Embedded object character (0xfffc), used when no text from the object will be inserted in the parent Hypertext
HTML content HTML source AT-SPI representation

This is a heading

This is a paragraph with an <img src="image.gif" alt="some image"> image in it.

This is another heading

<h1>This is a heading</h1>
<p>
This is a paragraph with an
<image src="image.gif"
alt="some image"/>
image in it.
</p>
<h2>This is another heading</h2>
{parent Text, role=ROLE_HEADING, objattr="xhtml:tag=h1",
text-attributes="css:font-size=LARGER",
text="This is a heading"}
{parent Hypertext, role=ROLE_PARAGRAPH, attr="xhtml:tag=p"
text="This is a paragraph with an * image in it"}
{child Image, Hyperlink, role=ROLE_IMAGE,
ImageDescription ="some image",
AccessibleName = "" {{mediawiki.external('the HTML title attribute, if present')}}
hyperlink-range={{mediawiki.external(28,29)}}}
{parent Text, role=ROLE_HEADING, objattr="xhtml-role:h2",
text-attributes="css:font-size=LARGE",
text="This is another heading"}

Hey!
Tell me something.

<p>Hey!<br>Tell me something.</p>
{parent Text, role=ROLE_PARAGRAPH, attr="xhtml:tag=p"}
text="Hey!\nTell me something"}
<a href="http://www.google.com/">Hey!
Tell me something.</a>
<a href="http://www.google.com">Hey!
<br>Tell me something.</a>
{parent Hyperlink, Text, role=ROLE_LINK
objattr="html:tag=a;link-type=anchor",
text="Hey!\nTell me something",
hyperlink-range={{mediawiki.external('depends on the containing context')}},
hyperlink-URI="http://www.google.com",
hyperlink-Object=Text}

Hey


Tell me something

<p>Hey</p><hr/>
<p>Tell me something</p>
{parent1 Text, role=ROLE_PARAGRAPH,

 text="Hey"}
{parent2 role=ROLE_SEPARATOR,
 {{mediawiki.external('note<span class=\"plain\">' .. : .. '</span> State doesn\'t include\nSTATE_VERTICAL, <br/>\n       to distinguish from vsep')}}}
{parent3 Text, role=ROLE_PARAGRAPH, 

 text="Tell me something"}

You are a nice person.

<p>
You <em>are</em> a nice person.
</p>
{parent Text,

role=ROLE_PARAGRAPH, attr="html:tag=p", 


       text="You are a nice

person",


       attribute run for

"are", with objattr="role

= html:em", textattr="css:text-style=oblique"}

Here is a <a href="http://foo.bar.com/">bartending site</a>.

<p>
  Here is a
  <a href="http://foo.bar.com">
   bartending site
  </a>
.
</p>
{parent Hypertext,

role=ROLE_PARAGRAPH, attr="html:tag=p"
  text="Here is a *.",
  attribute run for "bartending site." with textattr="link=true,    
  css:text-decoration=underline, css:color=(0,0,255)"}
   {child Text,  Hyperlink,
     role=ROLE_LINK, attr="html:tag=a, link-type:anchor",
     text="bartending site",
     hyperlink-indices={{mediawiki.external(10,11)}}

     hyperlink-URI="http://foo.bar.com"}

Here is a <a href="http://foo.bar.com/"> <img src="beerglass.GIF" alt="beer glass">bartending site</a>.

<p>
Here is a
<a href="http://foo.bar.com">
<image src="beerglass.GIF"
alt="beer glass"/>
bartending site
</a>
.
</p>
{parent Hypertext,

role=ROLE_PARAGRAPH, attr="html:tag=p"


       text="Here is a *."
 attribute run for "bartending site."

with textattr="link=true,    

      

css:text-decoration=underline, css:color=(0,0,255)"}

        {child

Hypertext, Hyperlink,

     
    

role=ROLE_LINK,

           text="*bartending site" 

           hypertext-indices={{mediawiki.external(10,11)}},

     [not sure if we need to dup textattrs

here, or add them to defaulttextattrs] ,

          

hypertext-URI="http://foo.bar.com"}

            

  {grandchild Image, Hyperlink

           

     role=ROLE_IMAGE, attr="html:tag=img, link-type=image"

          

   AccName/ImageDescription="beer glass",
             hyperlink-indices={{mediawiki.external(0,1)}}

            
       URI="beerglass.GIF"}
[don't know if the URIs should

always be fully specified, or if omitting the base URI is OK

       At the moment, not planning to do this, instead plan
         to expose repair text in the name if no alt/title exists ] 

Here is a <img src="beerglass.GIF" alt="beer glass"> <a href="http://foo.bar.com/"> bartending site</a> .

<p>
Here is a
<image src="beerglass.GIF"
alt="beer glass"/>
<a href="http://foo.bar.com">
bartending site
</a>
.
</p>
{parent Hypertext,

role=ROLE_PARAGRAPH, attr="html:tag=p", 
  text="Here is a **."}
   {child Image, Hyperlink,
     role=ROLE_IMAGE, attr="html:tag=img, link-type=image"
     AccName/ImageDescription="beer glass",
     hyperlink-indices={{mediawiki.external(10,11)}}
     hyperlink-URI="beerglass.GIF"}
   {child Text, Hyperlink, Action,
    Hypertext, role=ROLE_LINK,
     action-names="activate",

{{mediawiki.external('others?')}}
     attr="html:tag=a, link-type=anchor"
     text="bartending site",
     textattr=
{{mediawiki.external('as\nin above examples')}}
     hypertext-indices={{mediawiki.external(11,22)}},
     hypertext-URI="http://foo.bar.com"}

<p>
<IMG SRC="sitemap.gif"
ALT="Site map"
USEMAP="#mymap">
<MAP NAME="mymap" title="site map">
<AREA HREF="1.html" ALT="Bar"
COORDS="5,5,95,195">
<AREA HREF="2.html" ALT="Baz"
COORDS="105,5,195,195">
<AREA HREF="3.html" ALT="Fu"
COORDS="205,5,295,195">
</MAP>
</p>
{parent Hypertext, role=ROLE_PARAGRAPH,
text="*"}
{child Image, Hypertext, text=" ***", Hyperlink,
role=ROLE_IMAGE,
attr="html:tag=map",
ImageBounds={{mediawiki.external('entire map area')}}
AccName and ImageDescription="Site map"}
{grandchild Hyperlink, Action,
action-names="click", role=ROLE_LINK,
attr="html:tag=area", hyperlink-URI="1.html", name="Bar"}
{grandchild Hyperlink, Action,
action-names="click", role=ROLE_LINK,
attr="html:tag=area", hyperlink-URI="2.html", name="Baz"}
{grandchild Hyperlink, Action,
action-names="click", role=ROLE_LINK,
attr="html:tag=area", hyperlink-URI="3.html", name="Fu"}
{{mediawiki.external('note that the component bounds of the areas correspond to their rectangular bounding boxes')}}
     * This is a list item.
     * This is another list item.
<ul>
<li>This is a list item.</li>
<li>This is another list item.</li>
</ul>

{parent Object, role=ROLE_LIST, attr="css:list-style-type=disc"}
{child Text, role=ROLE_LIST_ITEM,
text="This is a list item.", attribute run "static" first 2 chars}
{child Text, role=ROLE_LIST_ITEM,
text="This is another list item.", attribute run "static" first 2 chars}
     
[Bill: we

should be able to support list-style=image, and "list-style-image=URL()", etc. this way.  In the above example, it's not clear whether the bullet should be a unicode char or just omitted and implied by the list style..  my guess is the latter (i.e. bullets don't appear in the text)]

  1. This is a list item.
  2. This is another list item.
<ol>
<li>This is a list item.</li>
<li>This is another list item.</li>
</ol>

{parent Object, role=ROLE_LIST, attr="html:tag=ol, css:list-style-type:decimal"}
{child Text, role=ROLE_LIST_ITEM,
text="1. This is a list item.", attribute run "static" first 3 chars}
{child Text, role=ROLE_LIST_ITEM,
text="2. This is another list item.", attribute run "static" first 3 chars}
  • This is a list item
    • Nested item 1.
    • Nested item 2.
  • This is another list item.
<ul>
<li>
This is a list item.
<ul>
<li>Nested item 1</li>
<li>Nested item 2</li>
</ul>
</li>
<li>This is another list item.</li>
</ul>


{parent Object, role=ROLE_LIST, attr="html:tag=ul, css:list-style-type=disc"}
{child Hypertext, role=ROLE_LIST_ITEM,
text="This is a list item.*"}
{grandchild Object, Hyperlink, role=ROLE_LIST,
attr="html:tag=ul, css:list-style-type=circle, link-type=child",
hyperlink-indices={{mediawiki.external(20,21)}},
hyperlink-URI="", {{mediawiki.external('Hmm, degenerate case here...')}} }
{great-grandchild Text, role=ROLE_LIST_ITEM, attr="html:tag=li"
text="Nested item 1"}
{great-grandchild Text, role=ROLE_LIST_ITEM, attr="html:tag=li"
text="Nested item 2"}
   {child Text, role=ROLE_LIST_ITEM,
text="This is another list item."}


{{mediawiki.external('Note that unlike user interface ROLE_LIST objects, these lists don\'t <br/>implement Selection, and the list items\' StateSets do not include <br/>STATE_SELECTABLE. There is a question here as to whether <ul> and <ol> elements<br/>should always implement Text or not. I think it would be better if they did not, unless they had <br/>non-empty text content, but this may prove impractical.')}}
<label for="self"> Tell me a little more: </label>
<textarea> I am a monkey

with a long tail. I like to swing from trees and eat bananas. I've

recently taken up typing and plan to write my memoirs. </textarea>
<form>
<div>
 <label for="self"/>
Tell me a little more:
</label>
</div>
<div>
<textarea>
I am a monkey with a long
tail. I like to swing from
trees and eat bananas. I've
recently taken up typing
and plan to write my memoirs.
</textarea>
</div>
</form>
{parent Object, role=ROLE_FORM, text=""}
{child1 Object, role=ROLE_SECTION? {{mediawiki.external('or should we use ROLE_PANE?')}} }
{grandchild Text,
role=ROLE_LABEL,
RELATION_LABEL_FOR=child2,
text="Tell me a little more:"}
{child2 role=ROLE_SECTION?}
{grandchild EditableText,
Relation, StateSet, Action,
ROLE_ENTRY,
text="I am a monkey with ..."},
RELATION_LABELLED_BY=child1,
STATE_MULTILINE,
STATE_REQUIRED allowed}

[ attribute run over the portion of the text scrolled into view?
CONTROLLER_FOR/CONTROLLED_BY for the scrollbar/viewport?
Alternative would be to treat all the text content as though it were visible, but that's no good
for magnifiers and ATs for the mobility-impaired. Probably the textarea needs to be expanded somewhat,
or at least fitted with Actions for scrolling plus text attribution for determining what parts of the text are
currently scrolled into view, without the AT client having to resort to bounds checking in the
"screen review" fashion. This is, however, a general problem with multiline text in viewports.
The relatively new Text getBoundedRanges API reduces the pain somewhat since you can
feed it the Component bounds and it will give you back the visible text.]

Check one or more: <input id="cb1" type="checkbox"><label for="cb1">Red</label> <input id="cb2" type="checkbox"><label for="cb2">Blue</label> <input id="cb3" type="checkbox"><label for="cb3">Green</label>

<form aaa:describedby="checkhelp">
<p>
<span
x2:tag="wairole:description"
id="checkhelp">
Check one or more:
</span>
<input id="cb1" type="checkbox"/>
<label for="cb1">Red</label>
<input id="cb2" type="checkbox"/>
<label for="cb2">Blue</label>
<input id="cb3" type="checkbox"/>
<label for="cb3">Green</label>
</p>
</form>
{parent Object,
role=ROLE_FORM,
attr="html:tag=form",
RELATION_DESCRIBED_BY=grandchild1,
text="?"}
{child Text,
role=ROLE_PARAGRAPH, attr="html:tag=p", text=""}
{grandchild1 Text,
role=ROLE_LABEL,
RELATION_DESCRIPTION_FOR=parent,
attr="html:tag=wairole:description"}
text="Check one or more:"}
{grandchild2 Action,
StateSet, role=ROLE_CHECK_BOX,
attr="html:tag=input", {{mediawiki.external('and same with other elements, expose html<span class=\"plain\">' .. : .. '</span>role')}}
{{mediawiki.external('note also that these objects do NOT have accessible names, because they are labelled;<br/> accessible-name would presumably come from the HTML title attribute or other attribute.<br/> This is mainly to make it easier for ATs to avoid highly redundant speech in these cases.')}}
RELATION_LABELLED_BY=grandchild3}
{grandchild3 Text,
role=ROLE_LABEL, text="Red",
RELATION_LABEL_FOR=grandchild2}
{grandchild4 Action,
StateSet, role=ROLE_CHECK_BOX,
RELATION_LABELLED_BY=grandchild5}
{grandchild5 Text,
role=ROLE_LABEL, text="Blue",
RELATION_LABEL_FOR=grandchild4}
{grandchild6 Action,
StateSet, role=ROLE_CHECK_BOX,
RELATION_LABELLED_BY=grandchild7}
{grandchild7 Text,
role=ROLE_LABEL, text="Green",
RELATION_LABEL_FOR=grandchild6}

{{mediawiki.external('RFE<span class=\"plain\">' .. : .. '</span> add RELATION_DESCRIBED_BY<br/> and RELATION_DESCRIPTION_FOR to match AT-SPI/DHTML. Also, I thought we had <br/> ROLE_FORM, but it seems not to be there. Did I miss something?')}}
      <label for="beverage">Make a selection:</label>
       <select id="beverage">
       <option>Water</option>
       <option>Wine</option>
       <option>Whiskey</option>
       </select>
     
<form>
<label for="beverage">
Make a selection:
</label>
<select id="beverage">
<option>Water</option>
<option>Wine</option>
<option>Whiskey</option>
</select>
</form>
{parent role=ROLE_FORM?}
{child Text,
role=ROLE_LABEL,
RELATION_LABEL_FOR=child,
text="Make a selection:"}
{child Action,
StateSet, Selection,
attr="html:tag=select",
role=ROLE_COMBO_BOX,
RELATION_LABELLED_BY}
{grandchild,
Text,
  StateSet=...SELECTABLE, SELECTED...,
attr="html:tag=option",
role=ROLE_LIST_ITEM, text="Water"}
{grandchild,
Text,
  StateSet=...SELECTABLE...,
attr="html:tag=option",
role=ROLE_LIST_ITEM, text="Wine"}
{grandchild Text,
StateSet=...SELECTABLE...,
role=ROLE_LIST_ITEM,
attr="html:tag=option",
text="Whiskey"}

[note that because the entry field is not editable, but just displays the current
selection, I think it should not be exposed (especially since it represents a node
which is not present in the HTML DOM. The list items need not implement Action,
since the Selection interface is used by the client to select among them.]

Which sports do you like?
<select name="sports" multiple="multiple" size="3"> <option>Hockey</option> <option>Basketball</option> <option>Football</option> <option>Baseball</option> </select>

<form>
<label for="sports">
Which sports do you like:
<br>
<select id="sports"
multiple="multiple"
size="3">
<option>
<img src="beerglass.gif"
alt="Beer"/>
Baseball
</option>
<option>Basketball</option>
<option>Football</option>
</select>
</label>
</form>
{parent role=ROLE_FORM?}
{child1 Text,
role=ROLE_LABEL,
RELATION_LABEL_FOR=child2,
text="Which sports do you like:\n*"}
{child2 Object,
accessible-name="sports" {{mediawiki.external('not sure exposing the id is a good idea though')}},
Selection, Hyperlink,
StateSet=...MULTISELECT...
attr="html:tag=select",
role=ROLE_LIST,
RELATION_LABELLED_BY=child2}
{grandchild1,
HyperText,
  StateSet=...SELECTABLE, SELECTED...,
attr="html:tag=option",
role=ROLE_LIST_ITEM, text="*Baseball"}
{great-grandchild Image, Hyperlink,
role=ROLE_IMAGE,
attr="html:tag=img, link-type=image",
hyperlink-URI="beerglass.gif",
hyperlink-indices={{mediawiki.external(0,1)}}}
{grandchild2,
Text,
  StateSet=...SELECTABLE...,
attr="html:tag=option",
role=ROLE_LIST_ITEM, text="Basketball"}
{grandchild3 Text,
StateSet=...SELECTABLE...,
role=ROLE_LIST_ITEM,
attr="html:tag=option",
text="Football"}
To do: HTML table example
To do: DHTML role example

Beyond HTML: Other Types of Web Content

  • You may have heard of some content types beyond HTML, and want to know if Gecko based products will support them:
  • DHTML and AJAX: Gecko and other browsers have long supported dynamic content, where the page appearance changes because of JavaScript. This can be used to create the appearance of desktop-style widgets like menus, spreadsheets and tree views which HTML lacks. Or, it can be used to completely change content on the fly, without loading a new page. Previously it was not posible to make this accessible, but Mozilla supports Accessible DHTML, which allows authors to make advanced widgets and web applications accessible.
  • MathML: an XML dialect used to display full math notation on web pages. Here's the ongoing Mozilla project to support MathML . We do not currently have plans to support MSAA for MathML - we will likely suggest use of the external DOM for this, because MSAA simply does not have the right semantics in it to support mathematics. MathML support is currently built into Firefox.
  • SVG : Scalable Vector Graphics. Essentially W3C's XML-based version of Flash - mixes well with other markup based content, supports the DOM and has accessibility features. Mozilla's SVG Project has been through several stalls and rebirths -- SVG will probably become more of a priority if other well known browsers support it. We will not know how, or whether, we will support SVG accessibility until a better implementation comes along. Firefox 1.5 supports SVG. Potentially it can make use of the same namespaced role and state attributes as DHTML accessibility, but it may require more powerful author-definable relationships.
  • XForms: XForms is the future of online forms as envisioned by the W3C. Drawing on other W3C standards like XML Schema, XPath, and XML Events, XForms tries to address some of the limitations with the current HTML forms model. One of the key features of XForms is accessibility. XForms accessibility development is currently being developed for Mozilla 1.9 (Firefox 3) by Alexander Surkov.
  • XUL: The XML-based language used by Firefox and Mozilla to develop the UI. Similar to HTML in that it can be combined with CSS and Javascript to make powerful applications. Contains more desktop-style widgets than HTML and follows a box layout model, rather than being text-flow based. In the future more standalone applications will use XUL via Xulrunner.

Questions or Comments?

Please discuss accessibility issues on the Mozilla Accessibility mailing list or on the Mozilla Accessibility IRC channel.

Revision Source

<h2 name="Mozilla_AT-SPI_Support_for_Linux.2FUNIX_Assistive_Technology_Developers">Mozilla AT-SPI Support for Linux/UNIX Assistive Technology Developers</h2>
<p>This FAQ explains how makers of Linux- or UNIX- based screen readers, voice dictation packages, onscreen keyboards, magnification software and other assitive technologies can support Gecko-based software. The base of our support for these products is AT-SPI (Assistive Technology Service Provider Interface) and the keyboard API/user interface.
</p><p>For Firefox and all other Gecko-based products: this documentation only applies to up-to-date builds of Firefox -- currently not available on official releases. Grab the <a class="external" href="http://developer.mozilla.org/en/docs/Accessible_DHTML">current build of Firefox which supports these features</a>
</p>
<h2 name="To_Do">To Do</h2>
<ul><li> Document dynamic content, such as how to track mutations
</li><li> Document text selection
</li><li> Update list of supported features for each role
</li><li> Go through XXX notes and file bugs or deal with questions
</li><li> Add DHTML examples
</li><li> Go through Bill's notes in HTML examples and remove or integrate
</li><li> Explain embedded object characters and other new things in http://www.mozilla.org/access/unix/new-atk
</li><li> Describe how to know where forced and soft line breaks are
</li><li> Fix HTML Examples table, the wiki format is messed up
</li></ul>
<h2 name="Definitions">Definitions</h2>
<p>Here are some basic definitions that you'll need for this document to make sense:
</p><p><br>
</p>
<dl><dt> <a class="external" href="http://www.mozilla.org/newlayout/faq.html">Gecko</a><span class="plain">:</span>
</dt><dd> The rendering engine for Firefox, Thunderbird, Nvu, Mozilla Seamonkey and other applications. Gecko is the internal engine that Mozilla uses to render any kind of web content. It supports HTML, XHTML, Cascading Style Sheets (CSS) and the Document Object Model (DOM).
</dd><dt> <a class="external" href="http://www.gnome.org/~billh/at-spi-idl/html/">Assistive Technology Service Provider Interface (AT-SPI)</a>
</dt><dd> an API devised by Sun Microsystems so that accessibility aids can track what's going on inside the user interface of any software package that supports it. If you seriously need to understand AT-SPI, you'll need to read the docs on gnome.org and play with the available sample apps and code, such as at-poke. Please note that the web docs are sometimes out of date, and the <a class="external" href="http://cvs.gnome.org/viewcvs/at-spi/">latest AT-SPI is available on CVS</a>.
</dd><dt> <a class="external" href="http://www.w3.org/DOM/">DOM: Document Object Model</a>
</dt><dd> This is the W3C's specification for how web content is exposed to Javascript and other languages. It covers content, style and events. Inside the Gecko process, code has full access to DOM APIs. However, exposing the entire DOM to external software packages is quite involved, partially because changes to the DOM in Firefox must occur on the main thread. We have chosen a subset of readonly methods in the DOM needed for assistive technology vendors. Events such as focus changes must be tracked through AT-SPI events, rather than DOM events.
</dd><dt> <a class="external" href="http://www.xulplanet.com/">XUL: eXtensible User-interface Language</a>
</dt><dd> The XML-based language used by Firefox and Mozilla to develop the UI. Similar to HTML in that it can be combined with CSS and Javascript to make powerful applications. Contains more desktop-style widgets than HTML and follows a box layout model, rather than being text-flow based.
</dd><dt> <a class="external" href="http://www.ajax.org/">AJAX: Asynchronous JavaScript And XML</a>
</dt><dd> AJAX is a method of building interactive web applications that process user requests, user actions <b>immediately</b> in real time, unlike an HTTP request, during which users must wait for a whole page to reload or for a new page to load. Data is therefore stored and retrieved dynamically much faster.
</dd><dt> Roles, states and events</dt><dd>
</dd><dd> please read the AT-SPI documentation if you are unfamiliar with these.
</dd></dl>
<p><br>
</p>
<h3 name="AT-SPI_tree_vs._DOM_tree_-_what.27s_the_relation.3F">AT-SPI tree vs. DOM tree - what's the relation?</h3>
<p>The AT-SPI tree and the DOM tree are parallel structures, although the AT-SPI tree is a subset of the DOM tree. <code>QueryInterface()</code> can be used to switch between the interfaces (Accessible, AccessibleText, AccessibleValue, etc.).
</p><p>What is exposed? Any DOM node that ...
</p><p><br>
</p>
<ul><li> Is focusable
</li><li> Is formatted with a blank line before and after (display:block in web jargon)
</li><li> Conveys important information about the structure of the document, such as a heading
</li><li> Contains a value that can change
</li><li> Uses a <a class="external" href="http://developer.mozilla.org/en/docs/Accessible_DHTML">dynamic content role attribute</a> that is not equal to "presentation"
</li><li> Uses one of the universal <a class="external" href="http://developer.mozilla.org/en/docs/Accessible_DHTML">dynamic content property attributes</a>, which are currently aaa:describedby, aaa:labelledby, aaa:required or aaa:invalid
</li><li> Uses an onclick handler
</li><li> Is in list of accessible elements <a class="external" href="http://www.mozilla.org/access/unix/atspi-support#roles">in the role table</a>
</li></ul>
<p><br>
</p>
<h2 name="Linux.2FUNIX_Applications_Based_on_the_Gecko_Layout_Engine">Linux/UNIX Applications Based on the Gecko Layout Engine</h2>
<p>Gecko is a rendering engine that Firefox, SeaMonkey, Netscape and yelp use. Gecko can render a variety of content, not just HTML and supports key web standards such as Cascading Style Sheets, Javascript and the W3C DOM. Gecko also handles the users keystrokes and mouse clicks. Gecko is the core architecture that we are adding accessibility to, in order to support basic accessibility in all applications that are based on it.
</p><p>The Mozilla Gecko engine must be version 1.9 or later to have high quality AT-SPI support, as documented here.
</p>
<h3 name="Embedded_Clients">Embedded Clients</h3>
<p>Embedded clients use Gecko only in the content window, at the moment for HTML and generic XML only. They typically use standard Windows controls for their user interface -- the area outside of the client content window, plus the context menu.
</p>
<ul><li> Yelp help viewer. No version is yet known to be available that uses a recent enough version of the Mozilla Gecko engine, for quality AT-SPI support.
</li><li> Evolution email: no version is yet known to be available that uses a recent enough version of the Mozilla Gecko engine, for quality AT-SPI support.
</li><li> Many more applications exist and are expected to be released
</li></ul>
<p><br>
</p>
<h3 name="XUL-Based_Clients">XUL-Based Clients</h3>
<p>XUL-based clients make full use of the Gecko architecture, not only for HTML content, as well as for menus, dialogs and the entire user interface via an XML language called XUL (eXtensible User-interface Language). None of the user interface contains standard Windows controls -- not even the menus! This is done to ensure a common look and feel across all supported platforms, and to allow for different skins (appearances).
</p>
<ul><li> Firefox browser (<i><a class="external" href="http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/">please use recent alpha builds for testing</a></i>)
</li><li> Thunderbird email (<i><a class="external" href="http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/">please use recent alpha builds for testing</a></i>)
</li><li> Seamonkey suite (<i><a class="external" href="http://ftp.mozilla.org/pub/mozilla.org/seamonkey/nightly/latest-trunk/">please use recent alpha builds for testing</a></i>)
</li><li> Nvu HTML editor: no version is yet known to be available that uses a recent enough version of the Mozilla Gecko engine, for quality AT-SPI support.
</li><li> Any Xulrunner application (Songbird media player, etc.)
</li><li> Many more applications exist and are expected to be released
</li></ul>
<h2 name="Determining_if_Accessibility_is_Enabled_in_a_Firefox_Installation">Determining if Accessibility is Enabled in a Firefox Installation</h2>
<p>See the <a class="external" href="https://addons.mozilla.org/firefox/2407/">about:accessibilityenabled Firefox extension</a>.
</p>
<h2 name="How_to_Find_the_Content_Window_and_Load_the_Document">How to Find the Content Window and Load the Document</h2>
<p>In XUL-based clients, screen readers may need to find the content window so that they know where to start grabbing the AT-SPI tree, in order to load the current document into a buffer in their own process.
</p><p>Use <a class="external" href="http://www.mozilla.org/access/unix/atspi-support#relation_embeds">RELATION_EMBEDS</a> on the ROLE_FRAME, which is at the root of each top level window. This will point to the root content accessible(s) for that XUL window.
</p><p>When you see the content window receive focus, first check the role. If it is a ROLE_DOCUMENT_FRAME then this should be treated as a document for the default modality of the screen reader. If it is a ROLE_EMBEDDED, ROLE_DIALOG or ROLE_ALERT then stay in focus tracking mode -- there is no need to parse the document. In addition, if it is a ROLE_ALERT, a screen reader should treat it as a message box -- that is, to read the entire contents. These roles can occur on content because of the new <a class="external" href="http://developer.mozilla.org/en/docs/Accessible_DHTML">Accessible DHTML technology</a> which allows the author to specify the type of document or container.
</p><p>Gecko also helps determine when to load a new window by firing the following document events: document:load-complete, document:reload and document:load-stopped
</p>
<h2 name="Supported_AT-SPI_Interfaces">Supported AT-SPI Interfaces</h2>
<table border="1" cellpadding="1" cellspacing="1" style="empty-cells: show;" summary=">AT-SPI supported interfaces" width="90%">
<tbody><tr>
<th> Interface
</th><th> Supported
</th><th> Notes
</th></tr>
<tr>
<td> Accessible
</td><td> Yes
</td><td>
<p>See supported <a class="external" href="http://www.mozilla.org/access/unix/atspi-support#obj-attr">object attributes</a> below
</p>
</td></tr>
<tr>
<td> Action
</td><td> Yes
</td><td> All methods
</td></tr>
<tr>
<td> Application
</td><td> Yes
</td><td> All methods
</td></tr>
<tr>
<td> Component
</td><td> Yes
</td><td> All methods
</td></tr>
<tr>
<td> Desktop
</td><td> No
</td></tr>
<tr>
<td> Document
</td><td> Yes
</td><td> All methods?
</td></tr>
<tr>
<td> EditableText
</td><td> Yes
</td><td> All methods
</td></tr>
<tr>
<td> Event
</td><td> Yes
</td><td>
<p>See supported <a class="external" href="http://www.mozilla.org/access/unix/atspi-support#events">events</a> below
</p>
</td></tr>
<tr>
<td> Hyperlink
</td><td> Yes
</td><td> Any object embedded in text is considered a hyperlink!
</td></tr>
<tr>
<td> Hypertext
</td><td> Yes
</td><td> Any text with objects embedded in it is considered a hypertext!
</td></tr>
<tr>
<td> Image
</td><td> No
</td><td> ROLE_IMAGE is supported, and is enough
</td></tr>
<tr>
<td> LoginHelper
</td><td> No
</td></tr>
<tr>
<td> Registry
</td><td> No?
</td></tr>
<tr>
<td> Relation
</td><td> Yes
</td><td>
<p>See supported <a class="external" href="http://www.mozilla.org/access/unix/atspi-support#relations">relations</a> below
</p>
</td></tr>
<tr>
<td> Role
</td><td> Yes
</td><td>
<p>See supported <a class="external" href="http://developer.mozilla.org/en/docs/Accessibility/AT-SPI_Support#Supported_AT-SPI_Roles">roles</a> below
</p>
</td></tr>
<tr>
<td> Selection
</td><td> Yes
</td><td> Not yet supported for text
</td></tr>
<tr>
<td> Selector
</td><td> No
</td></tr>
<tr>
<td> State
</td><td> Yes
</td><td>
<p>See supported <a class="external" href="http://developer.mozilla.org/en/docs/Accessibility/AT-SPI_Support#Supported_AT-SPI_States">states</a> below
</p>
</td></tr>
<tr>
<td> StreamableContent
</td><td> No
</td><td> Could apply to plugins, but probably not objects rendered by Gecko
</td></tr>
<tr>
<td> Table
</td><td> Yes
</td><td> In addition, the object attribute layout-guess=true when Gecko thinks the table is for layout, not for data
</td></tr>
<tr>
<td> Text
</td><td> Yes
</td><td>
<p>See supported <a class="external" href="http://www.mozilla.org/access/unix/atspi-support#text-attr">text attributes</a> below
</p>
</td></tr>
<tr>
<td> Value
</td><td> Yes
</td></tr></tbody></table>
<h2 name="Supported_AT-SPI_Roles">Supported AT-SPI Roles</h2>
<p>The following roles are currently supported:
</p>
<ul><li> XXX Needs updating -- this list is copied from MSAA document
</li></ul>
  <table border="1" cellpadding="1" cellspacing="1" style="empty-cells: show;" summary="This table shows what MSAA roles Gecko supports, what markup is used to create objects with those roles, and any special features that objects with those roles support" width="90%">
    <tbody><tr>
      <th scope="col">Role</th>
      <th scope="col">Supported?</th>
      <th scope="col">
        Special features</th>
    </tr>

  <tr>
    <td><span class="plain">ROLE_INVALID</span></td>
    <td><span class="plain">Not a role that can be supported</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_ACCELERATOR_LABEL</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_ALERT</span></td>
    <td><span class="plain">
      XUL: &lt;browsermessage&gt;&lt;br /&gt;
      DHTML: xhtml2:role="wairole:alert"</span></td>
    <td><span class="plain">
      </span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_ANIMATION</span></td> 
      <td><span class="plain">
      No. Animated images use ROLE_GRAPHIC with STATE_ANIMATED.</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_ARROW</span></td> 
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_CALENDAR</span></td> 
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_CANVAS</span></td>
    <td><span class="plain">
      No&lt;br /&gt;
      *** XXX File bug to support for &lt;canvas&gt; ***</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_CHECK_BOX</span></td>
    <td><span class="plain">
        XUL: &lt;checkbox&gt;&lt;br /&gt;
        HTML: &lt;input type="checkbox"&gt;&lt;br /&gt;
        DHTML: role="wairole:checkbox"</span></td>
    <td><span class="plain">
      Fires object:state-changed when radiobutton is set/unset when checkbox is toggled.
      *** Note: Some objects which appear to be checkboxes are in fact cyclers and have ROLE_CELL. Look for the "cycles" attribute to handle these.</span>
    </td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_CHECK_MENU_ITEM</span></td>
    <td><span class="plain">
      XUL: &lt;menuitem type="checkbox"&gt;&lt;br /&gt;
      DHTML: *** XXX file bug to support via role="wairole:menuitemcheckbox" ***</span></td>
    <td><span class="plain">
      Supports STATE_CHECKED</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_COLOR_CHOOSER</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>

  <tr>
    <td><span class="plain">ROLE_COLUMN_HEADER</span></td>
    <td><span class="plain">
      XUL: tree column headers&lt;br /&gt;
      HTML: &lt;th&gt;&lt;br /&gt;
      DHTML: role="wairole:columnheader"</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_COMBO_BOX</span></td>
    <td><span class="plain">
      XUL: &lt;menulist&gt;&lt;br /&gt;
      HTML: &lt;select size="1"&gt;&lt;br /&gt;
      DHTML: role="wairole:combobox"</span></td>
    <td><span class="plain">
      What event do we fire for changes in closed combo box?</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_DATE_EDITOR</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_DESKTOP_ICON</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_DESKTOP_FRAME</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <th>Role</th>
    <th>Supported?</th>
    <th>Special features</th>
  </tr>
  <tr>
    <td><span class="plain">ROLE_DIAL</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_DIALOG</span></td>
    <td><span class="plain">
      &lt;p&gt;
        XUL: &lt;dialog&gt;&lt;br /&gt;
        DHTML: role="wairole:dialog"&lt;/p&gt;
    </span></td>
    <td><span class="plain">
      accessible name exposes the &lt;title&gt; of the current dialog</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_DIRECTORY_PANE</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_DRAWING_AREA</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_FILE_CHOOSER</span></td>
    <td><span class="plain">
      Supported for native filepicker</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_FILLER</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_FONT_CHOOSER</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_FRAME</span></td>
    <td><span class="plain">
      Top level window</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_GLASS_PANE</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_HTML_CONTAINER</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_ICON</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_IMAGE</span></td> 
    <td><span class="plain">
      XUL: &lt;image&gt;&lt;br /&gt;
      HTML: &lt;img&gt;</span></td>
      <td><span class="plain">
      XUL: &lt;image&gt;&lt;br /&gt;
      HTML: &lt;img&gt;
      </span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_INTERNAL_FRAME</span></td> 
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_LABEL</span></td>
    <td><span class="plain">
      XUL: &lt;label&gt;&lt;br /&gt;
      HTML: &lt;label&gt;&lt;br /&gt;
      DHTML: role="wairole:label"</span></td>
      <td><span class="plain">
      Supports RELATION_LABEL_FOR (although technically anthing can)
      &lt;p&gt;
        XUL: &lt;label&gt; or &lt;description&gt;&lt;br /&gt;
        HTML: &lt;label&gt;&lt;br /&gt;
        DHTML: role="wairole:label"&lt;/p&gt;</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_LAYERED_PANE</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_LIST</span></td>
    <td><span class="plain">
      </span></td>
      <td><span class="plain">
      XUL: &lt;listbox&gt;&lt;br /&gt;
      HTML: &lt;select size=""&gt; where size &gt; 1 -- STATE_READONLY is off&lt;br /&gt;
      HTML: &lt;ol&gt; or &lt;ul&gt; -- STATE_READONLY is on&lt;br /&gt;
      DHTML: role="wairole:list"
      </span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_LIST_ITEM</span></td>
    <td><span class="plain">
      XUL: &lt;listitem&gt;&lt;br /&gt;
      HTML: &lt;li&gt;, &lt;option&gt; or &lt;optgroup&gt;
      &lt;br /&gt;
      DHTML: role="wairole:listitem"</span></td>
    <td><span class="plain">
      Sets STATE_SELECTED if the current listitem is selected.&lt;br /&gt;
      &lt;br /&gt;
      *** XXX Perhaps should support object attribute "level" when in ROLE_TREE or ROLE_TREE_TABLE,
      see &lt;a href="#obj-attr"&gt;object attributes&lt;/a&gt; section ***</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_MENU</span></td>
    <td><span class="plain">
      XUL: &lt;menuitem&gt; with children&lt;br /&gt;
      DHTML: role="wairole:menuitem" with child menuitems *** XXX does this work? ***</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_MENU_BAR</span></td>
    <td><span class="plain">
      XUL: &lt;menubar&gt;&lt;br /&gt;
      DHTML: role="wairole:menubar"</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <th>Role</th>
    <th>Supported?</th>
    <th>Special features</th>
  </tr>
  <tr>
    <td><span class="plain">ROLE_MENU_ITEM</span></td>
    <td><span class="plain">
    </span></td>
      <td><span class="plain">
      &lt;p&gt;
        XUL: &lt;menuitem&gt;&lt;br /&gt;
        DHTML: role="wairole:menuitem"&lt;/p&gt;
      </span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_OPTION_PANE</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_PAGE_TAB</span></td>
    <td><span class="plain">
      XUL: &lt;tab&gt;&lt;br /&gt;
      DHTML: role="wairole:tab"</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_PAGE_TAB_LIST</span></td> 
    <td><span class="plain">
    </span></td>
      <td><span class="plain">
      &lt;p&gt;
        XUL: &lt;tab&gt;&lt;br /&gt;
        DHTML: role="wairole:tablist"&lt;/p&gt;
      </span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_PANEL</span></td>
    <td><span class="plain">
      XUL: &lt;radiogroup&gt;, &lt;groupbox&gt;, &lt;iframe&gt;&lt;br /&gt;
      HTML: &lt;fieldset&gt;, &lt;frame&gt;, &lt;iframe&gt;&lt;br /&gt;
      DHTML: role="wairole:group", role="wairole:radiogroup"</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_PASSWORD_TEXT</span></td>
    <td><span class="plain">
      XUL: &lt;textbox type="password"&gt;&lt;br /&gt;
      HTML: &lt;input type="password"&gt;&lt;br /&gt;
      DHTML: role="wairole:secret"</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_POPUP_MENU</span></td>
    <td><span class="plain">
      No, apparently we use ROLE_MENU even for the context menu. XXX *** Is this right?
      ***</span></td>
    <td><span class="plain">
      Supports Text and EditableText interfaces</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_PROGRESS_BAR</span></td>
    <td><span class="plain">
      XUL: &lt;progressmeter&gt;&lt;br /&gt;
      DHTML: role="wairole:progressbar"</span></td>
    <td><span class="plain">
      &lt;p&gt;
        Fires "object:property-change:accessible-value" when progressbar moves by at least
        3%&lt;/p&gt;
      &lt;p&gt;
        Supports Value interface&lt;/p&gt;
    </span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_PUSH_BUTTON</span></td>
    <td><span class="plain">
    </span></td>
      <td><span class="plain">
      &lt;p&gt;
        XUL: &lt;button&gt;&lt;br /&gt;
        HTML: &lt;input type="button"&gt; or&lt;button&gt;&lt;br /&gt;
        DHTML: role="wairole:button"&lt;/p&gt;
      </span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_RADIO_BUTTON</span></td>
    <td><span class="plain">
      XUL: &lt;radio&gt;&lt;br /&gt;
      HTML: &lt;input type="radio"&gt;&lt;br /&gt;
      DHTML: role="wairole:radio"</span></td>
    <td><span class="plain">
      &lt;p&gt;
        Fires object:state-changed when radiobutton is set/unset&lt;/p&gt;
    </span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_RADIO_MENU_ITEM</span></td>
    <td><span class="plain">
      XUL: &lt;menuitem type="radio"&gt;&lt;br /&gt;
      DHTML: *** XXX file bug to support via role="wairole:menuitemradio" *</span></td>
    <td><span class="plain">
      Supports STATE_CHECKED</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_ROOT_PANE</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_ROW_HEADER</span></td>
    <td><span class="plain">
      DHTML: role="wairole:columnheader"</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_SCROLL_BAR</span></td>
    <td><span class="plain">
      Not yet, &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=285167"&gt;bug 285167&lt;/a&gt;</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_SCROLL_PANE</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <th>Role</th>
    <th>Supported?</th>
    <th>Special features</th>
  </tr>
  <tr>
    <td><span class="plain">ROLE_SEPARATOR</span></td>
    <td><span class="plain">
      </span></td>
      <td><span class="plain">
      XUL: &lt;separator&gt;&lt;br /&gt;
      HTML: &lt;hr&gt;&lt;br /&gt;
      DHTML: role="wairole:separator"
      </span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_SLIDER</span></td>
    <td><span class="plain">
      XUL:slider should be supported soon via &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=109215"&gt;
        &lt;span style="color: #0000ff"&gt;bug 109215&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
      DHTML: role="wairole:slider"</span></td>
    <td><span class="plain">
      Fires "object:property-change:accessible-value" when slider thumb is moved&lt;br /&gt;
      &lt;br /&gt;
      Supports Value interface</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_SPIN_BUTTON</span></td>
    <td><span class="plain">
      DHTML: role="wairole:spinbutton"</span></td>
    <td><span class="plain">
      Fires "object:property-change:accessible-value" when changed&lt;br /&gt;
      &lt;br /&gt;
      Supports Value interface</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_SPLIT_PANE</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_STATUS_BAR</span></td>
    <td><span class="plain">
      XUL: &lt;statusbar&gt;</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_TABLE</span></td>
    <td><span class="plain">
      HTML: &lt;table&gt;&lt;br /&gt;
      DHTML: role="wairole:grid"</span></td>
    <td><span class="plain">
      Supports Table interface&lt;br /&gt;
      Supports object attribute "layout-guess", see &lt;a href="#obj-attr"&gt;object attributes&lt;/a&gt;
      section</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_TABLE_CELL</span></td>
    <td><span class="plain">
      HTML: &lt;td&gt;&lt;br /&gt;
      DHTML: role="wairole:gridcell"</span></td>
    <td><span class="plain">
      *** XXX Perhaps should support object attribute "level" when in ROLE_TREE or ROLE_TREE_TABLE,
      see &lt;a href="#obj-attr"&gt;object attributes&lt;/a&gt; section ***</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_TABLE_COLUMN_HEADER</span></td>
    <td><span class="plain">
      HTML: &lt;th&gt;&lt;br /&gt;
      DHTML: role="wairole:columnheader" *** XXX Actually, do we use this one or ROLE_COLUMN_HEADER?
      ***</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_TABLE_ROW_HEADER</span></td>
    <td><span class="plain">
      DHTML: role="wairole:rowheader" *** XXX Actually, do we use this one or ROLE_ROW_HEADER?
      ***</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_TEAROFF_MENU_ITEM</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_TERMINAL</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_TEXT</span></td>
    <td><span class="plain">
      HTML: fallback for display-block styled elements with no known semantic role for
      the tag&lt;br /&gt;
      DHTML: role="wairole:description"&lt;br /&gt;
      XXX *** We are using ROLE_TEXT for DHTML descriptions but ROLE_LABEL for XUL ones,
      that's inconsistent XXX</span></td>
    <td><span class="plain">
      Supports Text interface</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_TOGGLE_BUTTON</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_TOOL_BAR</span></td>
    <td><span class="plain">
      XUL: &lt;toolbar&gt;&lt;br /&gt;
      DHTML: role="wairole:toolbar"</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_TOOL_TIP</span></td>
    <td><span class="plain">
      </span></td>
      <td><span class="plain">
      XUL: &lt;tooltip&gt; or tooltiptext attribute
      </span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_TREE</span></td>
    <td><span class="plain">
      No, XXX *** We should use this when there is only 1 column in the tree ***&lt;br /&gt;
      DHTML: ?</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_TREE_TABLE</span></td>
    <td><span class="plain">
      XUL: &lt;tree&gt;&lt;br /&gt;
      DHTML: role="wairole:tree" ?</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_UNKNOWN</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_VIEWPORT</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_WINDOW</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_HEADER</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <th>Role</th>
    <th>Supported?</th>
    <th>Special features</th>
  </tr>
  <tr>
    <td><span class="plain">ROLE_FOOTER</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_PARAGRAPH</span></td>
    <td><span class="plain">
      HTML: &lt;p&gt;</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_RULER</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_APPLICATION</span></td>
    <td><span class="plain">
      Root accessible object, parent of top level ROLE_FRAME's</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_AUTOCOMPLETE</span></td>
    <td><span class="plain">
      XUL: &lt;textbox type="autocomplete"&gt;</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_EDITBAR</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_EMBEDDED</span></td>
    <td><span class="plain">
      DHTML: role="wairole:application"</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_ENTRY</span></td>
    <td><span class="plain">
       XUL: &lt;textbox&gt;&lt;br /&gt;
      HTML: &lt;input type="text"&gt; or &lt;textarea&gt;&lt;br /&gt;
      DHTML: role="wairole:textfield" or&lt;br /&gt;
      role="wairole:textarea"</span></td>
    <td><span class="plain">
      Supports Text interface</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_CHART</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_CAPTION</span></td>
    <td><span class="plain">
      HTML: &lt;caption&gt;</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_DOCUMENT_FRAME</span></td>
    <td><span class="plain">
      HTML: &lt;body&gt; without a role on the &lt;html&gt; or &lt;body&gt; element (unless
      that is wairole:document)&lt;br /&gt;
      DHTML: role="wairole:document"</span></td>
    <td><span class="plain">
      Supports Document interface&lt;br /&gt;
      Fires object:state-changed for busy state when document load begins or ends</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_HEADING</span></td>
    <td><span class="plain">
      HTML: &lt;h1&gt;, &lt;h2&gt;, &lt;h3&gt;, &lt;h4&gt;, &lt;h5&gt;, &lt;h6&gt;</span></td>
    <td><span class="plain">
      Supports Text interface&lt;br /&gt;
      &lt;br /&gt;
      Supports object attribute "level", see &lt;a href="#obj-attr"&gt;object attributes&lt;/a&gt;
      section ***</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_PAGE</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_SECTION</span></td>
    <td><span class="plain">
      HTML: &lt;div&gt;</span></td>
    <td><span class="plain">
      Supports Text interface</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_FORM</span></td>
    <td><span class="plain">
      HTML: &lt;form&gt;</span></td>
    <td><span class="plain">
      Supports Text interface</span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_REDUNDANT_OBJECT</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_LINK</span></td>
    <td><span class="plain">
      XUL: &lt;label class="text-link"&gt;&lt;br /&gt;
      HTML: &lt;a&gt;, &lt;area&gt;&lt;br /&gt;
      DHTML: role="wairole:link"</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">ROLE_INPUT_METHOD_WINDOW</span></td>
    <td><span class="plain">
      No</span></td>
    <td><span class="plain"></span></td>
  </tr>

    <tr>
      <th>Role</th>
      <th>Supported?</th>
      <th>Special features</th>
    </tr>

  </tbody></table>
<h2 name="Supported_AT-SPI_States">Supported AT-SPI States</h2>
<p>The following states are currently supported:
</p>
<table border="1" cellpadding="1" cellspacing="1" style="empty-cells: show;" summary="Supported AT-SPI States">
  <tbody><tr>
    <th>State</th>
    <th>Supported?</th>
    <th>Where used</th>
  </tr>
  <tr>
    <td><span class="plain">STATE_INVALID</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain">Not a usable state -- should not be confused with STATE_INVALID_ENTRY for form controls, which is supported</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_ACTIVE</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">
      Top level window</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_ARMED</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain">
      *** XXX Where should this be supported? Same as MSAA's STATE_HASPOPUP? ***</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_BUSY</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Documents which are loading</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_CHECKED</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Checkboxes as well as checkable menuitems and treeitems</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_COLLAPSED</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Outline items which have children but are not expanded -- always used with STATE_EXPANDABLE</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_DEFUNCT</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Old objects which are no longer available</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_EDITABLE</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Anything that supports the EditableText interface</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_ENABLED</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Form controls</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_EXPANDABLE</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Outline items which have children</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_EXPANDED</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Outline items which are expandable and the children are shown -- always used with STATE_EXPANDABLE</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_FOCUSABLE</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Nearly any element can be focusable</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_FOCUSED</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Only 1 item at a time is ever focused -- always used with STATE_FOCUSABLE</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_HAS_TOOLTIP</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain">*** XXX Need to file bug ***</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_HORIZONTAL</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain">*** XXX need to file a bug for this and STATE_VERTICAL -- check XUL CSS ***</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_ICONIFIED</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_MODAL</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Modal dialog boxes</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_MULTI_LINE</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">ROLE_ENTRY -- always used with STATE_EDITABLE</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_MULTISELECTABLE</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">ROLE_TREE, ROLE_LIST, ROLE_TREE_TABLE. Indicates that Enter will insert a new line.</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_OPAQUE</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_PRESSED</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">ROLE_BUTTON</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_RESIZABLE</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain"></span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_SELECTABLE</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">ROLE_TREEITEM, ROLE_TABLE_CELL, ROLE_LIST_ITEM</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_SELECTED</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">ROLE_TREEITEM, ROLE_TABLE_CELL, ROLE_LIST_ITEM -- always used with STATE_SELETABLE</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_SENSITIVE</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain">Where should this be used?</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_SHOWING</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Anything</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_SINGLE_LINE</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">ROLE_ENTRY -- always used with STATE_EDITABLE. Indicates that Enter will submit the default button.</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_STALE</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain">Where should this be used?</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_TRANSIENT</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Where should this be used?</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_VERTICAL</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain">*** XXX need to file a bug for this and STATE_HORIZONTAL -- check XUL CSS ***</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_VISIBLE</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Absence of this state is important on documents, popups and tree items</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_MANAGES_DESCENDANTS</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain">Not needed, although potentially useful for trees</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_INDETERMINATE</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain">*** XXX File bug to support this based on nsIAccessible::STATE_MIXED. Should work on ROLE_CHECK_BOX, ROLE_TREE_ITEM, ROLE_LIST_ITEM, ROLE_PROGRESS_BAR ***</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_REQUIRED</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">XForms form controls, and any element with aaa:required="true"</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_TRUNCATED</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain">Where should we use this?</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_ANIMATED</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Animated images.</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_INVALID_ENTRY</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">XForms form controls, and any element with aaa:invalid="true"</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_SUPPORTS_AUTOCOMPLETION</span></td>
    <td><span class="plain">No</span></td>
    <td><span class="plain">*** XXX File bug to support this ***</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_SELECTABLE_TEXT</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Anything that supports the Text interface</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_IS_DEFAULT</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">Default ROLE_BUTTON's, such as OK in XUL dialogs or Submit in HTML</span></td>
  </tr>
  <tr>
    <td><span class="plain">STATE_VISITED</span></td>
    <td><span class="plain">Yes</span></td>
    <td><span class="plain">ROLE_LINK</span></td>
  </tr>
</tbody></table>
<h2 name="Supported_AT-SPI_Relations">Supported AT-SPI Relations</h2>
<p>The following relations are currently supported:
</p><p><br>
</p>
<pre class="eval">enum {RELATION_LABEL_FOR = 0x1002 };<br>
enum {RELATION_DESCRIPTION_FOR = 0x100f };
</pre>
<p>These two relations can be used on object to determine what form control is being labelled or desribed.
</p><p><br>
</p>
<pre class="eval">enum {RELATION_LABELLED_BY = 0x1003 };<br>
enum {RELATION_DESCRIBED_BY = 0x100e };
</pre>
<p><br>
</p><p>These two relations are they inverse; they can be used on form controls. If the form control has an accName, you can get the IAccessible that it was labelled by in order to get more formatting information. It is also useful to check for a description.
</p><p>Note that the label and description relations may be used to prevent redundant information from being presented by the screen reader, since the label and description can occur both on their own, and in the name or description fields of an IAccessible.
</p><p><br>
</p>
<pre class="eval">enum {RELATION_EMBEDS = 0x1009 };
</pre>
<p><br>
</p><p>This relation is used on the root accessible object for a top level Mozilla window, corresponding to what's returned for OBJID_CLIENT for that window. It points to the accessible object corresponding to the root of content in that window. This relation is very useful for finding the content quickly, and will be the proper method for finding content in Firefox 3 and beyond.
</p><p><br>
</p>
<pre class="eval">enum {RELATION_CONTROLLED_BY = 0x1000 };<br>
enum {RELATION_CONTROLLER_FOR = 0x1001 };
</pre>
<p><br>
</p><p>These two relations show what form controls may dynamically change areas of the document, in response to user changes in the form controls themselves. Both controlled_by and controller_for are set in markup from the single dynamic content accessibility dynamic content aaa:controls attribute. The inverse controlled_by relation is automatically calculated.
</p><p><br>
</p>
<pre class="eval">enum {RELATION_FLOWS_TO = 0x1006 };<br>
enum {RELATION_FLOWS_FROM = 0x1007 };
</pre>
<p><br>
</p><p>These two relations allow the reading flow to break out of the normal DOM flow. Both flows_to and flows_from are set in markup from the single dynamic content accessibility aaa:flowsto relation -- the inverse flow_from relation is automatically calculated.
</p>
<h2 name="Supported_AT-SPI_Object_Attributes">Supported AT-SPI Object Attributes</h2>
<p>The following object attributes are currently supported:
</p><p>Note: see <a href="en/AJAX/WAI_ARIA_Live_Regions%2f%2fAPI_Support">AJAX:WAI_ARIA_Live_Regions/API_Support</a> for additional special object attributes that improve the processing of live changes.
</p>
<table border="1" cellpadding="1" cellspacing="1" style="empty-cells: show;" summary=">Supported AT-SPI Object Attributes" width="90%">
<tbody><tr>
<th> Object attribute
</th><th> Applies to (content/UI/any/{{mediawiki.external('role')}})
</th><th> Possible values
</th></tr>
<tr>
<td> atomic
</td><td> any
</td><td> "true" when the entire region should be presented as a whole, when changes within it are considered important enough to automatically present. Often goes with live property. Generally set via ARIA properties.
</td></tr>
<tr>
<td> channel
</td><td> any
</td><td> "notify" when live changes can be presented alongside changes of the same politeness level. If a second channel is not available, the live changes should be prioritized slightly higher than changes of the same politeness. The attribute container-channel gives the computed value for this node (e.g. if there is any container element with the channel attribute the closes thing with the channel attribute wins).
</td></tr>
<tr>
<td> checkable
</td><td> any widget that has internal STATE_CHECKABLE
</td><td> "true" when the widget is known to behave like a checkbox. Note some widgets which appear to be checkboxes might in fact be cyclers (see "cycles" below). Action 0 is named either "check" or "uncheck".
</td></tr>
<tr>
<td> cycles
</td><td> ROLE_CELL
</td><td> "true" when the tree cell is a cycler, which means each click will cycle to the next option. In this case action 0 is called "cycles", which moves to the next option in the same way a manual click does.
</td></tr>
<tr>
<td> datatype
</td><td> any widget that accepts input
</td><td> A qname that refers to an XSD (schema) defined type. For example, a datatype may be xsd:integer. When this is not specified, the default is string, unless the Value interface is exposed, which indicates the type is numeric. For more information please read about <a class="external" href="http://www.w3.org/TR/xmlschema-0/">schema datatypes</a>.
</td></tr>
<tr>
<td> formatting
</td><td> any object that supports the hypertext interface
</td><td> "block" if the object uses block formatting, and thus starts on a new line and ends with a hard line break that is not visible in the actual text. For example, a heading, paragraph or list item are typically formatted as a block, but there is no requirement that they do so. Their formatting may have been changed with CSS. An example of this is often horizontal navigation bars with list items that are formatted with CSS display: inline.
</td></tr>
<tr>
<td> haspopup
</td><td> any
</td><td> "true" when the object displays a pop-up menu or window when invoked.
</td></tr>
<tr>
<td> id
</td><td> any
</td><td> Any value, defined by UI/content developers. Used to indicate a persistant identifier for any object, useful for scripting
</td></tr>
<tr>
<td> layout-guess
</td><td> ROLE_TABLE
</td><td> "true" when Gecko's heuristic determines that it is a table that is probably used for layout, not for table.<br> Value not set means it is probably a data table.
</td></tr>
<tr>
<td> level
</td><td> any
</td><td> For headings, the heading level. For outline items, the indentation level. For diagrams with levels, each item can have its level specified.
</td></tr>
<tr>
<td> live
</td><td> any
</td><td> A hint as to whether changes within the current region or subtree should be automatically presented. Possible values are "off" which is the same as not being set -- this means the region is not live. Other possible values are "polite", "assertive" and "rude", which is a suggestion for the policy when interrupting the user for changes to this region. Please see the <a class="external" href="http://www.w3.org/WAI/PF/Group/adaptable/">ARIA States and Properties module</a> for more information. Additional information may be provide by the object attributes atomic and relevant.
</td></tr>
<tr>
<td> posinset
</td><td> any
</td><td> If this item is in a group, what is the item number within the group, where the size is defined by the setsize attribute. The first item should have posinset="1", and the last item should have a posinset value equal to the setsize-1.
</td></tr>
<tr>
<td> relevant
</td><td> any
</td><td> Space delimited string with keywords describing what kinds of changes in the subtree are informational, as opposed to presentational. If not specified, the default should be considered "additions text", which indicates that newly created objects and changes to text and text equivalents should be considered relevant, and that the hiding or removal of items is not. Please see the <a class="external" href="http://www.w3.org/WAI/PF/Group/adaptable/">ARIA States and Properties module</a> for more information.
</td></tr>
<tr>
<td> setsize
</td><td> any
</td><td> If this item is in a group, this indicates the number of items in the group. This is useful when combined with the posinset object attribute.
</td></tr>
<tr>
<td> sort
</td><td> any container
</td><td> if "ascending" or "descending", then child items within the container are currently sorted as indicated.
</td></tr>
<tr>
<td> tag
</td><td> any
</td><td> The actual markup tag used to create this element (also used in XUL)
</td></tr>
<tr>
<td> xml-roles
</td><td> any
</td><td> If a <a class="external" href="http://developer.mozilla.org/en/docs/Accessible_DHTML">dynamic content accessibility</a> role string is used, it is exposed here. This may provide more information than the AT-SPI role, which is best-fit. In the future, this may be a space or comma delimited list of roles
</td></tr></tbody></table>
<h2 name="Supported_AT-SPI_Text_Attributes">Supported AT-SPI Text Attributes</h2>
<p>The following text attributes are currently supported:
</p><p><br>
</p>
<table border="1" cellpadding="1" cellspacing="1" summary=">Supported AT-SPI Text Attributes" width="90%">
<tbody><tr>
<th> Text attribute
</th><th> Possible values
</th></tr>
<tr>
<td> static
</td><td> "true" for list bullet/numbering text or layout-inserted text (such as via CSS pseudo styles :before or :after)
</td></tr></tbody></table>
<h2 name="Supported_AT-SPI_Document_Attributes">Supported AT-SPI Document Attributes</h2>
<p>The following document attributes are currently supported:
</p>
<table border="1" cellpadding="1" cellspacing="1" summary=">Supported AT-SPI Document Attributes" width="90%">
<tbody><tr>
<th> Document attribute
</th><th> Possible values
</th><th> Notes
</th></tr>
<tr>
<td> W3C-doctype
</td><td> Equivalent to what is specified in the &lt;!DOCTYPE&gt; header
</td><td> This attribute cannot change for the lifetime of a document.
</td></tr>
<tr>
<td> DocURL
</td><td> The location of the current document, including possibly a named anchor jumped to, for example http://www.mozilla.org#maincontent
</td><td> The document:attributes-changed event is fired if the DocURL changes due to a named anchor jump.
</td></tr>
<tr>
<td> MimeType
</td><td> The mime or media type, such as text/plain, text/html, image/jpeg, image/svg+xml, application/xml+xhtml and application/vnd.mozilla.xul+xml.
</td><td> This attribute cannot change for the lifetime of a document.
</td></tr></tbody></table>
<h2 name="Supported_AT-SPI_Events">Supported AT-SPI Events</h2>
<p>The following events are currently supported:
</p>
<ul><li> object:focus
</li><li> object:property-change ... *** XXX fill in list of properties we support this for ***
</li><li> object:state-changed for ... *** XXX fill in list of states we support this for ***
</li><li> object:text-changed:delete
</li><li> object:text-changed:insert
</li><li> object:text-selection-changed
</li><li> object:text-caret-moved
</li><li> object:selection-changed
</li><li> window:activate
</li><li> window:deactivate
</li><li> document:load-complete
</li><li> document:reload
</li><li> document:load-stopped
</li><li> document:attributes-changed
</li></ul>
<p><br>
The event object:link-selected is purposely not supported, but focus events are fired on ROLE_LINK objects instead.
</p>
<h2 name="AT-SPI_Features_We_Currently_Do_Not_Support">AT-SPI Features We Currently Do Not Support</h2>
<p>As just stated, the event object::link-selected is purposely not supported, but focus events are fired on ROLE_LINK objects instead.
</p><p>See <a class="external" href="https://bugzilla.mozilla.org/showdependencytree.cgi?id=342901&amp;hide_resolved=1">Firefox 3</a> dependencies, and in particular the <a class="external" href="https://bugzilla.mozilla.org/showdependencytree.cgi?id=333492&amp;hide_resolved=1">New ATK</a> blocking bugs.
</p>
<h2 name="Known_Differences_with_Other_Applications">Known Differences with Other Applications</h2>
<p><span class="plain">*** XXX To Be Done ***</span>
</p>
<h2 name="Avoiding_Memory_Leaks">Avoiding Memory Leaks</h2>
<p>It is the assistive technology's responsibility to watch for events that indicate when windows or content subtrees are being destroyed, and to release all Accessible objects related to that window. In addition, STATE_DEFUNCT is set on objects that should be released by the assistive technology. XXX *** Indicate what events, I think we need to add object:children-changed:foo support ***
</p><p>To help developers in that regard, there is <a class="external" href="https://addons.mozilla.org/firefox/2490/">Memory Leak monitor, a Firefox extension</a>.
</p>
<h2 name="Keyboard_User_Interface_and_API">Keyboard User Interface and API</h2>
<p>Fortunately, Gecko uses the standard keyboard API's for each supported platform.
</p><p>The Mozilla keyboard shortcuts for content are similar to what is used in other browsers. Here is a list of <a class="external" href="http://www.mozilla.org/support/firefox/keyboard">Firefox keyboard shortcuts</a>.
</p><p><br>
</p>
<h2 name="HTML_Examples">HTML Examples</h2>
<table border="1" cellpadding="2" cellspacing="2" style="empty-cells: show;" summary="Mapping between HTML and the AT-SPI representation">
<caption>
  Each AT-SPI accessible object is
encapsulated in braces ("{}"), and meaningful AT-SPI interfaces and attributes,
including specializations, are represented as name/value pairs inside
the braces.<br>
  For convenience, accessible text is shown merely as
'text="contents
of the text"'.<br>
  <strong><span style="color: #ff0066">* = Embedded object character (0xfffc),
    used when no text from the object will be inserted in the parent Hypertext<br>
  </span></strong>
  </caption>
    <tbody><tr>
      <th width="15%">HTML content</th>
      <th>HTML source</th>
      <th>AT-SPI representation<br>
</th>
    </tr>
  
    <tr>
      <td>
      <h2 name="This_is_a_heading">This is a heading</h2>
      <p> This is a paragraph with an &lt;img src="image.gif"
 alt="some image"&gt; image in it. </p>
      <h3 name="This_is_another_heading">This is another heading</h3>
      </td>
      <td>
      <div style="white-space: pre;">&lt;h1&gt;This is a heading&lt;/h1&gt;<br>&lt;p&gt;<br>  This is a paragraph with an<br>  &lt;image src="image.gif"<br>         alt="some image"/&gt;<br>  image in it.<br>&lt;/p&gt;<br>&lt;h2&gt;This is another heading&lt;/h2&gt;<br> </div>
      </td>
      <td style="vertical-align: top;">
      <div style="white-space: pre;">{parent Text, role=ROLE_HEADING, objattr="xhtml<span class="plain">:</span>tag=h1",<br>   text-attributes="css<span class="plain">:</span>font-size=LARGER",<br>   text="This is a heading"}<br>{parent Hypertext, role=ROLE_PARAGRAPH, attr="xhtml<span class="plain">:</span>tag=p"<br> text="This is a paragraph with an<strong> <span style="font-size: 14pt; color: #ff0066">*</span></strong> image in it"}<br>  {child Image, Hyperlink, role=ROLE_IMAGE, <br>   ImageDescription ="some image",<br>   AccessibleName = "" <span style="font-style: italic;">{{mediawiki.external('the HTML title attribute, if present')}}</span><br>   hyperlink-range={{mediawiki.external(28,29)}}}<br>{parent Text, role=ROLE_HEADING, objattr="xhtml-role<span class="plain">:</span>h2",<br>   text-attributes="css<span class="plain">:</span>font-size=LARGE",<br>   text="This is another heading"}</div>
      </td>
    </tr>
    <tr>
      <td>
      <p>Hey!<br>
Tell me something.</p>
      </td>
      <td>
      <div style="white-space: pre;">&lt;p&gt;Hey!&lt;br&gt;Tell me something.&lt;/p&gt;<br></div>
      </td>
      <td style="vertical-align: top;">
      <div style="white-space: pre;">{parent Text, role=ROLE_PARAGRAPH, attr="xhtml<span class="plain">:</span>tag=p"}<br> text="Hey!\nTell me something"}<br>   </div>
      </td>
    </tr>
    <tr style="font-size: 12pt; font-family: Times New Roman;">
      <td>&lt;a href="http<span class="plain">:</span>//www.google.com/"&gt;Hey!<br>
Tell me something.&lt;/a&gt;</td>
      <td>
      <div style="white-space: pre;"><span style="font-size: 10pt;">&lt;a href="http<span class="plain">:</span>//www.google.com"&gt;Hey!<br>&lt;br&gt;Tell me something.&lt;/a&gt;</span></div>
      </td>
      <td style="vertical-align: top;"><span style="font-size: 10pt; font-family: Courier New;">
      <div style="white-space: pre;">{parent Hyperlink, Text, role=ROLE_LINK<br> objattr="html<span class="plain">:</span>tag=a;link-type=anchor", <br> text="Hey!\nTell me something",<br> hyperlink-range=<span style="font-style: italic;">{{mediawiki.external('depends on the containing context')}}</span>,<br> hyperlink-URI="http<span class="plain">:</span>//www.google.com",<br> hyperlink-Object=Text}</div>
      </span></td>
    </tr>
    <tr style="font-size: 12pt;">
      <td>
      <p>Hey</p>
      <hr>
      <p>Tell me something</p>
      </td>
      <td>
      <div style="white-space: pre;"><span style="font-size: 10pt;">&lt;p&gt;Hey&lt;/p&gt;&lt;hr/&gt;<br>&lt;p&gt;Tell me something&lt;/p&gt;</span></div>
      </td>
      <td style="vertical-align: top; font-family: monospace;"><span style="font-size: 10pt;">{parent1 Text, role=ROLE_PARAGRAPH,<br>
<p> text="Hey"}<br>
{parent2 role=ROLE_SEPARATOR,<br>
 <span style="font-style: italic;">{{mediawiki.external('note&lt;span class=\"plain\"&gt;' .. : .. '&lt;/span&gt; State doesn\'t include\nSTATE_VERTICAL, &lt;br/&gt;\n       to distinguish from vsep')}}</span>}<br>
{parent3 Text, role=ROLE_PARAGRAPH, <br>
</p>
 text="Tell me something"}</span></td>
    </tr>
    <tr>
      <td>
      <p>You <em>are</em> a nice person.</p>
      </td>
      <td>
      <div style="white-space: pre;">&lt;p&gt;<br>  You &lt;em&gt;are&lt;/em&gt; a nice person.<br>&lt;/p&gt;</div>
      </td>
      <td style="vertical-align: top;"><span style="font-size: 10pt;"><span style="font-family: monospace;">{parent Text,
<p>role=ROLE_PARAGRAPH, attr="html<span class="plain">:</span>tag=p", </p></span><br style="font-family: monospace;">

<pre class="eval">     <span style="font-family: monospace;">  text="You are a nice
</span></pre>
<p>person",</p></span><br style="font-family: monospace;">

<pre class="eval">     <span style="font-family: monospace;">  attribute run for
</span></pre>
<p>"are", with objattr="role
</p>
        = html<span class="plain">:</span>em", textattr="css<span class="plain">:</span>text-style=oblique"}</td>
    </tr>
    <tr>
      <td>
      <p>Here is a &lt;a href="http<span class="plain">:</span>//foo.bar.com/"&gt;bartending
site&lt;/a&gt;.</p>
      </td>
      <td>
      <div style="white-space: pre;">&lt;p&gt;<br>  Here is a<br>  &lt;a href="http<span class="plain">:</span>//foo.bar.com"&gt;<br>    bartending site<br>  &lt;/a&gt;<br> .<br>&lt;/p&gt; </div>
      </td>
      <td style="vertical-align: top; font-family: monospace;"><span style="font-size: 10pt;">{parent Hypertext,
<p>role=ROLE_PARAGRAPH, attr="html<span class="plain">:</span>tag=p"<br>
  text="Here is a <strong><span style="font-size: 14pt; color: #ff0066">*</span></strong>.",<br>
  attribute run for "bartending site." with
textattr="link=true,     <br>
  css<span class="plain">:</span>text-decoration=underline, css<span class="plain">:</span>color=(0,0,255)"}<br>
   {child Text,  Hyperlink,<br>
     role=ROLE_LINK, attr="html<span class="plain">:</span>tag=a,
link-type<span class="plain">:</span>anchor", <br>
     text="bartending site",<br>
     hyperlink-indices={{mediawiki.external(10,11)}}<br>
</p>
     hyperlink-URI="http<span class="plain">:</span>//foo.bar.com"}</span></td>
    </tr>
    <tr>
      <td>
      <p>Here is a &lt;a href="http<span class="plain">:</span>//foo.bar.com/"&gt; &lt;img src="beerglass.GIF" alt="beer glass"&gt;bartending site&lt;/a&gt;.</p>
      </td>
      <td>
      <div style="white-space: pre;">&lt;p&gt;<br>  Here is a<br>  &lt;a href="http<span class="plain">:</span>//foo.bar.com"&gt;<br>    &lt;image src="beerglass.GIF"<br>           alt="beer glass"/&gt;<br>    bartending site<br>  &lt;/a&gt;<br>  .<br>&lt;/p&gt;</div>
      </td>
      <td style="vertical-align: top;"><span style="font-family: monospace;">{parent Hypertext,
<p>role=ROLE_PARAGRAPH, attr="html<span class="plain">:</span>tag=p"</p></span><br style="font-family: monospace;">

<pre class="eval">     <span style="font-family: monospace;">  text="Here is a <strong><span style="font-size: 14pt; color: #ff0066">*</span></strong>."<br>
     </span><span style="font-size: 10pt;"> <span style="font-family: monospace;">attribute run for "bartending site."
</span></span></pre>
<p>with textattr="link=true,     <br style="font-family: monospace;">
</p>
<pre class="eval">     <span style="font-family: monospace;"> 
</span></pre>
<p>css<span class="plain">:</span>text-decoration=underline, css<span class="plain">:</span>color=(0,0,255)"}<span style="font-family: monospace;"></span><br style="font-family: monospace;">
</p>
<pre class="eval">     <span style="font-family: monospace;">   {child
</span></pre>
<p>Hypertext, <span style="font-family: monospace;">Hyperlink,
</span></p>
<pre class="eval">     <br style="font-family: monospace;">
     <span style="font-family: monospace;">     
</span></pre>
<p>role=ROLE_LINK,<br style="font-family: monospace;">
</p>
<pre class="eval">     <span style="font-family: monospace;">      text="<strong><span style="font-size: 14pt; color: #ff0066">*</span></strong>bartending site" <br>
</span></pre>
<p>           hypertext-indices={{mediawiki.external(10,11)}},<br>
</p>
<pre class="eval">     <span style="font-style: italic;">[not sure if we need to dup textattrs
</span></pre>
<p>here, or add them to defaulttextattrs] <span style="font-family: monospace;">,</span><br style="font-family: monospace;">
</p>
<pre class="eval">     <span style="font-family: monospace;">     
</span></pre>
<p>hypertext-URI="http<span class="plain">:</span>//foo.bar.com"}<br style="font-family: monospace;">
</p>
<pre class="eval">     <span style="font-family: monospace;">       
</span></pre>
<p>  {grandchild Image, Hyperlink<br style="font-family: monospace;">
</p>
<pre class="eval">     <span style="font-family: monospace;">      
</span></pre>
<p>     role=ROLE_IMAGE, attr="html<span class="plain">:</span>tag=img,
link-type=image"<br style="font-family: monospace;">
</p>
<pre class="eval">     <span style="font-family: monospace;">     
</span></pre>
<p>   AccName/ImageDescription="beer glass",<br>
             hyperlink-indices={{mediawiki.external(0,1)}}<br style="font-family: monospace;">
</p>
<pre class="eval">     <span style="font-family: monospace;">       
       URI="beerglass.GIF"}</span><br style="font-family: monospace; font-style: italic;">
     <span style="font-style: italic;">[don't know if the URIs should
</span></pre>
<p>always be fully specified, or if omitting the base URI is OK<br>
</p>
<pre class="eval">       <span style="color: #006600">At the moment, not planning to do this, instead plan
         to expose repair text in the name if no alt/title exists </span>] 
</pre>
      </td>
    </tr>
    <tr>
      <td>
      <p> Here is a &lt;img src="beerglass.GIF" alt="beer glass"&gt; &lt;a
 href="http<span class="plain">:</span>//foo.bar.com/"&gt; bartending site&lt;/a&gt; . </p>
      </td>
      <td>
      <div style="white-space: pre;">&lt;p&gt;<br>  Here is a<br>  &lt;image src="beerglass.GIF"<br>         alt="beer glass"/&gt;<br>  &lt;a href="http<span class="plain">:</span>//foo.bar.com"&gt;<br>    bartending site<br>  &lt;/a&gt;<br>  .<br>&lt;/p&gt;</div>
      </td>
      <td style="vertical-align: top;"><span style="font-size: 10pt; font-family: monospace;">{parent Hypertext,
<p>role=ROLE_PARAGRAPH, attr="html<span class="plain">:</span>tag=p", <br>
  text="Here is a <strong><span style="font-size: 14pt"><span style="color: #ff0066">*</span><span style="color: #ff0066">*</span></span></strong>."}<br>
   {child Image, Hyperlink,<br>
     role=ROLE_IMAGE, attr="html<span class="plain">:</span>tag=img,
link-type=image"<br>
     AccName/ImageDescription="beer glass",<br>
     hyperlink-indices={{mediawiki.external(10,11)}}<br>
     hyperlink-URI="beerglass.GIF"}<br>
   {child Text, Hyperlink, Action,<br>
    Hypertext, role=ROLE_LINK,<br>
     action-names="activate", </p></span><span style="font-size: 10pt; font-family: sans-serif;"><span style="font-style: italic;">{{mediawiki.external('others?')}}</span></span><span style="font-size: 10pt; font-family: monospace;"><br>
     attr="html<span class="plain">:</span>tag=a, link-type=anchor"<br>
     text="bartending site",<br>
     textattr=</span><span style="font-size: 10pt; font-family: sans-serif;"><span style="font-style: italic;">{{mediawiki.external('as\nin above examples')}}</span></span><span style="font-size: 10pt; font-family: monospace;"><br>
     hypertext-indices={{mediawiki.external(11,22)}},<br>

     hypertext-URI="http<span class="plain">:</span>//foo.bar.com"}</span></td>
    </tr>
    <tr>
      <td><br>
      </td>
      <td>
      <div style="white-space: pre;">&lt;p&gt;<br>  &lt;IMG SRC="sitemap.gif" <br>       ALT="Site map"<br>       USEMAP="#mymap"&gt;<br>  &lt;MAP NAME="mymap" title="site map"&gt;<br>    &lt;AREA HREF="1.html" ALT="Bar"<br>          COORDS="5,5,95,195"&gt;<br>    &lt;AREA HREF="2.html" ALT="Baz"<br>          COORDS="105,5,195,195"&gt;<br>    &lt;AREA HREF="3.html" ALT="Fu"<br>          COORDS="205,5,295,195"&gt;<br>  &lt;/MAP&gt;<br>&lt;/p&gt;</div>
      </td>
      <td style="vertical-align: top;">
      <div style="white-space: pre;">{parent Hypertext, role=ROLE_PARAGRAPH,<br> text="<strong><span style="font-size: 14pt; color: #ff0066">*</span></strong>"}<br>  {child Image, Hypertext, text="<strong>
    <span style="font-size: 14pt"><span style="color: #ff0066">**</span><span style="color: #ff0066">*</span></span></strong>", Hyperlink,<br>   role=ROLE_IMAGE,<br>   attr="html<span class="plain">:</span>tag=map",<br>   ImageBounds=<span style="font-style: italic;">{{mediawiki.external('entire map area')}} </span><br>   AccName and ImageDescription="Site map"}<br>    {grandchild Hyperlink, Action, <br>     action-names="click", role=ROLE_LINK, <br>     attr="html<span class="plain">:</span>tag=area", hyperlink-URI="1.html", name="Bar"}<br>    {grandchild Hyperlink, Action, <br>     action-names="click", role=ROLE_LINK,<br>     attr="html<span class="plain">:</span>tag=area", hyperlink-URI="2.html", name="Baz"}<br>    {grandchild Hyperlink, Action,<br>     action-names="click", role=ROLE_LINK,<br>     attr="html<span class="plain">:</span>tag=area", hyperlink-URI="3.html", name="Fu"}<br><span style="font-style: italic; font-family: sans-serif;">{{mediawiki.external('note that the component bounds of the areas correspond to their rectangular bounding boxes')}}</span> </div>
      </td>
    </tr>
    <tr>
      <td>
<pre class="eval">     * This is a list item.
     * This is another list item.
</pre>
      </td>
      <td>
      <div style="white-space: pre;">&lt;ul&gt;<br>  &lt;li&gt;This is a list item.&lt;/li&gt;<br>  &lt;li&gt;This is another list item.&lt;/li&gt;<br>&lt;/ul&gt;</div>
      </td>
      <td style="vertical-align: top;">
      <div style="white-space: pre;"><br>{parent Object, role=ROLE_LIST, attr="css<span class="plain">:</span>list-style-type=disc"}<br>  {child Text, role=ROLE_LIST_ITEM,<br>   text="This is a list item.", attribute run "static" first 2 chars}<br>  {child Text, role=ROLE_LIST_ITEM,<br>   text="This is another list item.", attribute run "static" first 2 chars}<br> </div>
<pre class="eval">     <br>
       <em>[Bill<span class="plain">:</span> we
</em></pre>
<p>should be able to support list-style=image, and
"list-style-image=URL()", etc. this way.  In the above example,
it's
not clear whether the bullet should be a unicode char or just omitted
and implied by the list style..  my guess is the latter (i.e.
bullets
don't appear in the text)] 
</p>
      </td>
    </tr>
    <tr>
      <td>
      <ol>
        <li>This is a list item.</li>
        <li>This is another list item.</li>
      </ol>
      </td>
      <td>
      <div style="white-space: pre;">&lt;ol&gt;<br>  &lt;li&gt;This is a list item.&lt;/li&gt;<br>  &lt;li&gt;This is another list item.&lt;/li&gt;<br>&lt;/ol&gt;</div>
      </td>
      <td style="vertical-align: top;"><br>
      <div style="white-space: pre;">{parent Object, role=ROLE_LIST, attr="html<span class="plain">:</span>tag=ol, css<span class="plain">:</span>list-style-type<span class="plain">:</span>decimal"}<br>  {child Text, role=ROLE_LIST_ITEM,<br>   text="1. This is a list item.", attribute run "static" first 3 chars}<br>  {child Text, role=ROLE_LIST_ITEM,<br>   text="2. This is another list item.", attribute run "static" first 3 chars}<br></div>
      </td>
    </tr>
    <tr>
      <td>
      <ul>
        <li>This is a list item
          <ul>
            <li>Nested item 1. </li>
            <li>Nested item 2.<br>
            </li>
          </ul>
        </li>
        <li>This is another list item.</li>
      </ul>
      </td>
      <td>
      <div style="white-space: pre;">&lt;ul&gt;<br>  &lt;li&gt;<br>    This is a list item.<br>    &lt;ul&gt;<br>      &lt;li&gt;Nested item 1&lt;/li&gt;<br>      &lt;li&gt;Nested item 2&lt;/li&gt;<br>    &lt;/ul&gt;<br>  &lt;/li&gt;<br>  &lt;li&gt;This is another list item.&lt;/li&gt;<br>&lt;/ul&gt;</div>
      </td>
      <td style="vertical-align: top;">
      <div style="white-space: pre;"><br><br>{parent Object, role=ROLE_LIST, attr="html<span class="plain">:</span>tag=ul, css<span class="plain">:</span>list-style-type=disc"}<br>  {child Hypertext, role=ROLE_LIST_ITEM,<br>   text="This is a list item.<strong><span style="font-size: 14pt; color: #ff0066">*</span></strong>"}<br>     {grandchild Object, Hyperlink, role=ROLE_LIST,<br>      attr="html<span class="plain">:</span>tag=ul, css<span class="plain">:</span>list-style-type=circle, link-type=child",<br>      hyperlink-indices={{mediawiki.external(20,21)}},<br>      hyperlink-URI="", <span style="font-style: italic; font-family: sans-serif;">{{mediawiki.external('Hmm, degenerate case here...')}} </span><span style="font-family: sans-serif;">}</span> <br>     {great-grandchild Text, role=ROLE_LIST_ITEM, attr="html<span class="plain">:</span>tag=li"<br>         text="Nested item 1"}<br>     {great-grandchild Text, role=ROLE_LIST_ITEM, attr="html<span class="plain">:</span>tag=li"<br>         text="Nested item 2"}<br>   {child Text, role=ROLE_LIST_ITEM,<br>    text="This is another list item."}<br> <br> <br style="font-family: sans-serif;"><span style="font-style: italic; font-family: sans-serif;">{{mediawiki.external('Note that unlike user interface ROLE_LIST objects, these lists don\'t &lt;br/&gt;implement Selection, and the list items\' StateSets do not include &lt;br/&gt;STATE_SELECTABLE.  There is a question here as to whether &lt;ul&gt; and &lt;ol&gt; elements&lt;br/&gt;should always implement Text or not.  I think it would be better if they did not, unless they had &lt;br/&gt;non-empty text content, but this may prove impractical.')}}</span> </div>
      </td>
    </tr>
    <tr>
      <td>
        <div>&lt;label for="self"&gt; Tell me a little more<span class="plain">:</span> &lt;/label&gt;</div>
        <div>&lt;textarea&gt; I am a monkey
<p>with a long tail. I like to swing from trees and eat bananas. I've
</p>
recently taken up typing and plan to write my memoirs. &lt;/textarea&gt;</div>
      </td>
      <td>
      <div style="white-space: pre;">&lt;form&gt;<br>  &lt;div&gt;<br>    &lt;label for="self"/&gt;<br>      Tell me a little more<span class="plain">:</span><br>    &lt;/label&gt;<br>  &lt;/div&gt;<br>  &lt;div&gt;<br>    &lt;textarea&gt;<br>      I am a monkey with a long <br>      tail. I like to swing from <br>      trees and eat bananas. I've <br>      recently taken up typing <br>      and plan to write my memoirs.<br>    &lt;/textarea&gt;<br>  &lt;/div&gt;<br>&lt;/form&gt;</div>
      </td>
      <td style="vertical-align: top;">
      <div style="white-space: pre;">{parent Object, role=ROLE_FORM, text=""}<br>  {child1 Object, role=ROLE_SECTION? <span style="font-style: italic;">{{mediawiki.external('or should we use ROLE_PANE?')}}</span> }<br>     {grandchild Text,<br>      role=ROLE_LABEL,<br>      RELATION_LABEL_FOR=child2,<br>      text="Tell me a little more<span class="plain">:</span>"}<br>  {child2 role=ROLE_SECTION?}<br>    {grandchild EditableText,<br>     Relation, StateSet, Action,<br>     ROLE_ENTRY,<br>     text="I am a monkey with ..."}, <br>     RELATION_LABELLED_BY=child1,<br>     STATE_MULTILINE,<br>     STATE_REQUIRED allowed}<br><br style="font-style: italic; font-family: sans-serif;"><span style="font-style: italic; font-family: sans-serif;">[ attribute run over the portion of the text scrolled into view?</span><br style="font-style: italic; font-family: sans-serif;"><span style="font-style: italic; font-family: sans-serif;">  CONTROLLER_FOR/CONTROLLED_BY for the scrollbar/viewport? <br>  Alternative would be to treat all the text content as though it were visible, but that's no good<br>  for magnifiers and ATs for the mobility-impaired.  Probably the textarea needs to be expanded somewhat,<br>  or at least fitted with Actions for scrolling plus text attribution for determining what parts of the text are<br>  currently scrolled into view, without the AT client having to resort to bounds checking in the<br>  "screen review" fashion.  This is, however, a general problem with multiline text in viewports.<br>The relatively new Text getBoundedRanges API reduces the pain somewhat since you can<br>feed it the Component bounds and it will give you back the visible text.]</span> </div>
      </td>
    </tr>
    <tr>
      <td>
        <p>Check one or more<span class="plain">:</span> &lt;input id="cb1" type="checkbox"&gt;&lt;label
 for="cb1"&gt;Red&lt;/label&gt; &lt;input id="cb2" type="checkbox"&gt;&lt;label for="cb2"&gt;Blue&lt;/label&gt;
        &lt;input id="cb3" type="checkbox"&gt;&lt;label for="cb3"&gt;Green&lt;/label&gt; </p>
      </td>
      <td>
      <div style="white-space: pre;">&lt;form aaa<span class="plain">:</span>describedby="checkhelp"&gt; <br>  &lt;p&gt;<br>    &lt;span<br>     x2<span class="plain">:</span>tag="wairole<span class="plain">:</span>description"<br>     id="checkhelp"&gt;<br>        Check one or more<span class="plain">:</span><br>    &lt;/span&gt;<br>    &lt;input id="cb1" type="checkbox"/&gt;<br>    &lt;label for="cb1"&gt;Red&lt;/label&gt;<br>    &lt;input id="cb2" type="checkbox"/&gt;<br>    &lt;label for="cb2"&gt;Blue&lt;/label&gt;<br>    &lt;input id="cb3" type="checkbox"/&gt;<br>    &lt;label for="cb3"&gt;Green&lt;/label&gt;<br>  &lt;/p&gt;<br>&lt;/form&gt;</div>
      </td>
      <td style="vertical-align: top;">
      <div style="white-space: pre;">{parent Object,<br> role=ROLE_FORM,<br> attr="html<span class="plain">:</span>tag=form",<br> RELATION_DESCRIBED_BY=grandchild1,<br> text="?"}<br>  {child Text,<br>   role=ROLE_PARAGRAPH, attr="html<span class="plain">:</span>tag=p", text=""}<br>    {grandchild1 Text,<br>     role=ROLE_LABEL,<br>     RELATION_DESCRIPTION_FOR=parent,<br>     attr="html<span class="plain">:</span>tag=wairole<span class="plain">:</span>description"}<br>     text="Check one or more<span class="plain">:</span>"}<br>    {grandchild2 Action, <br>     StateSet, role=ROLE_CHECK_BOX, <br>     attr="html<span class="plain">:</span>tag=input", <span style="font-style: italic; font-family: sans-serif;">{{mediawiki.external('and same with other elements, expose html&lt;span class=\"plain\"&gt;' .. : .. '&lt;/span&gt;role')}}<br>                            {{mediawiki.external('note also that these objects do NOT have accessible names, because they are labelled;&lt;br/&gt;                             accessible-name would presumably come from the HTML title attribute or other attribute.&lt;br/&gt;                             This is mainly to make it easier for ATs to avoid highly redundant speech in these cases.')}}<br></span>      RELATION_LABELLED_BY=grandchild3}<br>    {grandchild3 Text, <br>     role=ROLE_LABEL, text="Red", <br>     RELATION_LABEL_FOR=grandchild2}<br>    {grandchild4 Action, <br>     StateSet, role=ROLE_CHECK_BOX, <br>     RELATION_LABELLED_BY=grandchild5}<br>    {grandchild5 Text, <br>     role=ROLE_LABEL, text="Blue", <br>     RELATION_LABEL_FOR=grandchild4}<br>    {grandchild6 Action, <br>     StateSet, role=ROLE_CHECK_BOX, <br>     RELATION_LABELLED_BY=grandchild7}<br>    {grandchild7 Text, <br>     role=ROLE_LABEL, text="Green", <br>     RELATION_LABEL_FOR=grandchild6}<br><br><span style="font-style: italic; font-family: sans-serif;">{{mediawiki.external('RFE&lt;span class=\"plain\"&gt;' .. : .. '&lt;/span&gt; add RELATION_DESCRIBED_BY&lt;br/&gt;  and  RELATION_DESCRIPTION_FOR to match AT-SPI/DHTML.  Also, I thought we had &lt;br/&gt;  ROLE_FORM, but it seems not to be there.  Did I miss something?')}}</span> </div>
      </td>
    </tr>
    <tr>
      <td>
<pre class="eval">      &lt;label for="beverage"&gt;Make a selection<span class="plain">:</span>&lt;/label&gt;
       &lt;select id="beverage"&gt;
       &lt;option&gt;Water&lt;/option&gt;
       &lt;option&gt;Wine&lt;/option&gt;
       &lt;option&gt;Whiskey&lt;/option&gt;
       &lt;/select&gt;
     
</pre>
      </td>
      <td>
      <div style="white-space: pre;">&lt;form&gt;<br>  &lt;label for="beverage"&gt;<br>    Make a selection<span class="plain">:</span><br>  &lt;/label&gt;<br>  &lt;select id="beverage"&gt;<br>    &lt;option&gt;Water&lt;/option&gt;<br>    &lt;option&gt;Wine&lt;/option&gt;<br>    &lt;option&gt;Whiskey&lt;/option&gt;<br>  &lt;/select&gt;<br>&lt;/form&gt;<br></div>
      </td>
      <td style="vertical-align: top;">
      <div style="white-space: pre;">{parent role=ROLE_FORM?}<br>  {child Text,<br>   role=ROLE_LABEL, <br>   RELATION_LABEL_FOR=child,<br>   text="Make a selection<span class="plain">:</span>"}  <br>  {child Action,<br>   StateSet, Selection, <br>   attr="html<span class="plain">:</span>tag=select",<br>   role=ROLE_COMBO_BOX, <br>   RELATION_LABELLED_BY}<br>       {grandchild, <br> Text, <br>   StateSet=...SELECTABLE, SELECTED..., <br> attr="html<span class="plain">:</span>tag=option",<br>        role=ROLE_LIST_ITEM, text="Water"}<br>       {grandchild,<br>  Text,<br>  StateSet=...SELECTABLE..., <br> attr="html<span class="plain">:</span>tag=option",<br>   role=ROLE_LIST_ITEM, text="Wine"}<br>       {grandchild Text, <br>  StateSet=...SELECTABLE...,<br>  role=ROLE_LIST_ITEM,<br>  attr="html<span class="plain">:</span>tag=option",<br>        text="Whiskey"}<br><br style="font-style: italic;"><span style="font-style: italic;">[note that because the entry field is not editable, but just displays the current </span><br style="font-style: italic;"><span style="font-style: italic;">selection, I think it should not be exposed (especially since it represents a node</span><br style="font-style: italic;"><span style="font-style: italic;">which is not present in the HTML DOM.  The list items need not implement Action,</span><br style="font-style: italic;"><span style="font-style: italic;">since the Selection interface is used by the client to select among them.]</span> </div>
      </td>
    </tr>
    <tr>
      <td>
        <p>Which sports do you like?<br>
        &lt;select name="sports" multiple="multiple" size="3"&gt;
        &lt;option&gt;Hockey&lt;/option&gt;
        &lt;option&gt;Basketball&lt;/option&gt;
        &lt;option&gt;Football&lt;/option&gt;
        &lt;option&gt;Baseball&lt;/option&gt;
        &lt;/select&gt;
        </p>
      </td>
      <td>
      <div style="white-space: pre;">&lt;form&gt;<br>  &lt;label for="sports"&gt;<br>    Which sports do you like<span class="plain">:</span> <br>    &lt;br&gt;<br>    &lt;select id="sports"<br>            multiple="multiple"<br>            size="3"&gt;<br>      &lt;option&gt;<br>        &lt;img src="beerglass.gif" <br>             alt="Beer"/&gt;<br>        Baseball<br>      &lt;/option&gt;<br>      &lt;option&gt;Basketball&lt;/option&gt;<br>      &lt;option&gt;Football&lt;/option&gt;<br>    &lt;/select&gt;<br>  &lt;/label&gt;<br>&lt;/form&gt;</div>
      </td>
      <td style="vertical-align: top;">
      <div style="white-space: pre;">{parent role=ROLE_FORM?}<br>  {child1 Text,<br>   role=ROLE_LABEL, <br>   RELATION_LABEL_FOR=child2,<br>   text="Which sports do you like<span class="plain">:</span>\n<strong><span style="font-size: 14pt; color: #ff0066">*</span></strong>"}  <br>  {child2 Object,<br>   accessible-name="sports" <span style="font-style: italic; font-family: sans-serif;">{{mediawiki.external('not sure exposing the id is a good idea though')}},</span> <br>   Selection,
   Hyperlink, <br>   StateSet=...MULTISELECT...<br>   attr="html<span class="plain">:</span>tag=select",<br>   role=ROLE_LIST, <br>   RELATION_LABELLED_BY=child2}<br>       {grandchild1, <br>  HyperText,  <br>   StateSet=...SELECTABLE, SELECTED..., <br> attr="html<span class="plain">:</span>tag=option",<br>        role=ROLE_LIST_ITEM, text="<strong><span style="font-size: 14pt; color: #ff0066">*</span></strong>Baseball"}<br>   {great-grandchild Image, Hyperlink,<br>    role=ROLE_IMAGE,<br>           attr="html<span class="plain">:</span>tag=img, link-type=image",<br>    hyperlink-URI="beerglass.gif",<br>    hyperlink-indices={{mediawiki.external(0,1)}}}<br>       {grandchild2,<br> Text,<br>  StateSet=...SELECTABLE..., <br> attr="html<span class="plain">:</span>tag=option",<br>   role=ROLE_LIST_ITEM, text="Basketball"}<br>       {grandchild3 Text, <br> StateSet=...SELECTABLE...,<br>  role=ROLE_LIST_ITEM,<br>  attr="html<span class="plain">:</span>tag=option",<br>        text="Football"}<br></div>
      </td>
    </tr>
    <tr>
      <td>
To do<span class="plain">:</span> HTML table example</td>
      <td>
      </td>
      <td style="vertical-align: top">
      </td>
    </tr>
    <tr>
      <td>
        To do<span class="plain">:</span> DHTML role example</td>
      <td>
      </td>
      <td style="vertical-align: top">
      </td>
    </tr>
</tbody></table>
<h2 name="Beyond_HTML:_Other_Types_of_Web_Content">Beyond HTML: Other Types of Web Content</h2>
<ul><li> You may have heard of some content types beyond HTML, and want to know if Gecko based products will support them:
</li><li> <a class="external" href="http://developer.mozilla.org/en/docs/Accessible_DHTML">DHTML and AJAX</a><span class="plain">: Gecko and other browsers have long supported dynamic content, where the page appearance changes because of JavaScript. This can be used to create the appearance of desktop-style widgets like menus, spreadsheets and tree views which HTML lacks. Or, it can be used to completely change content on the fly, without loading a new page. Previously it was not posible to make this accessible, but Mozilla supports </span><a class="external" href="http://developer.mozilla.org/en/docs/Accessible_DHTML">Accessible DHTML</a>, which allows authors to make advanced widgets and web applications accessible.
</li><li> <a class="external" href="http://www.w3.org/Math/">MathML</a><span class="plain">: an XML dialect used to display full math notation on web pages. </span><a class="external" href="http://www.mozilla.org/projects/mathml/">Here's the ongoing Mozilla project to support MathML</a> . We do not currently have plans to support MSAA for MathML - we will likely suggest use of the external DOM for this, because MSAA simply does not have the right semantics in it to support mathematics. MathML support is currently built into Firefox.
</li><li> <a class="external" href="http://www.w3.org/Graphics/SVG/Overview.html">SVG</a> : Scalable Vector Graphics. Essentially W3C's XML-based version of Flash - mixes well with other markup based content, supports the DOM and has accessibility features. <a class="external" href="http://www.mozilla.org/projects/svg/">Mozilla's SVG Project</a> has been through several stalls and rebirths -- SVG will probably become more of a priority if other well known browsers support it. We will not know how, or whether, we will support SVG accessibility until a better implementation comes along. Firefox 1.5 supports SVG. Potentially it can make use of the same namespaced role and state attributes as DHTML accessibility, but it may require more powerful author-definable relationships.
</li><li> <a class="external" href="http://www.mozilla.org/projects/xforms/">XForms</a><span class="plain">: XForms is the future of online forms as envisioned by the W3C. Drawing on other W3C standards like XML Schema, XPath, and XML Events, XForms tries to address some of the limitations with the current HTML forms model. One of the key features of XForms is accessibility. XForms accessibility development is currently being developed for Mozilla 1.9 (Firefox 3) by Alexander Surkov.</span>
</li><li> <a class="external" href="http://www.xulplanet.com/">XUL</a><span class="plain">: The XML-based language used by Firefox and Mozilla to develop the UI. Similar to HTML in that it can be combined with CSS and Javascript to make powerful applications. Contains more desktop-style widgets than HTML and follows a box layout model, rather than being text-flow based. In the future more standalone applications will use XUL via </span><a class="external" href="http://wiki.mozilla.org/XUL:Xul_Runner">Xulrunner</a>.
</li></ul>
<h2 name="Questions_or_Comments.3F">Questions or Comments?</h2>
<p>Please discuss accessibility issues on the <a class="external" href="http://www.mozilla.org/community/developer-forums.html#dev-accessibility">Mozilla Accessibility mailing list</a> or on the <a class="external" href="irc://irc.mozilla.org/accessibility">Mozilla Accessibility IRC channel</a>.
</p>
Revert to this revision