From 998c5beee8487cb758cb1ff800f95d9ac941675c Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 6 Oct 2020 15:56:28 -0700 Subject: [PATCH 1/3] Revert "fix On iOS, dialog titles are announced twice (#19826)" This reverts commit 48a6fde39f9fe8bf7ad06f0f8cf690186d930b73. --- .../darwin/ios/framework/Source/SemanticsObject.h | 2 +- .../ios/framework/Source/SemanticsObject.mm | 15 +++++++-------- .../ios/framework/Source/accessibility_bridge.mm | 8 +++----- .../framework/Source/accessibility_bridge_test.mm | 4 +--- 4 files changed, 12 insertions(+), 17 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/SemanticsObject.h b/shell/platform/darwin/ios/framework/Source/SemanticsObject.h index dded845d70137..8df516483f270 100644 --- a/shell/platform/darwin/ios/framework/Source/SemanticsObject.h +++ b/shell/platform/darwin/ios/framework/Source/SemanticsObject.h @@ -93,7 +93,7 @@ constexpr int32_t kRootNodeId = 0; - (BOOL)nodeWillCauseScroll:(const flutter::SemanticsNode*)node; - (BOOL)nodeShouldTriggerAnnouncement:(const flutter::SemanticsNode*)node; - (void)collectRoutes:(NSMutableArray*)edges; -- (SemanticsObject*)routeFocusObject; +- (NSString*)routeName; - (BOOL)onCustomAccessibilityAction:(FlutterCustomAccessibilityAction*)action; @end diff --git a/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm b/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm index 546e9c5c2c727..d41f0a40aee6f 100644 --- a/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm +++ b/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm @@ -282,21 +282,20 @@ - (BOOL)onCustomAccessibilityAction:(FlutterCustomAccessibilityAction*)action { return YES; } -- (SemanticsObject*)routeFocusObject { - // Returns the first SemanticObject in this branch that has - // the NamesRoute flag with a non-nil semantic label. Otherwise - // returns nil. +- (NSString*)routeName { + // Returns the first non-null and non-empty semantic label of a child + // with an NamesRoute flag. Otherwise returns nil. if ([self node].HasFlag(flutter::SemanticsFlags::kNamesRoute)) { NSString* newName = [self accessibilityLabel]; if (newName != nil && [newName length] > 0) { - return self; + return newName; } } if ([self hasChildren]) { for (SemanticsObject* child in self.children) { - SemanticsObject* focusObject = [child routeFocusObject]; - if (focusObject != nil) { - return focusObject; + NSString* newName = [child routeName]; + if (newName != nil && [newName length] > 0) { + return newName; } } } diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm index bad9aca0f1e29..34971fbdffcfb 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm @@ -197,13 +197,11 @@ void PostAccessibilityNotification(UIAccessibilityNotifications notification, layoutChanged = layoutChanged || [doomed_uids count] > 0; // We should send out only one notification per semantics update. if (routeChanged) { + if (!ios_delegate_->IsFlutterViewControllerPresentingModalViewController(view_controller_)) { - SemanticsObject* nextToFocus = [lastAdded routeFocusObject]; - if (!nextToFocus && root) { - nextToFocus = FindFirstFocusable(root); - } + NSString* routeName = [lastAdded routeName]; ios_delegate_->PostAccessibilityNotification(UIAccessibilityScreenChangedNotification, - nextToFocus); + routeName); } } else if (layoutChanged) { SemanticsObject* nextToFocus = nil; diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm b/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm index 7f73bc0a5cf22..5fe28b5be320b 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm @@ -328,9 +328,7 @@ - (void)testAnnouncesRouteChanges { bridge->UpdateSemantics(/*nodes=*/nodes, /*actions=*/actions); XCTAssertEqual([accessibility_notifications count], 1ul); - SemanticsObject* focusObject = accessibility_notifications[0][@"argument"]; - XCTAssertEqual([focusObject uid], 3); - XCTAssertEqualObjects([focusObject accessibilityLabel], @"node3"); + XCTAssertEqualObjects(accessibility_notifications[0][@"argument"], @"route"); XCTAssertEqual([accessibility_notifications[0][@"notification"] unsignedIntValue], UIAccessibilityScreenChangedNotification); } From 0076f4d1db5ac01d74e8fd0eeb4176ffcb683d76 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Thu, 8 Oct 2020 16:11:03 -0700 Subject: [PATCH 2/3] reformat --- .../platform/darwin/ios/framework/Source/accessibility_bridge.mm | 1 - 1 file changed, 1 deletion(-) diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm index 34971fbdffcfb..33ea01d1881fa 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm @@ -197,7 +197,6 @@ void PostAccessibilityNotification(UIAccessibilityNotifications notification, layoutChanged = layoutChanged || [doomed_uids count] > 0; // We should send out only one notification per semantics update. if (routeChanged) { - if (!ios_delegate_->IsFlutterViewControllerPresentingModalViewController(view_controller_)) { NSString* routeName = [lastAdded routeName]; ios_delegate_->PostAccessibilityNotification(UIAccessibilityScreenChangedNotification, From 8f2ccd24a0c6902231469c6d97eb8ad15ce3682a Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Fri, 9 Oct 2020 16:56:54 -0700 Subject: [PATCH 3/3] fixed some tests --- .../ios/framework/Source/accessibility_bridge_test.mm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm b/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm index 5fe28b5be320b..41970e67c8f73 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm @@ -328,7 +328,7 @@ - (void)testAnnouncesRouteChanges { bridge->UpdateSemantics(/*nodes=*/nodes, /*actions=*/actions); XCTAssertEqual([accessibility_notifications count], 1ul); - XCTAssertEqualObjects(accessibility_notifications[0][@"argument"], @"route"); + XCTAssertEqualObjects(accessibility_notifications[0][@"argument"], @"node3"); XCTAssertEqual([accessibility_notifications[0][@"notification"] unsignedIntValue], UIAccessibilityScreenChangedNotification); } @@ -371,7 +371,8 @@ - (void)testAnnouncesRouteChangesWhenNoNamesRoute { flutter::SemanticsNode node1; node1.id = 1; node1.label = "node1"; - node1.flags = static_cast(flutter::SemanticsFlags::kScopesRoute); + node1.flags = static_cast(flutter::SemanticsFlags::kScopesRoute) | + static_cast(flutter::SemanticsFlags::kNamesRoute); node1.childrenInTraversalOrder = {2, 3}; node1.childrenInHitTestOrder = {2, 3}; nodes[node1.id] = node1; @@ -392,9 +393,9 @@ - (void)testAnnouncesRouteChangesWhenNoNamesRoute { // Notification should focus first focusable node, which is node1. XCTAssertEqual([accessibility_notifications count], 1ul); - SemanticsObject* focusObject = accessibility_notifications[0][@"argument"]; - XCTAssertEqual([focusObject uid], 2); - XCTAssertEqualObjects([focusObject accessibilityLabel], @"node2"); + id focusObject = accessibility_notifications[0][@"argument"]; + XCTAssertTrue([focusObject isKindOfClass:[NSString class]]); + XCTAssertEqualObjects(focusObject, @"node1"); XCTAssertEqual([accessibility_notifications[0][@"notification"] unsignedIntValue], UIAccessibilityScreenChangedNotification); }