Menu

Accessibility for Spark Components

SourceForge Editorial Staff

Accessibility for Spark Components - Functional and Design Specification


Glossary


accessibility - The practice of making software usable by all people regardless of their abilities or disabilities. For Flex applications, a primary concern is whether they can be used by visually impaired users.

MSAA - Microsoft Active Accessibility, a specification by which MSAA client applications such as JAWS, a screen reader, communicate with MSAA server applications such as Flash Player.

IAccessible - A COM interface defined by MSAA so that MSAA clients can talk to MSAA servers.

ISimpleTextSelection - Another COM interface defined by Adobe to supplement IAccessible by providing information about text selection in components with editable text, since MSAA does not include this information.

accessibility implementation class - A subclass of flash.accessibility.AccessibilityImplementation which provides default MSAA behavior for a component.

accessibility properties - Information set into the flash.accessibility.AccessibilityProperties instance associated with a component, which customizes the default behavior of the accessibility implementation class for a particular component instance.

Summary and Background


Most of the MX components had long had corresponding accessibility implementation classes. In Flex 4 we will provide accessibility implementaton classes for the new Spark components.

We will make it easier to write such classes by documenting the new Spark accessibility implementation classes in detail, and by providing and documenting the MSAA constants used in such classes.

We will make it easier to set the accessibility properties for a component by adding accessibilityName and accessibilityDescription properties to UIComponent.

Finally, we will turn on accessibility by default, so that unless a Flex application is compiled with -accessible=false it will automatically provide MSAA information to screen readers, when executing on Flash runtimes supporting MSAA.

Usage Scenarios


Same as for MX components.

Detailed Description


New accessibility implementation classes

The following Spark components will be made accessible by writing a corresponding accessibility implementation class (e.g., spark.accessibility.ButtonAccImpl to go with spark.components.Button). The MSAA behavior provided by these classes is described in each link below.

Spark Component
Accessibility Implementation Class

mx.accessibility.AccImpl
mx.accessibility.AccImpl

spark.components.Button
spark.accessibility.ButtonBaseAccImpl

spark.components.ButtonBar
spark.accessibility.ButtonBarBaseAccImpl

spark.components.CheckBox
spark.accessibility.CheckBoxAccImpl

spark.components.ComboBox
spark.accessibility.ComboBoxAccImpl

spark.components.DropDownList
spark.accessibility.DropDownListAccImpl

spark.components.HSlider
spark.accessibility.SliderBaseAccImpl

spark.components.Label
spark.accessibility.TextBaseAccImpl

spark.components.List
spark.accessibility.ListBaseAccImpl

spark.components.NumericStepper
spark.accessibility.NumericStepperAccImpl

spark.components.Panel
spark.accessibility.PanelAccImpl

spark.components.RadioButton
spark.accessibility.RadioButtonAccImpl

spark.components.RichEditableText
spark.accessibility.RichEditableTextAccImpl

spark.components.RichText
spark.accessibility.TextBaseAccImpl

spark.components.Spinner
spark.accessibility.SpinnerAccImpl

spark.components.TabBar
spark.accessibility.TabBarAccImpl

spark.components.TitleWindow
spark.accessibility.TitleWindowAccImpl

spark.components.ToggleButton
spark.accessibility.ToggleButtonAccImpl

spark.components.VideoPlayer
spark.accessibility.VideoPlayerAccImpl

spark.components.VSlider
spark.accessibility.SliderBaseAccImpl

spark.components.DataGrid
spark.accessibility.DataGridAccImpl

The Spark accessibility implementation classes, like the MX ones, will extend the existing mx.accessibility.AccImpl class, which itself extends flash.accessibility.AccessibilityImplementation. A description of AccImpl is here:

AccImpl

The Spark accessibility implementation classes will live in spark.swc in the spark.accessibility package.

MSAA constants

States

