Embedding API for Accessibility
Comments/Questions? Please contact the Mozilla Accessibility Community.
Mozilla needs to move in the direction of accessibility. Here is the W3C's definition of accessibility for a user agent like Mozilla.
In part, being accessible means supporting a built-in accessibility APIs for a platform, such as Microsoft Active Accessibility or ATK for Linux and UNIX desktops.
There are many other pieces, such as preferences to allow the user to change foreground and background colors, and font sizes. Mozilla already supports some of these options. This document lays out what we already have, and what we'll need later, in the embedding API to support accessibility.
Text Zoom on a Per-Window Basis
The nsIDOMWindow::GetTextZoom(float *zoomFactor)
and
nsIDOMWindow::SetTextZoom(float zoomFactor)
methods can be
used to set a wide range of text zoom factors on a content window. A zoom
factor of 1.0 represents 100%, or normal zoom. For double-sized text, use
nsIDOMWindow::SetTextZoom(2.0);
Using Accessibility Preferences
There are a number of prefs related to accessibility. For the most part, an automatic reframe is performed when one of these prefs is changed. A reframe fixes the appearance of the page to match the new prefs, without reloading the document over the network. Be aware that in debug builds, this can cause a great number of assertions (bug 71598)
To use prefs in embedding, use something like the following code:
#include "nsIPref.h"; nsresult rv; nsCOMPtr<nsIPref> prefs(do_GetService(NS_PREF_CONTRACTID, &rv)); prefs->SetBoolPref("bool.pref.name", PR_TRUE /* or PR_FALSE */); prefs->SetIntPref("int.pref.name", newValue); prefs->SetCharPref("string.pref.name", newCharStarValue);
To manually add a pref to your settings, add a line like the following to your prefs.js:
user_pref("accessibility.browsewithcaret", true);
Accessibility Prefs Reference
The following is a description of what accessibility prefs give us (or will give us), for accessibility:
Functionality | Implementation | Works as of |
---|---|---|
Images |
SetIntPref("network.image.imageBehavior", behavior);
/* behavior: 0=Accept, 1=Accept images from originating server only, 2=no images */
|
Moz 0.8 |
Cookies |
SetIntPref("network.cookie.cookieBehavior", behavior);
/* behavior: 0=Accept, 1=Accept cookies from originating server only, 2=no cookies */
SetBoolPref("network.cookie.warnAboutCookies", boolWarn);
|
Moz 0.8 |
Fonts |
SetCharPref("font.name.monospace.x-western", newFontName);
SetCharPref("font.name.serif.x-western", newFontName);
SetCharPref("font.name.sans-serif.x-western", newFontName);
/* For other i18n charsets, change x-western to x-central-euro, x-cyrillic, x-unicode, x-user-def, x-baltic, el, tr, he, ar, th, ja, zh-CN or zh-TW */
SetIntPref("font.size.fixed.x-western", newFontSize);
SetIntPref("font.size.variable.x-western", newFontSize);
/* For other i18n charsets, change the name as explained above for font face*/
SetCharPref("font.default","serif"); /* or "sans-serif" */
SetIntPref("browser.use_document_fonts", whichFonts);
/* whichFonts: 0=no, 1=yes */
|
Moz 0.8 |
Fonts from Operating system? |
SetBoolPref("browser.use_system_fonts", useSystemFonts);
|
No |
Colors for page |
SetCharPref("browser.display.foreground_color", "#abcdef" /* hex color value */);
SetCharPref("browser.display.background_color", "#abcdef" /* hex color value */);
SetBoolPref("browser.display.use_system_colors", boolSystemColors);
SetBoolPref("browser.display.use_document_colors", boolUseAuthorColors);
/* Setting use_document_colors also stops background images from loading */
|
Moz 0.8 |
Link appearance |
SetCharPref("browser.anchor_color", "#abcdef" /* hex color value */);
SetCharPref("browser.visited_color", "#abcdef" /* hex color value */);
SetBoolPref("browser.underline_anchors", boolUnderlineLinks);
|
Moz 0.8 |
Focus appearance |
SetBoolPref("browser.display.use_focus_colors", useFocusColors);
SetCharPref("browser.display.focus_background_color", colorString);
SetCharPref("browser.display.focus_text_color", colorString);
SetCharPref("browser.display.focus_ring_width", numPixels); /* 0-4 */
|
Moz 0.9.2 |
Text Selection appearance |
SetCharPref("browser.selection.background_color", colorString);
SetCharPref("browser.selection.foreground_color", colorString);
SetCharPref("browser.selection.border", cssBorderStyleString);
/* Is a selection border hard to implement? It's a W3C UAAG requirement */
SetBoolPref("browser.selection.use_system_colors", useSystemColors);
|
No |
Content Waiting Alerts |
SetCharPref("alert.audio.mail_waiting", pathToSoundFile);
SetCharPref("alert.audio.background_image_waiting", pathToSoundFile);
SetCharPref("alert.audio.popup_waiting", pathToSoundFile);
SetCharPref("alert.audio.applet_waiting", pathToSoundFile);
SetCharPref("alert.audio.script_waiting", pathToSoundFile);
SetCharPref("alert.audio.redirect_waiting", pathToSoundFile);
SetCharPref("alert.audio.refresh_waiting", pathToSoundFile);
SetCharPref("alert.audio.plugin_content_waiting", pathToSoundFile);
SetCharPref("alert.audio.video_waiting", pathToSoundFile);
SetCharPref("alert.audio.audio_waiting", pathToSoundFile);
SetCharPref("alert.audio.timed_event_waiting", pathToSoundFile);
/* These alerts will also be mirrored visually, either on the status bar or elsewhere */
|
No |
Background images |
SetBoolPref("browser.accept.background_images", acceptBackgroundImages);
|
No |
Blinking text |
SetBoolPref("browser.blink_allowed", acceptBlinkText);
|
No |
Animations |
SetCharPref("image.animation_mode", animationMode);
animationMode: "normal", "none", "once"
|
Moz 0.8 |
Applets |
SetBoolPref("browser.accept.applets", acceptApplets);
|
No |
Scripts |
SetBoolPref("browser.accept.scripts", acceptScripts);
|
No |
Popup windows |
// Turn window.open off for particular sites:
user_pref("capability.policy.popupsites.sites",
"http://www.annoyingsite1.com http://www.popupsite2.com");
user_pref("capability.policy.popupsites.windowinternal.open","noAccess");
// Or turn it off everywhere:
user_pref("capability.policy.default.windowinternal.open","noAccess");
// Override popping up new windows on target=anything
user_pref("browser.block.target_new_window", true);
// Override popup windows at beginning of new page load (blocks most popup advertisements)
user_pref("dom.disable_open_during_load", true);
|
Moz 0.8 |
Client side redirects |
SetBoolPref("browser.accept.redirects", acceptRedirects);
|
No |
Content refreshes |
SetBoolPref("browser.accept.refreshes", acceptRefreshes);
|
No |
Plugin content |
SetBoolPref("browser.accept.plugin_content.[plugin_name_goes_here]", acceptPluginContent);
|
No |
Video |
SetBoolPref("browser.accept.video", acceptVideo);
|
No |
Audio |
SetBoolPref("browser.accept.audio", acceptAudio);
|
No |
Timed events |
SetBoolPref("browser.accept.timed_events", acceptTimedEvents);
|
No |
Timer speed |
SetIntPref("timer.relative_speed", percent);
/* 100 corresponds to normal speed, 200 to double speed */
|
No |
Allow cycling in lists and links |
SetBoolPref("keyboardnav.allow_cycling", allowCycling);
|
No |
Mouse pointer moves with keyboard focus |
SetBoolPref("keyboardnav.mouse_follows_keyboard_focus", mouseFollows);
/* If this pref is set, the mouse pointer will always be move to the 0,0 pixel of the current
keyboard focus frame */
|
No |
Browse with caret |
SetBoolPref("accessibility.browsewithcaret", useCaret);
/* If this pref is set, the caret will be visible in the text of the browser, allowing the user to
cursor around the HTML content as if in a read-only editor */
|
Moz 0.9 |
Special Content Notifications
The W3C UAAG specifies types of content that must be optional. The intention is for a user to be notified of its existence, and at some point they can choose to load the content. This is a much better alternative than having the user go through a long series of confirm boxes for each new page, for each type of content.
For each preference named "browser.accept.*", there is also an "alert.audio.*" preference, to allow configuration of sound files to go with each type of content. The audio file could be a clip of a human voice saying "You've got video" or even a simple beep. How we expose this through the user interface is another matter.
Accepting Special Content on an Instance Basis
After being notified of special content, the user needs to be able to select specific unloaded content for loading.
One way of doing this is to build up the nsIWebBrowserAccessible interface, so that there is a method to force loading each type of content just for the current page in the current session.
Open Issue: Accessibility Settings per URL
A powerful possibility is that we design an interface for setting certain preferences based on the URL. If we can find a clean way to present it to the user, this would be extremely useful. For example, settings per URL would allow a user to accept scripts from their known benign web pages, but not others. Users may want similarity abilities with applets, background images, style sheets, etc.
We have a permissions system for cookies and images based on URL's. Perhaps it can be extended to store accessibility preferences. This is a UI issue we'll need to settle before we know where to go with the embedding accessibility interface.