-
Notifications
You must be signed in to change notification settings - Fork 6k
Add a11y support for embedded iOS platform view #8156
Changes from 4 commits
3bcb1db
8fcf6b0
c036e80
05f77a3
b776a05
8ed39ee
a9a0c15
0e58ef8
4e670db
15c03ce
6fb37fe
3e57265
4a06b68
4ea581f
68251d8
c540565
4a29306
fb72727
5ff2ddc
fae2cc0
0d3bb16
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -113,7 +113,9 @@ class PlatformViewIOS; | |
|
|
||
| class AccessibilityBridge final { | ||
| public: | ||
| AccessibilityBridge(UIView* view, PlatformViewIOS* platform_view); | ||
| AccessibilityBridge(UIView* view, | ||
| PlatformViewIOS* platform_view, | ||
| FlutterPlatformViewsController* platform_views_controller); | ||
| ~AccessibilityBridge(); | ||
|
|
||
| void UpdateSemantics(blink::SemanticsNodeUpdates nodes, | ||
|
|
@@ -129,6 +131,10 @@ class AccessibilityBridge final { | |
|
|
||
| fml::WeakPtr<AccessibilityBridge> GetWeakPtr(); | ||
|
|
||
| FlutterPlatformViewsController* flutter_platform_views_controller() const { | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ...
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
| return flutter_platform_views_controller_; | ||
| }; | ||
|
|
||
| void clearState(); | ||
|
|
||
| private: | ||
|
|
@@ -139,6 +145,7 @@ class AccessibilityBridge final { | |
|
|
||
| UIView* view_; | ||
| PlatformViewIOS* platform_view_; | ||
| FlutterPlatformViewsController* flutter_platform_views_controller_; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
| fml::scoped_nsobject<NSMutableDictionary<NSNumber*, SemanticsObject*>> objects_; | ||
| fml::scoped_nsprotocol<FlutterBasicMessageChannel*> accessibility_channel_; | ||
| fml::WeakPtrFactory<AccessibilityBridge> weak_factory_; | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -11,6 +11,7 @@ | |
| #import <UIKit/UIKit.h> | ||
|
|
||
| #include "flutter/fml/logging.h" | ||
| #include "flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h" | ||
| #include "flutter/shell/platform/darwin/ios/platform_view_ios.h" | ||
|
|
||
| namespace { | ||
|
|
@@ -165,6 +166,10 @@ - (BOOL)isAccessibilityElement { | |
| // We enforce in the framework that no other useful semantics are merged with these nodes. | ||
| if ([self node].HasFlag(blink::SemanticsFlags::kScopesRoute)) | ||
| return false; | ||
| // If the node is the placeholder for a platform view. We know it should be a container. | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Are you adding the asserts for this in the framework? I would probably remove the comment and just add this case to this if above. It's just anther node that doesn't get semantics merged in. |
||
| if ([self node].platformViewId > -1) { | ||
| return false; | ||
| } | ||
| return ([self node].flags != 0 && | ||
| [self node].flags != static_cast<int32_t>(blink::SemanticsFlags::kIsHidden)) || | ||
| ![self node].label.empty() || ![self node].value.empty() || ![self node].hint.empty() || | ||
|
|
@@ -436,6 +441,20 @@ - (nullable id)accessibilityElementAtIndex:(NSInteger)index { | |
| return _semanticsObject; | ||
| } | ||
| SemanticsObject* child = [_semanticsObject children][index - 1]; | ||
|
|
||
| // This 'if' block handles adding accessibility support for the embedded platform view. | ||
| // We first check if the child is a semantic node for a platform view. | ||
| // If so, we add the platform view as accessibilityElements of the child. | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid documenting the how, and instead focus on the what/why. Maybe something like:
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
| shell::FlutterPlatformViewsController* flutterPlatformViewsController = | ||
| _bridge.get()->flutter_platform_views_controller(); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit: consider naming it
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
| if (child.node.platformViewId > -1 && flutterPlatformViewsController) { | ||
|
goderbauer marked this conversation as resolved.
Outdated
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Similar comment here, replace -1 with a named constexpr.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
| NSObject<FlutterPlatformView>* platformViewProtocolObject = | ||
| flutterPlatformViewsController->GetPlatformViewByID(child.node.platformViewId); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is there a shorter name? |
||
| UIView* platformView = [platformViewProtocolObject view]; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is it safe to assume
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good catch! Done. |
||
| child.accessibilityElements = @[ platformView ]; | ||
| return child; | ||
| } | ||
|
|
||
| if ([child hasChildren]) | ||
| return [child accessibilityContainer]; | ||
| return child; | ||
|
|
@@ -485,9 +504,12 @@ - (BOOL)accessibilityScroll:(UIAccessibilityScrollDirection)direction { | |
|
|
||
| namespace shell { | ||
|
|
||
| AccessibilityBridge::AccessibilityBridge(UIView* view, PlatformViewIOS* platform_view) | ||
| AccessibilityBridge::AccessibilityBridge(UIView* view, | ||
| PlatformViewIOS* platform_view, | ||
| FlutterPlatformViewsController* platform_views_controller) | ||
| : view_(view), | ||
| platform_view_(platform_view), | ||
| flutter_platform_views_controller_(platform_views_controller), | ||
| objects_([[NSMutableDictionary alloc] init]), | ||
| weak_factory_(this), | ||
| previous_route_id_(0), | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.