From 684dcdbc926f1017e97b75b42fa7312f98d5dc02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Wang?= Date: Thu, 1 Oct 2015 16:00:00 +0200 Subject: [PATCH] Bug 1178272 - Move table semantics to a separate mozTableAccessible.mm file. r=surkov --- accessible/mac/AccessibleWrap.mm | 10 ++ accessible/mac/Platform.mm | 14 +- accessible/mac/moz.build | 1 + accessible/mac/mozAccessible.mm | 185 --------------------- accessible/mac/mozTableAccessible.h | 28 ++++ accessible/mac/mozTableAccessible.mm | 240 +++++++++++++++++++++++++++ 6 files changed, 292 insertions(+), 186 deletions(-) create mode 100644 accessible/mac/mozTableAccessible.h create mode 100644 accessible/mac/mozTableAccessible.mm diff --git a/accessible/mac/AccessibleWrap.mm b/accessible/mac/AccessibleWrap.mm index b196504a891..512bc0ee023 100644 --- a/accessible/mac/AccessibleWrap.mm +++ b/accessible/mac/AccessibleWrap.mm @@ -13,6 +13,7 @@ #import "mozAccessible.h" #import "mozActionElements.h" #import "mozHTMLAccessible.h" +#import "mozTableAccessible.h" #import "mozTextAccessible.h" using namespace mozilla; @@ -62,6 +63,15 @@ AccessibleWrap::GetNativeType () if (IsXULTabpanels()) return [mozPaneAccessible class]; + if (IsTable()) + return [mozTableAccessible class]; + + if (IsTableRow()) + return [mozTableRowAccessible class]; + + if (IsTableCell()) + return [mozTableCellAccessible class]; + return GetTypeFromRole(Role()); NS_OBJC_END_TRY_ABORT_BLOCK_NIL; diff --git a/accessible/mac/Platform.mm b/accessible/mac/Platform.mm index 6ed294ce1cb..faae02af01d 100644 --- a/accessible/mac/Platform.mm +++ b/accessible/mac/Platform.mm @@ -8,6 +8,7 @@ #include "Platform.h" #include "ProxyAccessible.h" +#include "mozTableAccessible.h" #include "nsAppShell.h" @@ -38,7 +39,18 @@ void ProxyCreated(ProxyAccessible* aProxy, uint32_t) { // Pass in dummy state for now as retrieving proxy state requires IPC. - Class type = GetTypeFromRole(aProxy->Role()); + // Note that we can use ProxyAccessible::IsTable* functions here because they + // do not use IPC calls but that might change after bug 1210477. + Class type; + if (aProxy->IsTable()) + type = [mozTableAccessible class]; + else if (aProxy->IsTableRow()) + type = [mozTableRowAccessible class]; + else if (aProxy->IsTableCell()) + type = [mozTableCellAccessible class]; + else + type = GetTypeFromRole(aProxy->Role()); + uintptr_t accWrap = reinterpret_cast(aProxy) | IS_PROXY; mozAccessible* mozWrapper = [[type alloc] initWithAccessible:accWrap]; aProxy->SetWrapper(reinterpret_cast(mozWrapper)); diff --git a/accessible/mac/moz.build b/accessible/mac/moz.build index 7f1a866920e..8c9500b65ae 100644 --- a/accessible/mac/moz.build +++ b/accessible/mac/moz.build @@ -21,6 +21,7 @@ UNIFIED_SOURCES += [ 'mozActionElements.mm', 'mozDocAccessible.mm', 'mozHTMLAccessible.mm', + 'mozTableAccessible.mm', 'mozTextAccessible.mm', 'Platform.mm', 'RootAccessibleWrap.mm', diff --git a/accessible/mac/mozAccessible.mm b/accessible/mac/mozAccessible.mm index ca652674a8b..60488aebaf0 100644 --- a/accessible/mac/mozAccessible.mm +++ b/accessible/mac/mozAccessible.mm @@ -224,42 +224,6 @@ ConvertToNSArray(nsTArray& aArray) NS_OBJC_END_TRY_ABORT_BLOCK_RETURN(NO); } -- (BOOL)isLayoutTablePart -{ - if (AccessibleWrap* accWrap = [self getGeckoAccessible]) { - TableAccessible* table = nullptr; - if (accWrap->IsTable()) { - table = accWrap->AsTable(); - } else if (accWrap->IsTableRow()) { - for (Accessible* acc = accWrap; acc; acc = acc->Parent()) { - if (acc->IsTable()) { - table = acc->AsTable(); - break; - } - } - } else if (accWrap->IsTableCell()) { - table = accWrap->AsTableCell()->Table(); - } - return table && table->IsProbablyLayoutTable(); - } - - if (ProxyAccessible* proxy = [self getProxyAccessible]) { - ProxyAccessible* tableProxy = nullptr; - if (proxy->IsTable()) { - tableProxy = proxy; - } else if (proxy->IsTableRow() || proxy->IsTableCell()) { - for (tableProxy = proxy; tableProxy; tableProxy = tableProxy->Parent()) { - if (tableProxy->IsTable()) { - break; - } - } - } - return tableProxy && tableProxy->TableIsProbablyForLayout(); - } - - return false; -} - - (NSArray*)additionalAccessibilityAttributeNames { NSMutableArray* additional = [NSMutableArray array]; @@ -316,10 +280,6 @@ ConvertToNSArray(nsTArray& aArray) return [NSArray array]; static NSArray* generalAttributes = nil; - static NSArray* tableAttrs = nil; - static NSArray* tableRowAttrs = nil; - static NSArray* tableCellAttrs = nil; - NSMutableArray* tempArray = nil; if (!generalAttributes) { // standard attributes that are shared and supported by all generic elements. @@ -344,41 +304,8 @@ ConvertToNSArray(nsTArray& aArray) nil]; } - if (!tableAttrs) { - tempArray = [[NSMutableArray alloc] initWithArray:generalAttributes]; - [tempArray addObject:NSAccessibilityRowCountAttribute]; - [tempArray addObject:NSAccessibilityColumnCountAttribute]; - [tempArray addObject:NSAccessibilityRowsAttribute]; - tableAttrs = [[NSArray alloc] initWithArray:tempArray]; - [tempArray release]; - } - if (!tableRowAttrs) { - tempArray = [[NSMutableArray alloc] initWithArray:generalAttributes]; - [tempArray addObject:NSAccessibilityIndexAttribute]; - tableRowAttrs = [[NSArray alloc] initWithArray:tempArray]; - [tempArray release]; - } - if (!tableCellAttrs) { - tempArray = [[NSMutableArray alloc] initWithArray:generalAttributes]; - [tempArray addObject:NSAccessibilityRowIndexRangeAttribute]; - [tempArray addObject:NSAccessibilityColumnIndexRangeAttribute]; - [tempArray addObject:NSAccessibilityRowHeaderUIElementsAttribute]; - [tempArray addObject:NSAccessibilityColumnHeaderUIElementsAttribute]; - tableCellAttrs = [[NSArray alloc] initWithArray:tempArray]; - [tempArray release]; - } - NSArray* objectAttributes = generalAttributes; - if (![self isLayoutTablePart]) { - if ((accWrap && accWrap->IsTable()) || (proxy && proxy->IsTable())) - objectAttributes = tableAttrs; - else if ((accWrap && accWrap->IsTableRow()) || (proxy && proxy->IsTableRow())) - objectAttributes = tableRowAttrs; - else if ((accWrap && accWrap->IsTableCell()) || (proxy && proxy->IsTableCell())) - objectAttributes = tableCellAttrs; - } - NSArray* additionalAttributes = [self additionalAccessibilityAttributeNames]; if ([additionalAttributes count]) objectAttributes = [objectAttributes arrayByAddingObjectsFromArray:additionalAttributes]; @@ -463,114 +390,6 @@ ConvertToNSArray(nsTArray& aArray) if ([attribute isEqualToString:NSAccessibilityHelpAttribute]) return [self help]; - if (accWrap) { - if (accWrap->IsTable()) { - TableAccessible* table = accWrap->AsTable(); - if ([attribute isEqualToString:NSAccessibilityRowCountAttribute]) - return @(table->RowCount()); - if ([attribute isEqualToString:NSAccessibilityColumnCountAttribute]) - return @(table->ColCount()); - if ([attribute isEqualToString:NSAccessibilityRowsAttribute]) { - // Create a new array with the list of table rows. - NSMutableArray* nativeArray = [[NSMutableArray alloc] init]; - uint32_t totalCount = accWrap->ChildCount(); - for (uint32_t i = 0; i < totalCount; i++) { - if (accWrap->GetChildAt(i)->IsTableRow()) { - mozAccessible* curNative = - GetNativeFromGeckoAccessible(accWrap->GetChildAt(i)); - if (curNative) - [nativeArray addObject:GetObjectOrRepresentedView(curNative)]; - } - } - return nativeArray; - } - } else if (accWrap->IsTableRow()) { - if ([attribute isEqualToString:NSAccessibilityIndexAttribute]) { - // Count the number of rows before that one to obtain the row index. - uint32_t index = 0; - Accessible* parent = accWrap->Parent(); - if (parent) { - for (int32_t i = accWrap->IndexInParent() - 1; i >= 0; i--) { - if (parent->GetChildAt(i)->IsTableRow()) { - index++; - } - } - } - return [NSNumber numberWithUnsignedInteger:index]; - } - } else if (accWrap->IsTableCell()) { - TableCellAccessible* cell = accWrap->AsTableCell(); - if ([attribute isEqualToString:NSAccessibilityRowIndexRangeAttribute]) - return [NSValue valueWithRange:NSMakeRange(cell->RowIdx(), - cell->RowExtent())]; - if ([attribute isEqualToString:NSAccessibilityColumnIndexRangeAttribute]) - return [NSValue valueWithRange:NSMakeRange(cell->ColIdx(), - cell->ColExtent())]; - if ([attribute isEqualToString:NSAccessibilityRowHeaderUIElementsAttribute]) { - nsAutoTArray headerCells; - cell->RowHeaderCells(&headerCells); - return ConvertToNSArray(headerCells); - } - if ([attribute isEqualToString:NSAccessibilityColumnHeaderUIElementsAttribute]) { - nsAutoTArray headerCells; - cell->ColHeaderCells(&headerCells); - return ConvertToNSArray(headerCells); - } - } - } else if (proxy) { - if (proxy->IsTable()) { - if ([attribute isEqualToString:NSAccessibilityRowCountAttribute]) - return @(proxy->TableRowCount()); - if ([attribute isEqualToString:NSAccessibilityColumnCountAttribute]) - return @(proxy->TableColumnCount()); - if ([attribute isEqualToString:NSAccessibilityRowsAttribute]) { - // Create a new array with the list of table rows. - NSMutableArray* nativeArray = [[NSMutableArray alloc] init]; - uint32_t totalCount = proxy->ChildrenCount(); - for (uint32_t i = 0; i < totalCount; i++) { - if (proxy->ChildAt(i)->IsTableRow()) { - mozAccessible* curNative = - GetNativeFromProxy(proxy->ChildAt(i)); - if (curNative) - [nativeArray addObject:GetObjectOrRepresentedView(curNative)]; - } - } - return nativeArray; - } - } else if (proxy->IsTableRow()) { - if ([attribute isEqualToString:NSAccessibilityIndexAttribute]) { - // Count the number of rows before that one to obtain the row index. - uint32_t index = 0; - ProxyAccessible* parent = proxy->Parent(); - if (parent) { - for (int32_t i = proxy->IndexInParent() - 1; i >= 0; i--) { - if (parent->ChildAt(i)->IsTableRow()) { - index++; - } - } - } - return [NSNumber numberWithUnsignedInteger:index]; - } - } else if (proxy->IsTableCell()) { - if ([attribute isEqualToString:NSAccessibilityRowIndexRangeAttribute]) - return [NSValue valueWithRange:NSMakeRange(proxy->RowIdx(), - proxy->RowExtent())]; - if ([attribute isEqualToString:NSAccessibilityColumnIndexRangeAttribute]) - return [NSValue valueWithRange:NSMakeRange(proxy->ColIdx(), - proxy->ColExtent())]; - if ([attribute isEqualToString:NSAccessibilityRowHeaderUIElementsAttribute]) { - nsTArray headerCells; - proxy->RowHeaderCells(&headerCells); - return ConvertToNSArray(headerCells); - } - if ([attribute isEqualToString:NSAccessibilityColumnHeaderUIElementsAttribute]) { - nsTArray headerCells; - proxy->ColHeaderCells(&headerCells); - return ConvertToNSArray(headerCells); - } - } - } - switch (mRole) { case roles::MATHML_ROOT: if ([attribute isEqualToString:NSAccessibilityMathRootRadicandAttribute]) @@ -942,10 +761,6 @@ ConvertToNSArray(nsTArray& aArray) return nil; } - if ([self isLayoutTablePart]) { - return NSAccessibilityGroupRole; - } - #define ROLE(geckoRole, stringRole, atkRole, macRole, msaaRole, ia2Role, nameRule) \ case roles::geckoRole: \ return macRole; diff --git a/accessible/mac/mozTableAccessible.h b/accessible/mac/mozTableAccessible.h new file mode 100644 index 00000000000..435b5adc579 --- /dev/null +++ b/accessible/mac/mozTableAccessible.h @@ -0,0 +1,28 @@ +/* -*- Mode: Objective-C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:expandtab:shiftwidth=2:tabstop=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/. */ + +#import "mozAccessible.h" + +@interface mozTablePartAccessible : mozAccessible +- (BOOL)isLayoutTablePart; +- (NSString*)role; +@end + +@interface mozTableAccessible : mozTablePartAccessible +- (NSArray*)additionalAccessibilityAttributeNames; +- (id)accessibilityAttributeValue:(NSString*)attribute; +@end + +@interface mozTableRowAccessible : mozTablePartAccessible +- (NSArray*)additionalAccessibilityAttributeNames; +- (id)accessibilityAttributeValue:(NSString*)attribute; +@end + +@interface mozTableCellAccessible : mozTablePartAccessible +- (NSArray*)additionalAccessibilityAttributeNames; +- (id)accessibilityAttributeValue:(NSString*)attribute; +@end diff --git a/accessible/mac/mozTableAccessible.mm b/accessible/mac/mozTableAccessible.mm new file mode 100644 index 00000000000..53381cd2cad --- /dev/null +++ b/accessible/mac/mozTableAccessible.mm @@ -0,0 +1,240 @@ +/* -*- Mode: Objective-C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:expandtab:shiftwidth=2:tabstop=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/. */ + +#import "mozTableAccessible.h" +#import "nsCocoaUtils.h" + +@implementation mozTablePartAccessible +- (BOOL)isLayoutTablePart; +{ + if (Accessible* accWrap = [self getGeckoAccessible]) { + while (accWrap) { + if (accWrap->IsTable()) { + return accWrap->AsTable()->IsProbablyLayoutTable(); + } + accWrap = accWrap->Parent(); + } + return false; + } + + if (ProxyAccessible* proxy = [self getProxyAccessible]) { + while (proxy) { + if (proxy->IsTable()) { + return proxy->TableIsProbablyForLayout(); + } + proxy = proxy->Parent(); + } + } + + return false; +} + +- (NSString*)role +{ + return [self isLayoutTablePart] ? NSAccessibilityGroupRole : [super role]; +} +@end + +@implementation mozTableAccessible +- (NSArray*)additionalAccessibilityAttributeNames +{ + NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL; + + NSArray* additionalAttributes = [super additionalAccessibilityAttributeNames]; + if ([self isLayoutTablePart]) { + return additionalAttributes; + } + + static NSArray* tableAttrs = nil; + if (!tableAttrs) { + NSMutableArray* tempArray = [NSMutableArray new]; + [tempArray addObject:NSAccessibilityRowCountAttribute]; + [tempArray addObject:NSAccessibilityColumnCountAttribute]; + [tempArray addObject:NSAccessibilityRowsAttribute]; + tableAttrs = [[NSArray alloc] initWithArray:tempArray]; + [tempArray release]; + } + + return [additionalAttributes arrayByAddingObjectsFromArray:tableAttrs]; + + NS_OBJC_END_TRY_ABORT_BLOCK_NIL; +} + +- (id)accessibilityAttributeValue:(NSString*)attribute +{ + if (AccessibleWrap* accWrap = [self getGeckoAccessible]) { + TableAccessible* table = accWrap->AsTable(); + if ([attribute isEqualToString:NSAccessibilityRowCountAttribute]) + return @(table->RowCount()); + if ([attribute isEqualToString:NSAccessibilityColumnCountAttribute]) + return @(table->ColCount()); + if ([attribute isEqualToString:NSAccessibilityRowsAttribute]) { + // Create a new array with the list of table rows. + NSMutableArray* nativeArray = [[NSMutableArray alloc] init]; + uint32_t totalCount = accWrap->ChildCount(); + for (uint32_t i = 0; i < totalCount; i++) { + if (accWrap->GetChildAt(i)->IsTableRow()) { + mozAccessible* curNative = + GetNativeFromGeckoAccessible(accWrap->GetChildAt(i)); + if (curNative) + [nativeArray addObject:GetObjectOrRepresentedView(curNative)]; + } + } + return nativeArray; + } + } else if (ProxyAccessible* proxy = [self getProxyAccessible]) { + if ([attribute isEqualToString:NSAccessibilityRowCountAttribute]) + return @(proxy->TableRowCount()); + if ([attribute isEqualToString:NSAccessibilityColumnCountAttribute]) + return @(proxy->TableColumnCount()); + if ([attribute isEqualToString:NSAccessibilityRowsAttribute]) { + // Create a new array with the list of table rows. + NSMutableArray* nativeArray = [[NSMutableArray alloc] init]; + uint32_t totalCount = proxy->ChildrenCount(); + for (uint32_t i = 0; i < totalCount; i++) { + if (proxy->ChildAt(i)->IsTableRow()) { + mozAccessible* curNative = + GetNativeFromProxy(proxy->ChildAt(i)); + if (curNative) + [nativeArray addObject:GetObjectOrRepresentedView(curNative)]; + } + } + return nativeArray; + } + } + + return [super accessibilityAttributeValue:attribute]; +} +@end + +@implementation mozTableRowAccessible +- (NSArray*)additionalAccessibilityAttributeNames +{ + NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL; + + NSArray* additionalAttributes = [super additionalAccessibilityAttributeNames]; + if ([self isLayoutTablePart]) { + return additionalAttributes; + } + + static NSArray* tableRowAttrs = nil; + if (!tableRowAttrs) { + NSMutableArray* tempArray = [NSMutableArray new]; + [tempArray addObject:NSAccessibilityIndexAttribute]; + tableRowAttrs = [[NSArray alloc] initWithArray:tempArray]; + [tempArray release]; + } + + return [additionalAttributes arrayByAddingObjectsFromArray:tableRowAttrs]; + + NS_OBJC_END_TRY_ABORT_BLOCK_NIL; +} + +- (id)accessibilityAttributeValue:(NSString*)attribute +{ + if (AccessibleWrap* accWrap = [self getGeckoAccessible]) { + if ([attribute isEqualToString:NSAccessibilityIndexAttribute]) { + // Count the number of rows before that one to obtain the row index. + uint32_t index = 0; + Accessible* parent = accWrap->Parent(); + if (parent) { + for (int32_t i = accWrap->IndexInParent() - 1; i >= 0; i--) { + if (parent->GetChildAt(i)->IsTableRow()) { + index++; + } + } + } + return [NSNumber numberWithUnsignedInteger:index]; + } + } else if (ProxyAccessible* proxy = [self getProxyAccessible]) { + if ([attribute isEqualToString:NSAccessibilityIndexAttribute]) { + // Count the number of rows before that one to obtain the row index. + uint32_t index = 0; + ProxyAccessible* parent = proxy->Parent(); + if (parent) { + for (int32_t i = proxy->IndexInParent() - 1; i >= 0; i--) { + if (parent->ChildAt(i)->IsTableRow()) { + index++; + } + } + } + return [NSNumber numberWithUnsignedInteger:index]; + } + } + + return [super accessibilityAttributeValue:attribute]; +} +@end + +@implementation mozTableCellAccessible +- (NSArray*)additionalAccessibilityAttributeNames +{ + NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL; + + NSArray* additionalAttributes = [super additionalAccessibilityAttributeNames]; + if ([self isLayoutTablePart]) { + return additionalAttributes; + } + + static NSArray* tableCellAttrs = nil; + if (!tableCellAttrs) { + NSMutableArray* tempArray = [NSMutableArray new]; + [tempArray addObject:NSAccessibilityRowIndexRangeAttribute]; + [tempArray addObject:NSAccessibilityColumnIndexRangeAttribute]; + [tempArray addObject:NSAccessibilityRowHeaderUIElementsAttribute]; + [tempArray addObject:NSAccessibilityColumnHeaderUIElementsAttribute]; + tableCellAttrs = [[NSArray alloc] initWithArray:tempArray]; + [tempArray release]; + } + + return [additionalAttributes arrayByAddingObjectsFromArray:tableCellAttrs]; + + NS_OBJC_END_TRY_ABORT_BLOCK_NIL; +} + +- (id)accessibilityAttributeValue:(NSString*)attribute +{ + if (AccessibleWrap* accWrap = [self getGeckoAccessible]) { + TableCellAccessible* cell = accWrap->AsTableCell(); + if ([attribute isEqualToString:NSAccessibilityRowIndexRangeAttribute]) + return [NSValue valueWithRange:NSMakeRange(cell->RowIdx(), + cell->RowExtent())]; + if ([attribute isEqualToString:NSAccessibilityColumnIndexRangeAttribute]) + return [NSValue valueWithRange:NSMakeRange(cell->ColIdx(), + cell->ColExtent())]; + if ([attribute isEqualToString:NSAccessibilityRowHeaderUIElementsAttribute]) { + nsAutoTArray headerCells; + cell->RowHeaderCells(&headerCells); + return ConvertToNSArray(headerCells); + } + if ([attribute isEqualToString:NSAccessibilityColumnHeaderUIElementsAttribute]) { + nsAutoTArray headerCells; + cell->ColHeaderCells(&headerCells); + return ConvertToNSArray(headerCells); + } + } else if (ProxyAccessible* proxy = [self getProxyAccessible]) { + if ([attribute isEqualToString:NSAccessibilityRowIndexRangeAttribute]) + return [NSValue valueWithRange:NSMakeRange(proxy->RowIdx(), + proxy->RowExtent())]; + if ([attribute isEqualToString:NSAccessibilityColumnIndexRangeAttribute]) + return [NSValue valueWithRange:NSMakeRange(proxy->ColIdx(), + proxy->ColExtent())]; + if ([attribute isEqualToString:NSAccessibilityRowHeaderUIElementsAttribute]) { + nsTArray headerCells; + proxy->RowHeaderCells(&headerCells); + return ConvertToNSArray(headerCells); + } + if ([attribute isEqualToString:NSAccessibilityColumnHeaderUIElementsAttribute]) { + nsTArray headerCells; + proxy->ColHeaderCells(&headerCells); + return ConvertToNSArray(headerCells); + } + } + + return [super accessibilityAttributeValue:attribute]; +} +@end