private static const STATE_SYSTEM_NORMAL:uint = 0×0;
private static const STATE_SYSTEM_UNAVAILABLE:uint = 0×00000001;
private static const STATE_SYSTEM_SELECTED:uint = 0×00000002;
private static const STATE_SYSTEM_FOCUSED:uint = 0×00000004;
private static const STATE_SYSTEM_PRESSED:uint = 0×00000008;
private static const STATE_SYSTEM_CHECKED:uint = 0×00000010;
private static const STATE_SYSTEM_MIXED:uint = 0×00000020;
private static const STATE_SYSTEM_INDETERMINATE:uint = 0×00000020;
private static const STATE_SYSTEM_READONLY:uint = 0×00000040;
private static const STATE_SYSTEM_HOTTRACKED:uint = 0×00000080;
private static const STATE_SYSTEM_DEFAULT:uint = 0×00000100;
private static const STATE_SYSTEM_EXPANDED:uint = 0×00000200;
private static const STATE_SYSTEM_COLLAPSED:uint = 0×00000400;
private static const STATE_SYSTEM_BUSY:uint = 0×00000800;
private static const STATE_SYSTEM_MARQUEED:uint = 0×00002000;
private static const STATE_SYSTEM_ANIMATED:uint = 0×00004000;
private static const STATE_SYSTEM_INVISIBLE:uint = 0×00008000;
private static const STATE_SYSTEM_OFFSCREEN:uint = 0×00010000;
private static const STATE_SYSTEM_SIZEABLE:uint = 0×00020000;
private static const STATE_SYSTEM_MOVEABLE:uint = 0×00040000;
private static const STATE_SYSTEM_SELFVOICING:uint = 0×00080000;
private static const STATE_SYSTEM_FOCUSABLE:uint = 0×00100000;
private static const STATE_SYSTEM_SELECTABLE:uint = 0×00200000;
private static const STATE_SYSTEM_LINKED:uint = 0×00400000;
private static const STATE_SYSTEM_TRAVERSED:uint = 0×00800000;
private static const STATE_SYSTEM_MULTISELECTABLE:uint = 0×01000000;
private static const STATE_SYSTEM_EXTSELECTABLE:uint = 0×02000000;
private static const STATE_SYSTEM_PROTECTED:uint = 0×20000000;
private static const STATE_SYSTEM_VALID:uint = 0×3fffffff;
private static const STATE_SYSTEM_HASPOPUP:uint = 0×40000000;

Roles

