Bug 1618708: Implement slider class and support required actions, valueDidChange event handling. r=eeejay

Differential Revision: https://phabricator.services.mozilla.com/D66667

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Morgan Reschenberg 2020-03-17 17:32:33 +00:00
Родитель 4795d60bd9
Коммит 852913f515
3 изменённых файлов: 79 добавлений и 0 удалений

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

@ -232,6 +232,9 @@ Class a11y::GetTypeFromRole(roles::Role aRole) {
case roles::TOGGLE_BUTTON:
return [mozCheckboxAccessible class];
case roles::SLIDER:
return [mozSliderAccessible class];
case roles::HEADING:
return [mozHeadingAccessible class];

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

@ -25,3 +25,10 @@
@interface mozPaneAccessible : mozAccessible
@end
/**
* Accessible for a slider
*/
@interface mozSliderAccessible : mozAccessible
@end

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

@ -220,3 +220,72 @@ enum CheckboxValue {
}
@end
@implementation mozSliderAccessible
- (NSArray*)accessibilityActionNames {
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
NSArray* actions = [super accessibilityActionNames];
static NSArray* sliderAttrs = nil;
if (!sliderAttrs) {
NSMutableArray* tempArray = [NSMutableArray new];
[tempArray addObject:NSAccessibilityIncrementAction];
[tempArray addObject:NSAccessibilityDecrementAction];
sliderAttrs = [[NSArray alloc] initWithArray:tempArray];
[tempArray release];
}
return [actions arrayByAddingObjectsFromArray:sliderAttrs];
NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
}
- (void)accessibilityPerformAction:(NSString*)action {
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
if ([action isEqualToString:NSAccessibilityIncrementAction]) {
[self changeValueBySteps:1];
} else if ([action isEqualToString:NSAccessibilityDecrementAction]) {
[self changeValueBySteps:-1];
} else {
[super accessibilityPerformAction:action];
}
NS_OBJC_END_TRY_ABORT_BLOCK;
}
/*
* Updates the accessible's current value by (factor * step).
* If incrementing factor should be positive, if decrementing
* factor should be negative.
*/
- (void)changeValueBySteps:(int)factor {
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
if (AccessibleWrap* accWrap = [self getGeckoAccessible]) {
double newVal = accWrap->CurValue() + (accWrap->Step() * factor);
if (newVal >= accWrap->MinValue() && newVal <= accWrap->MaxValue()) {
accWrap->SetCurValue(newVal);
}
} else if (ProxyAccessible* proxy = [self getProxyAccessible]) {
double newVal = proxy->CurValue() + (proxy->Step() * factor);
if (newVal >= proxy->MinValue() && newVal <= proxy->MaxValue()) {
proxy->SetCurValue(newVal);
}
}
NS_OBJC_END_TRY_ABORT_BLOCK;
}
- (void)valueDidChange {
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
NSAccessibilityPostNotification(GetObjectOrRepresentedView(self),
NSAccessibilityValueChangedNotification);
NS_OBJC_END_TRY_ABORT_BLOCK;
}
@end