Forward a11y methods from FlutterSwitchSemanticsObject (#25465)
diff --git a/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm b/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm
index 134b75e..f5e2cc7 100644
--- a/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm
+++ b/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm
@@ -66,6 +66,10 @@
[anInvocation invoke];
}
+// The following methods are explicitly forwarded to the wrapped SemanticsObject because the
+// forwarding logic above doesn't apply to them since they are also implemented in the UISwitch
+// class, the base class.
+
- (CGRect)accessibilityFrame {
return [_semanticsObject accessibilityFrame];
}
@@ -97,6 +101,34 @@
}
}
+- (BOOL)accessibilityActivate {
+ return [_semanticsObject accessibilityActivate];
+}
+
+- (void)accessibilityIncrement {
+ [_semanticsObject accessibilityIncrement];
+}
+
+- (void)accessibilityDecrement {
+ [_semanticsObject accessibilityDecrement];
+}
+
+- (BOOL)accessibilityScroll:(UIAccessibilityScrollDirection)direction {
+ return [_semanticsObject accessibilityScroll:direction];
+}
+
+- (BOOL)accessibilityPerformEscape {
+ return [_semanticsObject accessibilityPerformEscape];
+}
+
+- (void)accessibilityElementDidBecomeFocused {
+ [_semanticsObject accessibilityElementDidBecomeFocused];
+}
+
+- (void)accessibilityElementDidLoseFocus {
+ [_semanticsObject accessibilityElementDidLoseFocus];
+}
+
@end // FlutterSwitchSemanticsObject
@implementation FlutterCustomAccessibilityAction {
diff --git a/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm b/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm
index 7a79ad5..0421219 100644
--- a/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm
+++ b/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm
@@ -229,4 +229,35 @@
XCTAssertNil(weakObject);
}
+- (void)testFlutterSwitchSemanticsObjectForwardsCalls {
+ SemanticsObject* mockSemanticsObject = OCMClassMock([SemanticsObject class]);
+ FlutterSwitchSemanticsObject* switchObj =
+ [[FlutterSwitchSemanticsObject alloc] initWithSemanticsObject:mockSemanticsObject];
+ OCMStub([mockSemanticsObject accessibilityActivate]).andReturn(YES);
+ OCMStub([mockSemanticsObject accessibilityScroll:UIAccessibilityScrollDirectionRight])
+ .andReturn(NO);
+ OCMStub([mockSemanticsObject accessibilityPerformEscape]).andReturn(YES);
+
+ XCTAssertTrue([switchObj accessibilityActivate]);
+ OCMVerify([mockSemanticsObject accessibilityActivate]);
+
+ [switchObj accessibilityIncrement];
+ OCMVerify([mockSemanticsObject accessibilityIncrement]);
+
+ [switchObj accessibilityDecrement];
+ OCMVerify([mockSemanticsObject accessibilityDecrement]);
+
+ XCTAssertFalse([switchObj accessibilityScroll:UIAccessibilityScrollDirectionRight]);
+ OCMVerify([mockSemanticsObject accessibilityScroll:UIAccessibilityScrollDirectionRight]);
+
+ XCTAssertTrue([switchObj accessibilityPerformEscape]);
+ OCMVerify([mockSemanticsObject accessibilityPerformEscape]);
+
+ [switchObj accessibilityElementDidBecomeFocused];
+ OCMVerify([mockSemanticsObject accessibilityElementDidBecomeFocused]);
+
+ [switchObj accessibilityElementDidLoseFocus];
+ OCMVerify([mockSemanticsObject accessibilityElementDidLoseFocus]);
+}
+
@end