From 04cd0db03201c009549fc0ec8cdd3f03e4e9ee0f Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Tue, 13 Apr 2021 10:59:02 -0700 Subject: [PATCH] Forward a11y methods from FlutterSwitchSemanticsObject (#25465) --- .../ios/framework/Source/SemanticsObject.mm | 32 +++++++++++++++++++ .../framework/Source/SemanticsObjectTest.mm | 31 ++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm b/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm index 134b75e40b..f5e2cc76c3 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 7a79ad596f..04212197e4 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 -- GitLab