Initial support for making comboboxes (for example the location bar in firefox) accessible. r=surkov, b=362079

Don't use performance-intensive NSAccessibilityUnignoredChildren() API since we no longer have to. r=surkov, b=363713
This commit is contained in:
hwaara%gmail.com 2006-12-18 13:57:37 +00:00
Родитель 3dedd0465d
Коммит 050bb0ad77
7 изменённых файлов: 106 добавлений и 6 удалений

Просмотреть файл

@ -183,7 +183,7 @@ GetNativeFromGeckoAccessible(nsIAccessible *anAccessible)
return nil;
if ([attribute isEqualToString:NSAccessibilityChildrenAttribute])
return NSAccessibilityUnignoredChildren ([self children]);
return [self children];
if ([attribute isEqualToString:NSAccessibilityParentAttribute])
return [self parent];
@ -371,6 +371,15 @@ GetNativeFromGeckoAccessible(nsIAccessible *anAccessible)
}
}
#ifdef DEBUG_hakan
// make sure we're not returning any ignored accessibles.
NSEnumerator *e = [mChildren objectEnumerator];
mozAccessible *m = nil;
while ((m = [e nextObject])) {
NSAssert1(![m accessibilityIsIgnored], @"we should never return an ignored accessible! (%@)", m);
}
#endif
return mChildren;
}

Просмотреть файл

@ -50,5 +50,6 @@
- (int)isChecked;
@end
/* Used for buttons that may pop up a menu. */
@interface mozPopupButtonAccessible : mozButtonAccessible
@end

Просмотреть файл

@ -11,3 +11,13 @@
nsIAccessibleEditableText *mGeckoEditableTextAccessible; // strong
}
@end
/* A combobox (in the mac world) is a textfield with an associated menu, for example
the location bar. */
@interface mozComboboxAccessible : mozTextAccessible
// equivalent to pressing return key in this textfield.
- (void)confirm;
// shows the menu for this combobox.
- (void)showMenu;
@end

Просмотреть файл

@ -181,3 +181,81 @@ extern const NSString *kTopLevelUIElementAttribute; // NSAccessibilityTopLevel
}
@end
@implementation mozComboboxAccessible
- (NSArray*)accessibilityAttributeNames
{
static NSArray *supportedAttributes = nil;
if (!supportedAttributes) {
// standard attributes that are shared and supported by all generic elements.
supportedAttributes = [[NSArray alloc] initWithObjects:NSAccessibilityParentAttribute, // required
NSAccessibilityRoleAttribute, // required
NSAccessibilityTitleAttribute,
NSAccessibilityValueAttribute, // required
NSAccessibilityHelpAttribute,
NSAccessibilityRoleDescriptionAttribute,
NSAccessibilityPositionAttribute, // required
NSAccessibilitySizeAttribute, // required
NSAccessibilityWindowAttribute, // required
NSAccessibilityFocusedAttribute, // required
NSAccessibilityEnabledAttribute, // required
NSAccessibilityChildrenAttribute, // required
NSAccessibilityHelpAttribute,
// NSAccessibilityExpandedAttribute, // required
kTopLevelUIElementAttribute, // required (on OS X 10.4+)
kInstanceDescriptionAttribute, // required (on OS X 10.4+)
/* text-specific attributes */
NSAccessibilitySelectedTextAttribute, // required
NSAccessibilitySelectedTextRangeAttribute, // required
NSAccessibilityNumberOfCharactersAttribute, // required
// TODO: NSAccessibilityVisibleCharacterRangeAttribute, // required
// TODO: NSAccessibilityInsertionPointLineNumberAttribute
nil];
}
return supportedAttributes;
}
- (NSArray *)accessibilityActionNames
{
if ([self isEnabled]) {
return [NSArray arrayWithObjects:NSAccessibilityConfirmAction,
NSAccessibilityShowMenuAction,
nil];
}
return nil;
}
- (NSString *)accessibilityActionDescription:(NSString *)action
{
if ([action isEqualToString:NSAccessibilityShowMenuAction])
return @"show menu";
if ([action isEqualToString:NSAccessibilityConfirmAction])
return @"confirm";
return [super accessibilityActionDescription:action];
}
- (void)accessibilityPerformAction:(NSString *)action
{
// both the ShowMenu and Click action do the same thing.
if ([self isEnabled]) {
if ([action isEqualToString:NSAccessibilityShowMenuAction])
[self showMenu];
if ([action isEqualToString:NSAccessibilityConfirmAction])
[self confirm];
}
}
- (void)showMenu
{
// currently unimplemented. waiting for support in bug 363697
}
- (void)confirm
{
// should be the same as pressing enter/return in this textfield.
// not yet implemented
}
@end

Просмотреть файл

@ -85,8 +85,7 @@ class nsAccessibleWrap : public nsAccessible
role == ROLE_PUSHBUTTON ||
role == ROLE_TOGGLE_BUTTON ||
role == ROLE_SPLITBUTTON ||
role == ROLE_ENTRY ||
role == ROLE_AUTOCOMPLETE);
role == ROLE_ENTRY);
}
// ignored means that the accessible might still have children, but is not displayed

Просмотреть файл

@ -117,6 +117,9 @@ nsAccessibleWrap::GetNativeType ()
case ROLE_CHECKBUTTON:
return [mozCheckboxAccessible class];
case ROLE_AUTOCOMPLETE:
return [mozComboboxAccessible class];
case ROLE_ENTRY:
case ROLE_STATICTEXT:
case ROLE_HEADING:
@ -124,8 +127,8 @@ nsAccessibleWrap::GetNativeType ()
case ROLE_CAPTION:
case ROLE_ACCEL_LABEL:
case ROLE_TEXT_LEAF:
case ROLE_AUTOCOMPLETE:
return [mozTextAccessible class];
// normal textfield (static or editable)
return [mozTextAccessible class];
case ROLE_COMBOBOX:
return [mozPopupButtonAccessible class];

Просмотреть файл

@ -142,7 +142,7 @@ static const NSString* AXRoles [] = {
NSAccessibilityGroupRole, // ROLE_FOOTER
NSAccessibilityGroupRole, // ROLE_PARAGRAPH
@"AXRuler", // ROLE_RULER. 10.4+ only, so we re-define the constant.
NSAccessibilityTextFieldRole, // ROLE_AUTOCOMPLETE
NSAccessibilityComboBoxRole, // ROLE_AUTOCOMPLETE
NSAccessibilityTextFieldRole, // ROLE_EDITBAR
NSAccessibilityTextFieldRole, // ROLE_ENTRY
NSAccessibilityStaticTextRole, // ROLE_CAPTION