Predefined role constants (possible values of o.accRole(childId))
private static const ROLE_SYSTEM_TITLEBAR:uint = 0×1;
private static const ROLE_SYSTEM_MENUBAR:uint = 0×2;
private static const ROLE_SYSTEM_SCROLLBAR:uint = 0×3;
private static const ROLE_SYSTEM_GRIP:uint = 0×4;
private static const ROLE_SYSTEM_SOUND:uint = 0×5;
private static const ROLE_SYSTEM_CURSOR:uint = 0×6;
private static const ROLE_SYSTEM_CARET:uint = 0×7;
private static const ROLE_SYSTEM_ALERT:uint = 0×8;
private static const ROLE_SYSTEM_WINDOW:uint = 0×9;
private static const ROLE_SYSTEM_CLIENT:uint = 0xa;
private static const ROLE_SYSTEM_MENUPOPUP:uint = 0xb;
private static const ROLE_SYSTEM_MENUITEM:uint = 0xc;
private static const ROLE_SYSTEM_TOOLTIP:uint = 0xd;
private static const ROLE_SYSfTEM_APPLICATION:uint = 0xe;
private static const ROLE_SYSTEM_DOCUMENT:uint = 0xf;
private static const ROLE_SYSTEM_PANE:uint = 0×10;
private static const ROLE_SYSTEM_CHART:uint = 0×11;
private static const ROLE_SYSTEM_DIALOG:uint = 0×12;
private static const ROLE_SYSTEM_BORDER:uint = 0×13;
private static const ROLE_SYSTEM_GROUPING:uint = 0×14;
private static const ROLE_SYSTEM_SEPARATOR:uint = 0×15;
private static const ROLE_SYSTEM_TOOLBAR:uint = 0×16;
private static const ROLE_SYSTEM_STATUSBAR:uint = 0×17;
private static const ROLE_SYSTEM_TABLE:uint = 0×18;
private static const ROLE_SYSTEM_COLUMNHEADER:uint = 0×19;
private static const ROLE_SYSTEM_ROWHEADER:uint = 0×1a;
private static const ROLE_SYSTEM_COLUMN:uint = 0×1b;
private static const ROLE_SYSTEM_ROW:uint = 0×1c;
private static const ROLE_SYSTEM_CELL:uint = 0×1d;
private static const ROLE_SYSTEM_LINK:uint = 0×1e;
private static const ROLE_SYSTEM_HELPBALLOON:uint = 0×1f;
private static const ROLE_SYSTEM_CHARACTER:uint = 0×20;
private static const ROLE_SYSTEM_LIST:uint = 0×21;
private static const ROLE_SYSTEM_LISTITEM:uint = 0×22;
private static const ROLE_SYSTEM_OUTLINE:uint = 0×23;
private static const ROLE_SYSTEM_OUTLINEITEM:uint = 0×24;
private static const ROLE_SYSTEM_PAGETAB:uint = 0×25;
private static const ROLE_SYSTEM_PROPERTYPAGE:uint = 0×26;
private static const ROLE_SYSTEM_INDICATOR:uint = 0×27;
private static const ROLE_SYSTEM_GRAPHIC:uint = 0×28;
private static const ROLE_SYSTEM_STATICTEXT:uint = 0×29;
private static const ROLE_SYSTEM_TEXT:uint = 0×2a;
private static const ROLE_SYSTEM_PUSHBUTTON:uint = 0×2b;
private static const ROLE_SYSTEM_CHECKBUTTON:uint = 0×2c;
private static const ROLE_SYSTEM_RADIOBUTTON:uint = 0×2d;
private static const ROLE_SYSTEM_COMBOBOX:uint = 0×2e;
private static const ROLE_SYSTEM_DROPLIST:uint = 0×2f;
private static const ROLE_SYSTEM_PROGRESSBAR:uint = 0×30;
private static const ROLE_SYSTEM_DIAL:uint = 0×31;
private static const ROLE_SYSTEM_HOTKEYFIELD:uint = 0×32;
private static const ROLE_SYSTEM_SLIDER:uint = 0×33;
private static const ROLE_SYSTEM_SPINBUTTON:uint = 0×34;
private static const ROLE_SYSTEM_DIAGRAM:uint = 0×35;
private static const ROLE_SYSTEM_ANIMATION:uint = 0×36;
private static const ROLE_SYSTEM_EQUATION:uint = 0×37;
private static const ROLE_SYSTEM_BUTTONDROPDOWN:uint = 0×38;
private static const ROLE_SYSTEM_BUTTONMENU:uint = 0×39;
private static const ROLE_SYSTEM_BUTTONDROPDOWNGRID:uint = 0×3a;
private static const ROLE_SYSTEM_WHITESPACE:uint = 0×3b;
private static const ROLE_SYSTEM_PAGETABLIST:uint = 0×3c;
private static const ROLE_SYSTEM_CLOCK:uint = 0×3d;
private static const ROLE_SYSTEM_SPLITBUTTON:uint = 0×3e;
private static const ROLE_SYSTEM_IPADDRESS:uint = 0×3f;
private static const ROLE_SYSTEM_OUTLINEBUTTON:uint = 0×40;

Events

