summaryrefslogtreecommitdiff
path: root/accessible/mac/mozTextAccessible.mm
diff options
context:
space:
mode:
Diffstat (limited to 'accessible/mac/mozTextAccessible.mm')
-rw-r--r--accessible/mac/mozTextAccessible.mm627
1 files changed, 0 insertions, 627 deletions
diff --git a/accessible/mac/mozTextAccessible.mm b/accessible/mac/mozTextAccessible.mm
deleted file mode 100644
index 1f433b802e..0000000000
--- a/accessible/mac/mozTextAccessible.mm
+++ /dev/null
@@ -1,627 +0,0 @@
-/* -*- Mode: Objective-C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "Accessible-inl.h"
-#include "HyperTextAccessible-inl.h"
-#include "TextLeafAccessible.h"
-
-#include "nsCocoaUtils.h"
-#include "nsObjCExceptions.h"
-
-#import "mozTextAccessible.h"
-
-using namespace mozilla;
-using namespace mozilla::a11y;
-
-inline bool
-ToNSRange(id aValue, NSRange* aRange)
-{
- NS_PRECONDITION(aRange, "aRange is nil");
-
- if ([aValue isKindOfClass:[NSValue class]] &&
- strcmp([(NSValue*)aValue objCType], @encode(NSRange)) == 0) {
- *aRange = [aValue rangeValue];
- return true;
- }
-
- return false;
-}
-
-inline NSString*
-ToNSString(id aValue)
-{
- if ([aValue isKindOfClass:[NSString class]]) {
- return aValue;
- }
-
- return nil;
-}
-
-@interface mozTextAccessible ()
-- (NSString*)subrole;
-- (NSString*)selectedText;
-- (NSValue*)selectedTextRange;
-- (NSValue*)visibleCharacterRange;
-- (long)textLength;
-- (BOOL)isReadOnly;
-- (NSNumber*)caretLineNumber;
-- (void)setText:(NSString*)newText;
-- (NSString*)text;
-- (NSString*)stringFromRange:(NSRange*)range;
-@end
-
-@implementation mozTextAccessible
-
-- (BOOL)accessibilityIsIgnored
-{
- return ![self getGeckoAccessible] && ![self getProxyAccessible];
-}
-
-- (NSArray*)accessibilityAttributeNames
-{
- NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
-
- static NSMutableArray* supportedAttributes = nil;
- if (!supportedAttributes) {
- // text-specific attributes to supplement the standard one
- supportedAttributes = [[NSMutableArray alloc] initWithObjects:
- NSAccessibilitySelectedTextAttribute, // required
- NSAccessibilitySelectedTextRangeAttribute, // required
- NSAccessibilityNumberOfCharactersAttribute, // required
- NSAccessibilityVisibleCharacterRangeAttribute, // required
- NSAccessibilityInsertionPointLineNumberAttribute,
- @"AXRequired",
- @"AXInvalid",
- nil
- ];
- [supportedAttributes addObjectsFromArray:[super accessibilityAttributeNames]];
- }
- return supportedAttributes;
-
- NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
-}
-
-- (id)accessibilityAttributeValue:(NSString*)attribute
-{
- NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
-
- if ([attribute isEqualToString:NSAccessibilityNumberOfCharactersAttribute])
- return [NSNumber numberWithInt:[self textLength]];
-
- if ([attribute isEqualToString:NSAccessibilityInsertionPointLineNumberAttribute])
- return [self caretLineNumber];
-
- if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute])
- return [self selectedTextRange];
-
- if ([attribute isEqualToString:NSAccessibilitySelectedTextAttribute])
- return [self selectedText];
-
- if ([attribute isEqualToString:NSAccessibilityTitleAttribute])
- return @"";
-
- if ([attribute isEqualToString:NSAccessibilityValueAttribute]) {
- // Apple's SpeechSynthesisServer expects AXValue to return an AXStaticText
- // object's AXSelectedText attribute. See bug 674612 for details.
- // Also if there is no selected text, we return the full text.
- // See bug 369710 for details.
- if ([[self role] isEqualToString:NSAccessibilityStaticTextRole]) {
- NSString* selectedText = [self selectedText];
- return (selectedText && [selectedText length]) ? selectedText : [self text];
- }
-
- return [self text];
- }
-
- if (AccessibleWrap* accWrap = [self getGeckoAccessible]) {
- if ([attribute isEqualToString:@"AXRequired"]) {
- return [NSNumber numberWithBool:!!(accWrap->State() & states::REQUIRED)];
- }
-
- if ([attribute isEqualToString:@"AXInvalid"]) {
- return [NSNumber numberWithBool:!!(accWrap->State() & states::INVALID)];
- }
- } else if (ProxyAccessible* proxy = [self getProxyAccessible]) {
- if ([attribute isEqualToString:@"AXRequired"]) {
- return [NSNumber numberWithBool:!!(proxy->State() & states::REQUIRED)];
- }
-
- if ([attribute isEqualToString:@"AXInvalid"]) {
- return [NSNumber numberWithBool:!!(proxy->State() & states::INVALID)];
- }
- }
-
- if ([attribute isEqualToString:NSAccessibilityVisibleCharacterRangeAttribute])
- return [self visibleCharacterRange];
-
- // let mozAccessible handle all other attributes
- return [super accessibilityAttributeValue:attribute];
-
- NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
-}
-
-- (NSArray*)accessibilityParameterizedAttributeNames
-{
- static NSArray* supportedParametrizedAttributes = nil;
- // text specific parametrized attributes
- if (!supportedParametrizedAttributes) {
- supportedParametrizedAttributes = [[NSArray alloc] initWithObjects:
- NSAccessibilityStringForRangeParameterizedAttribute,
- NSAccessibilityLineForIndexParameterizedAttribute,
- NSAccessibilityRangeForLineParameterizedAttribute,
- NSAccessibilityAttributedStringForRangeParameterizedAttribute,
- NSAccessibilityBoundsForRangeParameterizedAttribute,
-#if DEBUG
- NSAccessibilityRangeForPositionParameterizedAttribute,
- NSAccessibilityRangeForIndexParameterizedAttribute,
- NSAccessibilityRTFForRangeParameterizedAttribute,
- NSAccessibilityStyleRangeForIndexParameterizedAttribute,
-#endif
- nil
- ];
- }
- return supportedParametrizedAttributes;
-}
-
-- (id)accessibilityAttributeValue:(NSString*)attribute forParameter:(id)parameter
-{
- AccessibleWrap* accWrap = [self getGeckoAccessible];
- ProxyAccessible* proxy = [self getProxyAccessible];
-
- HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
- if (!textAcc && !proxy)
- return nil;
-
- if ([attribute isEqualToString:NSAccessibilityStringForRangeParameterizedAttribute]) {
- NSRange range;
- if (!ToNSRange(parameter, &range)) {
-#if DEBUG
- NSLog(@"%@: range not set", attribute);
-#endif
- return @"";
- }
-
- return [self stringFromRange:&range];
- }
-
- if ([attribute isEqualToString:NSAccessibilityRangeForLineParameterizedAttribute]) {
- // XXX: actually get the integer value for the line #
- return [NSValue valueWithRange:NSMakeRange(0, [self textLength])];
- }
-
- if ([attribute isEqualToString:NSAccessibilityAttributedStringForRangeParameterizedAttribute]) {
- NSRange range;
- if (!ToNSRange(parameter, &range)) {
-#if DEBUG
- NSLog(@"%@: range not set", attribute);
-#endif
- return @"";
- }
-
- return [[[NSAttributedString alloc] initWithString:[self stringFromRange:&range]] autorelease];
- }
-
- if ([attribute isEqualToString:NSAccessibilityLineForIndexParameterizedAttribute]) {
- // XXX: actually return the line #
- return [NSNumber numberWithInt:0];
- }
-
- if ([attribute isEqualToString:NSAccessibilityBoundsForRangeParameterizedAttribute]) {
- NSRange range;
- if (!ToNSRange(parameter, &range)) {
-#if DEBUG
- NSLog(@"%@:no range", attribute);
-#endif
- return nil;
- }
-
- int32_t start = range.location;
- int32_t end = start + range.length;
- DesktopIntRect bounds;
- if (textAcc) {
- bounds =
- DesktopIntRect::FromUnknownRect(textAcc->TextBounds(start, end));
- } else if (proxy) {
- bounds =
- DesktopIntRect::FromUnknownRect(proxy->TextBounds(start, end));
- }
-
- return [NSValue valueWithRect:nsCocoaUtils::GeckoRectToCocoaRect(bounds)];
- }
-
-#if DEBUG
- NSLog(@"unhandled attribute:%@ forParameter:%@", attribute, parameter);
-#endif
-
- return nil;
-}
-
-- (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute
-{
- NS_OBJC_BEGIN_TRY_ABORT_BLOCK_RETURN;
-
- if ([attribute isEqualToString:NSAccessibilityValueAttribute])
- return ![self isReadOnly];
-
- if ([attribute isEqualToString:NSAccessibilitySelectedTextAttribute] ||
- [attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute] ||
- [attribute isEqualToString:NSAccessibilityVisibleCharacterRangeAttribute])
- return YES;
-
- return [super accessibilityIsAttributeSettable:attribute];
-
- NS_OBJC_END_TRY_ABORT_BLOCK_RETURN(NO);
-}
-
-- (void)accessibilitySetValue:(id)value forAttribute:(NSString *)attribute
-{
- NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
-
- AccessibleWrap* accWrap = [self getGeckoAccessible];
- ProxyAccessible* proxy = [self getProxyAccessible];
-
- HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
- if (!textAcc && !proxy)
- return;
-
- if ([attribute isEqualToString:NSAccessibilityValueAttribute]) {
- [self setText:ToNSString(value)];
-
- return;
- }
-
- if ([attribute isEqualToString:NSAccessibilitySelectedTextAttribute]) {
- NSString* stringValue = ToNSString(value);
- if (!stringValue)
- return;
-
- int32_t start = 0, end = 0;
- nsString text;
- if (textAcc) {
- textAcc->SelectionBoundsAt(0, &start, &end);
- textAcc->DeleteText(start, end - start);
- nsCocoaUtils::GetStringForNSString(stringValue, text);
- textAcc->InsertText(text, start);
- } else if (proxy) {
- nsString data;
- proxy->SelectionBoundsAt(0, data, &start, &end);
- proxy->DeleteText(start, end - start);
- nsCocoaUtils::GetStringForNSString(stringValue, text);
- proxy->InsertText(text, start);
- }
- }
-
- if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) {
- NSRange range;
- if (!ToNSRange(value, &range))
- return;
-
- if (textAcc) {
- textAcc->SetSelectionBoundsAt(0, range.location,
- range.location + range.length);
- } else if (proxy) {
- proxy->SetSelectionBoundsAt(0, range.location,
- range.location + range.length);
- }
- return;
- }
-
- if ([attribute isEqualToString:NSAccessibilityVisibleCharacterRangeAttribute]) {
- NSRange range;
- if (!ToNSRange(value, &range))
- return;
-
- if (textAcc) {
- textAcc->ScrollSubstringTo(range.location, range.location + range.length,
- nsIAccessibleScrollType::SCROLL_TYPE_TOP_EDGE);
- } else if (proxy) {
- proxy->ScrollSubstringTo(range.location, range.location + range.length,
- nsIAccessibleScrollType::SCROLL_TYPE_TOP_EDGE);
- }
- return;
- }
-
- [super accessibilitySetValue:value forAttribute:attribute];
-
- NS_OBJC_END_TRY_ABORT_BLOCK;
-}
-
-- (NSString*)subrole
-{
- if(mRole == roles::PASSWORD_TEXT)
- return NSAccessibilitySecureTextFieldSubrole;
-
- return nil;
-}
-
-#pragma mark -
-
-- (BOOL)isReadOnly
-{
- NS_OBJC_BEGIN_TRY_ABORT_BLOCK_RETURN;
-
- if ([[self role] isEqualToString:NSAccessibilityStaticTextRole])
- return YES;
-
- AccessibleWrap* accWrap = [self getGeckoAccessible];
- HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
- if (textAcc)
- return (accWrap->State() & states::READONLY) == 0;
-
- if (ProxyAccessible* proxy = [self getProxyAccessible])
- return (proxy->State() & states::READONLY) == 0;
-
- return NO;
-
- NS_OBJC_END_TRY_ABORT_BLOCK_RETURN(NO);
-}
-
-- (NSNumber*)caretLineNumber
-{
- AccessibleWrap* accWrap = [self getGeckoAccessible];
- HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
-
- int32_t lineNumber = -1;
- if (textAcc) {
- lineNumber = textAcc->CaretLineNumber() - 1;
- } else if (ProxyAccessible* proxy = [self getProxyAccessible]) {
- lineNumber = proxy->CaretLineNumber() - 1;
- }
-
- return (lineNumber >= 0) ? [NSNumber numberWithInt:lineNumber] : nil;
-}
-
-- (void)setText:(NSString*)aNewString
-{
- NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
-
- AccessibleWrap* accWrap = [self getGeckoAccessible];
- HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
-
- nsString text;
- nsCocoaUtils::GetStringForNSString(aNewString, text);
- if (textAcc) {
- textAcc->ReplaceText(text);
- } else if (ProxyAccessible* proxy = [self getProxyAccessible]) {
- proxy->ReplaceText(text);
- }
-
- NS_OBJC_END_TRY_ABORT_BLOCK;
-}
-
-- (NSString*)text
-{
- AccessibleWrap* accWrap = [self getGeckoAccessible];
- ProxyAccessible* proxy = [self getProxyAccessible];
- HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
- if (!textAcc && !proxy)
- return nil;
-
- // A password text field returns an empty value
- if (mRole == roles::PASSWORD_TEXT)
- return @"";
-
- nsAutoString text;
- if (textAcc) {
- textAcc->TextSubstring(0, nsIAccessibleText::TEXT_OFFSET_END_OF_TEXT, text);
- } else if (proxy) {
- proxy->TextSubstring(0, nsIAccessibleText::TEXT_OFFSET_END_OF_TEXT, text);
- }
-
- return nsCocoaUtils::ToNSString(text);
-}
-
-- (long)textLength
-{
- NS_OBJC_BEGIN_TRY_ABORT_BLOCK_RETURN;
-
- AccessibleWrap* accWrap = [self getGeckoAccessible];
- ProxyAccessible* proxy = [self getProxyAccessible];
- HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
- if (!textAcc && !proxy)
- return 0;
-
- return textAcc ? textAcc->CharacterCount() : proxy->CharacterCount();
-
- NS_OBJC_END_TRY_ABORT_BLOCK_RETURN(0);
-}
-
-- (long)selectedTextLength
-{
- NS_OBJC_BEGIN_TRY_ABORT_BLOCK_RETURN;
-
- AccessibleWrap* accWrap = [self getGeckoAccessible];
- ProxyAccessible* proxy = [self getProxyAccessible];
- HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
- if (!textAcc && !proxy)
- return 0;
-
- int32_t start = 0, end = 0;
- if (textAcc) {
- textAcc->SelectionBoundsAt(0, &start, &end);
- } else if (proxy) {
- nsString data;
- proxy->SelectionBoundsAt(0, data, &start, &end);
- }
- return (end - start);
-
- NS_OBJC_END_TRY_ABORT_BLOCK_RETURN(0);
-}
-
-- (NSString*)selectedText
-{
- NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
-
- AccessibleWrap* accWrap = [self getGeckoAccessible];
- ProxyAccessible* proxy = [self getProxyAccessible];
- HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
- if (!textAcc && !proxy)
- return nil;
-
- int32_t start = 0, end = 0;
- nsAutoString selText;
- if (textAcc) {
- textAcc->SelectionBoundsAt(0, &start, &end);
- if (start != end) {
- textAcc->TextSubstring(start, end, selText);
- }
- } else if (proxy) {
- proxy->SelectionBoundsAt(0, selText, &start, &end);
- }
-
- return nsCocoaUtils::ToNSString(selText);
-
- NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
-}
-
-- (NSValue*)selectedTextRange
-{
- NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
-
- AccessibleWrap* accWrap = [self getGeckoAccessible];
- ProxyAccessible* proxy = [self getProxyAccessible];
- HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
-
- int32_t start = 0;
- int32_t end = 0;
- int32_t count = 0;
- if (textAcc) {
- count = textAcc->SelectionCount();
- if (count) {
- textAcc->SelectionBoundsAt(0, &start, &end);
- return [NSValue valueWithRange:NSMakeRange(start, end - start)];
- }
-
- start = textAcc->CaretOffset();
- return [NSValue valueWithRange:NSMakeRange(start != -1 ? start : 0, 0)];
- }
-
- if (proxy) {
- count = proxy->SelectionCount();
- if (count) {
- nsString data;
- proxy->SelectionBoundsAt(0, data, &start, &end);
- return [NSValue valueWithRange:NSMakeRange(start, end - start)];
- }
-
- start = proxy->CaretOffset();
- return [NSValue valueWithRange:NSMakeRange(start != -1 ? start : 0, 0)];
- }
-
- return [NSValue valueWithRange:NSMakeRange(0, 0)];
-
- NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
-}
-
-- (NSValue*)visibleCharacterRange
-{
- // XXX this won't work with Textarea and such as we actually don't give
- // the visible character range.
- AccessibleWrap* accWrap = [self getGeckoAccessible];
- ProxyAccessible* proxy = [self getProxyAccessible];
- HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
- if (!textAcc && !proxy)
- return 0;
-
- return [NSValue valueWithRange:
- NSMakeRange(0, textAcc ?
- textAcc->CharacterCount() : proxy->CharacterCount())];
-}
-
-- (void)valueDidChange
-{
- NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
-
- NSAccessibilityPostNotification(GetObjectOrRepresentedView(self),
- NSAccessibilityValueChangedNotification);
-
- NS_OBJC_END_TRY_ABORT_BLOCK;
-}
-
-- (void)selectedTextDidChange
-{
- NSAccessibilityPostNotification(GetObjectOrRepresentedView(self),
- NSAccessibilitySelectedTextChangedNotification);
-}
-
-- (NSString*)stringFromRange:(NSRange*)range
-{
- NS_PRECONDITION(range, "no range");
-
- AccessibleWrap* accWrap = [self getGeckoAccessible];
- ProxyAccessible* proxy = [self getProxyAccessible];
- HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
- if (!textAcc && !proxy)
- return nil;
-
- nsAutoString text;
- if (textAcc) {
- textAcc->TextSubstring(range->location,
- range->location + range->length, text);
- } else if (proxy) {
- proxy->TextSubstring(range->location,
- range->location + range->length, text);
- }
-
- return nsCocoaUtils::ToNSString(text);
-}
-
-@end
-
-@implementation mozTextLeafAccessible
-
-- (NSArray*)accessibilityAttributeNames
-{
- static NSMutableArray* supportedAttributes = nil;
- if (!supportedAttributes) {
- supportedAttributes = [[super accessibilityAttributeNames] mutableCopy];
- [supportedAttributes removeObject:NSAccessibilityChildrenAttribute];
- }
-
- return supportedAttributes;
-}
-
-- (id)accessibilityAttributeValue:(NSString*)attribute
-{
- if ([attribute isEqualToString:NSAccessibilityTitleAttribute])
- return @"";
-
- if ([attribute isEqualToString:NSAccessibilityValueAttribute])
- return [self text];
-
- return [super accessibilityAttributeValue:attribute];
-}
-
-- (NSString*)text
-{
- if (AccessibleWrap* accWrap = [self getGeckoAccessible]) {
- return nsCocoaUtils::ToNSString(accWrap->AsTextLeaf()->Text());
- }
-
- if (ProxyAccessible* proxy = [self getProxyAccessible]) {
- nsString text;
- proxy->Text(&text);
- return nsCocoaUtils::ToNSString(text);
- }
-
- return nil;
-}
-
-- (long)textLength
-{
- if (AccessibleWrap* accWrap = [self getGeckoAccessible]) {
- return accWrap->AsTextLeaf()->Text().Length();
- }
-
- if (ProxyAccessible* proxy = [self getProxyAccessible]) {
- nsString text;
- proxy->Text(&text);
- return text.Length();
- }
-
- return 0;
-}
-
-@end