diff --git a/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm b/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm index 134b75e40b0c631df7214b8b908648aa6d2b08c6..f5e2cc76c3dc5181b183b3d4277e609f97a270b8 100644 --- a/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm +++ b/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm @@ -66,6 +66,10 @@ flutter::SemanticsAction GetSemanticsActionForScrollDirection( [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 @@ flutter::SemanticsAction GetSemanticsActionForScrollDirection( } } +- (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 7a79ad596f62507119a1e120919144fdd9011003..04212197e4ee1877ad83af3681433555d4b9e281 100644 --- a/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm +++ b/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm @@ -229,4 +229,35 @@ class MockAccessibilityBridge : public AccessibilityBridgeIos { 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