private static const EVENT_MIN:uint = 0×00000001;
private static const EVENT_MAX:uint = 0×7FFFFFFF;
private static const EVENT_SYSTEM_SOUND:uint = 0×0001;
private static const EVENT_SYSTEM_ALERT:uint = 0×0002;
private static const EVENT_SYSTEM_FOREGROUND:uint = 0×0003;
private static const EVENT_SYSTEM_MENUSTART:uint = 0×0004;
private static const EVENT_SYSTEM_MENUEND:uint = 0×0005;
private static const EVENT_SYSTEM_MENUPOPUPSTART:uint = 0×0006;
private static const EVENT_SYSTEM_MENUPOPUPEND:uint = 0×0007;
private static const EVENT_SYSTEM_CAPTURESTART:uint = 0×0008;
private static const EVENT_SYSTEM_CAPTUREEND:uint = 0×0009;
private static const EVENT_SYSTEM_MOVESIZESTART:uint = 0×000A;
private static const EVENT_SYSTEM_MOVESIZEEND:uint = 0×000B;
private static const EVENT_SYSTEM_CONTEXTHELPSTART:uint = 0×000C;
private static const EVENT_SYSTEM_CONTEXTHELPEND:uint = 0×000D;
private static const EVENT_SYSTEM_DRAGDROPSTART:uint = 0×000E;
private static const EVENT_SYSTEM_DRAGDROPEND:uint = 0×000F;
private static const EVENT_SYSTEM_DIALOGSTART:uint = 0×0010;
private static const EVENT_SYSTEM_DIALOGEND:uint = 0×0011;
private static const EVENT_SYSTEM_SCROLLINGSTART:uint = 0×0012;
private static const EVENT_SYSTEM_SCROLLINGEND:uint = 0×0013;
private static const EVENT_SYSTEM_SWITCHSTART:uint = 0×0014;
private static const EVENT_SYSTEM_SWITCHEND:uint = 0×0015;
private static const EVENT_SYSTEM_MINIMIZESTART:uint = 0×0016;
private static const EVENT_SYSTEM_MINIMIZEEND:uint = 0×0017;
private static const EVENT_OBJECT_CREATE:uint = 0×8000
private static const EVENT_OBJECT_DESTROY:uint = 0×8001
private static const EVENT_OBJECT_SHOW:uint = 0×8002
private static const EVENT_OBJECT_HIDE:uint = 0×8003
private static const EVENT_OBJECT_REORDER:uint = 0×8004
private static const EVENT_OBJECT_FOCUS:uint = 0×8005
private static const EVENT_OBJECT_SELECTION:uint = 0×8006
private static const EVENT_OBJECT_SELECTIONADD:uint = 0×8007
private static const EVENT_OBJECT_SELECTIONREMOVE:uint = 0×8008
private static const EVENT_OBJECT_SELECTIONWITHIN:uint = 0×8009
private static const EVENT_OBJECT_STATECHANGE:uint = 0×800A
private static const EVENT_OBJECT_LOCATIONCHANGE:uint = 0×800B
private static const EVENT_OBJECT_NAMECHANGE:uint = 0×800C
private static const EVENT_OBJECT_DESCRIPTIONCHANGE:uint = 0×800D;
private static const EVENT_OBJECT_VALUECHANGE:uint = 0×800E;
private static const EVENT_OBJECT_PARENTCHANGE:uint = 0×800F;
private static const EVENT_OBJECT_HELPCHANGE:uint = 0×8010 ;
private static const EVENT_OBJECT_DEFACTIONCHANGE:uint = 0×8011;
private static const EVENT_OBJECT_ACCELERATORCHANGE:uint = 0×8012;

TBD

New accessors on UIComponent for accessibility properties

To make it easier to set per-instance accessibility properties in MXML, we will add four new convenience getter/setters to UIComponent:

AccessibilityProperties property
UIComponent convenience accessor

description
accessibilityDescription

forceSimple

name
accessibilityName

noAutoLabeling

shortcut
accessibilityShortcut

silent
accessibilityEnabled

The getters will simply return the relevant property of the UIComponent's accessibilityProperties object, or the default value if accessibilityProperties is null.

The setters will create the accessibilityProperties object if it does not yet exist, and then set the relevant property.

We will not expose convenience accessors for forceSimple or noAutoLabeling because Flex applications should not set these. Flash Player only supports a two-level hierarchy of IAccessible objects, and setting forceSimple to true in order to ignore the grandchildren doesn't seem useful. The Flash Player's auto-labeling algorithm is inappropriate for Flex apps, especially when we support "mirrored" layout for right-to-left locales.

Accessibility enabled by default

The mxmlc compiler will default to using the option -accessible=true. This results in the required accessibility implementation classes being linked in and initialized, so that each UIComponent's accessibilityImplementation is non-null.

How the MSAA AccName is constructed for form fields

The AccImpl name for a control is only part of the ultimate name of that control if the control is in a form. The full MSAA name of such a control consists of the following parts, in this order, with a space between parts:

  • The form's name.
  • The phrase "Required field" if the field is required.
  • The name of the form item containing the field.
  • The value of AccessibilityProperties.Name.
  • The AccImpl name.
  • The value of GetStatusName (tooltip or error string).

