Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(364)

Unified Diff: ui/accessibility/platform/ax_platform_node_mac.mm

Issue 2944103005: Fix lifetime problems in AXPlatformNodeCocoa. (Closed)
Patch Set: rebase Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/accessibility/platform/ax_platform_node_mac.mm
diff --git a/ui/accessibility/platform/ax_platform_node_mac.mm b/ui/accessibility/platform/ax_platform_node_mac.mm
index 2eb4dba0a3ac50dff8940613b19157feedcb0654..68a35f8955dd3bc1a02a0df6d88130b58b66a384 100644
--- a/ui/accessibility/platform/ax_platform_node_mac.mm
+++ b/ui/accessibility/platform/ax_platform_node_mac.mm
@@ -311,6 +311,9 @@ bool AlsoUseShowMenuActionForDefaultAction(const ui::AXNodeData& data) {
// NSAccessibility informal protocol implementation.
- (BOOL)accessibilityIsIgnored {
+ if (!node_)
+ return YES;
+
return [[self AXRole] isEqualToString:NSAccessibilityUnknownRole] ||
node_->GetData().HasState(ui::AX_STATE_INVISIBLE);
}
@@ -330,10 +333,13 @@ bool AlsoUseShowMenuActionForDefaultAction(const ui::AXNodeData& data) {
}
- (id)accessibilityFocusedUIElement {
- return node_->GetDelegate()->GetFocus();
+ return node_ ? node_->GetDelegate()->GetFocus() : nil;
}
- (NSArray*)accessibilityActionNames {
+ if (!node_)
+ return @[];
+
base::scoped_nsobject<NSMutableArray> axActions(
[[NSMutableArray alloc] init]);
@@ -355,7 +361,11 @@ bool AlsoUseShowMenuActionForDefaultAction(const ui::AXNodeData& data) {
}
- (void)accessibilityPerformAction:(NSString*)action {
- DCHECK([[self accessibilityActionNames] containsObject:action]);
+ // Actions are performed asynchronously, so it's always possible for an object
+ // to change its mind after previously reporting an action as available.
+ if (![[self accessibilityActionNames] containsObject:action])
+ return;
+
ui::AXActionData data;
if ([action isEqualToString:NSAccessibilityShowMenuAction] &&
AlsoUseShowMenuActionForDefaultAction(node_->GetData())) {
@@ -378,6 +388,9 @@ bool AlsoUseShowMenuActionForDefaultAction(const ui::AXNodeData& data) {
}
- (NSArray*)accessibilityAttributeNames {
+ if (!node_)
+ return @[];
+
// These attributes are required on all accessibility objects.
NSArray* const kAllRoleAttributes = @[
NSAccessibilityChildrenAttribute,
@@ -472,6 +485,9 @@ bool AlsoUseShowMenuActionForDefaultAction(const ui::AXNodeData& data) {
}
- (BOOL)accessibilityIsAttributeSettable:(NSString*)attributeName {
+ if (!node_)
+ return NO;
+
if (node_->GetData().HasState(ui::AX_STATE_DISABLED))
return NO;
@@ -509,6 +525,9 @@ bool AlsoUseShowMenuActionForDefaultAction(const ui::AXNodeData& data) {
}
- (void)accessibilitySetValue:(id)value forAttribute:(NSString*)attribute {
+ if (!node_)
+ return;
+
ui::AXActionData data;
// Check for attributes first. Only the |data.action| should be set here - any
@@ -547,6 +566,9 @@ bool AlsoUseShowMenuActionForDefaultAction(const ui::AXNodeData& data) {
}
- (id)accessibilityAttributeValue:(NSString*)attribute {
+ if (!node_)
+ return nil; // Return nil when detached. Even for AXRole.
+
SEL selector = NSSelectorFromString(attribute);
if ([self respondsToSelector:selector])
return [self performSelector:selector];
@@ -567,6 +589,7 @@ bool AlsoUseShowMenuActionForDefaultAction(const ui::AXNodeData& data) {
- (NSString*)AXRole {
if (!node_)
return nil;
+
return [[self class] nativeRoleFromAXRole:node_->GetData().role];
}
@@ -634,7 +657,8 @@ bool AlsoUseShowMenuActionForDefaultAction(const ui::AXNodeData& data) {
- (NSArray*)AXChildren {
if (!node_)
- return nil;
+ return @[];
+
int count = node_->GetChildCount();
NSMutableArray* children = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count; ++i)

Powered by Google App Engine
This is Rietveld 408576698