API Description


New accessibility implementation classes

The new accessibility implementation classes live in the spark.accessibility package. Each one extends either mx.accessibility.AccImpl or another Spark acc impl:

New accessibility implementation class
Extends

spark.accessibility.ButtonAccImpl
mx.accessibility.AccImpl

They do not introduce any new properties or methods.

The ASDoc for each new class will be the description in the component links above.

MSAA constants

TBD

New accessors on UIComponent for accessibility properties

The following getter/setters will be added to UIComponent:

/**
 *  A convenience accessor for the 'silent' property
 *  in this UIComponent's accessibilityProperties object.
 *
 *  Note that accessibilityEnabled has the opposite sense from silent;
 *  accessibilityEnabled is true when silent is false and vice versa.
 *
 *  The getter simply returns accessibilityProperties.silent,
 *  or true if accessibilityProperties is null.
 *  The setter first checks whether accessibilityProperties is null, and if it is,
 *  sets it to a new AccessibilityProperties instance;
 *  then it sets accessibilityProperties.silent.
 */
public function get accessibilityEnabled():Boolean
public function set accessibilityEnabled(value:Boolean):void

/**
 *  A convenience accessor for the 'name' property
 *  in this UIComponent's accessibilityProperties object.
 *
 *  The getter simply returns accessibilityProperties.name,
 *  or "" if accessibilityProperties is null.
 *  The setter first checks whether accessibilityProperties is null, and if it is,
 *  sets it to a new AccessibilityProperties instance;
 *  then it sets accessibilityProperties.name.
 */
public function get accessibilityName():String
public function set accessibilityName(value:String):void

/**
 *  A convenience accessor for the 'description' property
 *  in this UIComponent's accessibilityProperties object.
 *
 *  The getter simply returns accessibilityProperties.description,
 *  or "" if accessibilityProperties is null.
 *  The setter first checks whether accessibilityProperties is null, and if it is,
 *  sets it to a new AccessibilityProperties instance;
 *  then it sets accessibilityProperties.description.
 */
public function get accessibilityDescription():String
public function set accessibilityDescription(value:String):void

/**
 *  A convenience accessor for the 'shortcut' property
 *  in this UIComponent's accessibilityProperties object.
 *
 *  The getter simply returns accessibilityProperties.shortcut,
 *  or "" if accessibilityProperties is null.
 *  The setter first checks whether accessibilityProperties is null, and if it is,
 *  sets it to a new AccessibilityProperties instance;
 *  then it sets accessibilityProperties.shortcut.
 */
public function get accessibilityShortcut():String
public function set accessibilityShortcut(value:String):void

B Features


None.

Examples and Usage


TBD

Additional Implementation Details


TBD

Prototype Work


None.

Compiler Work


None.

Web Tier Compiler Impact


None.

Flex Feature Dependencies


None.

Backwards Compatibility


Syntax changes

None.

Behavior

None.

Warnings/Deprecation

None.

Accessibility


That's what this feature is all about!

Performance


No performance issue.

Globalization


None.

Localization


Compiler Features

None.

Framework Features

TBD.

Issues and Recommendations


Open Issues

None.

Resolved Issues

None.

Documentation


TBD

QA


TBD


Related

Wiki: Flex 4
Wiki: MX AccImpl
Wiki: Spark ButtonBarBaseAccImpl
Wiki: Spark ButtonBaseAccImpl
Wiki: Spark CheckBoxAccImpl
Wiki: Spark ComboBoxAccImpl
Wiki: Spark DataGridAccImpl
Wiki: Spark DropDownListAccImpl
Wiki: Spark ListBaseAccImpl
Wiki: Spark NumericStepperAccImpl
Wiki: Spark PanelAccImpl
Wiki: Spark RadioButtonAccImpl
Wiki: Spark RichEditableTextAccImpl
Wiki: Spark SliderBaseAccImpl
Wiki: Spark SpinnerAccImpl
Wiki: Spark TextBaseAccImpl
Wiki: Spark TitleWindowAccImpl
Wiki: Spark ToggleButtonAccImpl
Wiki: Spark VideoPlayerAccImpl

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.