-
Notifications
You must be signed in to change notification settings - Fork 6k
[web] always add secondary role managers #43663
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't have strong opinions on this, but the determination of what secondary role factories are needed is a little bit itchy :/
// A role manager should only be added once. So remove any factories that | ||
// contributed a role manager. | ||
_secondaryRoleManagers?.forEach((RoleManager roleManager) { | ||
secondaryRoleFactories.remove(roleManager.role); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this because this update can be called multiple times? Does every update restore the roleFactories for this role manager? Is the role manager disposable?
secondaryRoleFactories.forEach((Role role, RoleManagerFactory roleFactory) { | ||
final RoleManager? secondaryRoleManager = roleFactory(semanticsObject); | ||
if (secondaryRoleManager != null) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This for loop looks a little bit weird to me. Wouldn't it be better that this knows what availableSecondaryRoles
can be used, and the semanticsObject
knows what configuredSecondaryRoles
it has?
That way instead of this loop checking on every roleFactory if it can support the semanticsObject, an intersection would narrow down the actually needed Roles (which could have the roleFactory associated to the Role an immutable const Map<Role, RoleManagerFactory>
, or whatever?)
addSecondaryRole(Role.focusable, (SemanticsObject semanticsObject) { | ||
if (semanticsObject.isFocusable) { | ||
return Focusable(semanticsObject); | ||
} | ||
return null; | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like these factories are always the same and have no dependency on the PrimaryRoleManager
instance. Can we put them in a global map:
final Map<Role, RoleManagerFactory> secondaryRoleFactories = <Role, RoleManagerFactory> {
Role.focusable: (SemanticsObject obj) => obj.isFocusable ? Focusable(obj) : null,
...
};
or combine them in a switch expression somewhere (I prefer this to make sure we exhaust all cases for Role
):
extension RoleFactoryExtension on Role {
RoleManager? createManager() {
return switch (this) {
Role.focusable => this.isFocusable ? Focusable(this) : null,
...
}
}
}
And the primary role manager only maintains a List<Role>
and uses it during update()
to decide what secondary role managers to create.
final Map<Role, RoleManagerFactory>? secondaryRoleFactories = _secondaryRoleFactories; | ||
if (secondaryRoleFactories != null && secondaryRoleFactories.isNotEmpty) { | ||
secondaryRoleFactories.forEach((Role role, RoleManagerFactory roleFactory) { | ||
final RoleManager? secondaryRoleManager = roleFactory(semanticsObject); | ||
if (secondaryRoleManager != null) { | ||
_secondaryRoleManagers ??= <RoleManager>[]; | ||
_secondaryRoleManagers!.add(secondaryRoleManager); | ||
} | ||
}); | ||
|
||
// A role manager should only be added once. So remove any factories that | ||
// contributed a role manager. | ||
_secondaryRoleManagers?.forEach((RoleManager roleManager) { | ||
secondaryRoleFactories.remove(roleManager.role); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To clarify my suggestion above, here's how I'm imagining this method to look like:
final List<Role> secondaryRoles = _secondaryRoles;
for (Role role in secondaryRoles) {
final RoleManager? secondaryRoleManager = role.createManager();
if (secondaryRoleManager != null) {
_secondaryRoleManagers ??= <RoleManager>[];
_secondaryRoleManagers!.add(secondaryRoleManager);
_secondaryRoles.remove(role); // Is this allowed inside the for loop?
}
}
Updated the design based on comments and discussion. We now always add secondary role managers, and have them figure out in their |
PTAL. |
dca11b4
to
0d0ecc6
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I like this better now, with the relevant logic in the subclasses!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
} | ||
_focusManager.changeFocus(semanticsObject.hasFocus && (!semanticsObject.hasEnabledState || semanticsObject.isEnabled)); | ||
} else { | ||
_focusManager.stopManaging(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need to changeFocus(false)
when the node becomes unfocusable?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good point. I also noticed that I unconditionally start managing the node in the constructor. Fixing.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
…130646) flutter/engine@bf6d4bf...85af5ce 2023-07-14 [email protected] [web] always add secondary role managers (flutter/engine#43663) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…sions) (#130666) Manual roll requested by [email protected] flutter/engine@403866d...6830877 2023-07-15 [email protected] Roll Fuchsia Linux SDK from DEENqWMCYI1SMYsYH... to rmzZN2ZAgpbjAFi5_... (flutter/engine#43722) 2023-07-15 [email protected] Revert "Reland "add non-rendering operation culling to DisplayListBuilder" (#41463)" (flutter/engine#43721) 2023-07-15 [email protected] Roll Clang from 6d667d4b261e to ebd0b8a0472b (flutter/engine#43673) 2023-07-15 [email protected] Roll Dart SDK from 671bbdf6c542 to 0bd185c282d2 (1 revision) (flutter/engine#43719) 2023-07-15 [email protected] Optimizing performance by avoiding multiple GC operations caused by multiple surface destruction notifications (flutter/engine#43587) 2023-07-15 [email protected] Roll Skia from 975eb1250431 to 6fb535aede4e (1 revision) (flutter/engine#43716) 2023-07-15 [email protected] Roll Dart SDK from d1fcadf22aad to 671bbdf6c542 (2 revisions) (flutter/engine#43715) 2023-07-15 [email protected] Roll Fuchsia Mac SDK from Z-1lzZAOYHvVrdjQ8... to oeYLDNShuD-FTgGwU... (flutter/engine#43714) 2023-07-15 [email protected] Roll Skia from 271b2b6d5aaa to 975eb1250431 (2 revisions) (flutter/engine#43712) 2023-07-15 [email protected] Move ViewConfiguration ownership to FlutterView (flutter/engine#43701) 2023-07-14 [email protected] [web] always add secondary role managers (flutter/engine#43663) 2023-07-14 [email protected] [Impeller] Fix text scaling issues again, this time with perspective when a save layer is involved (flutter/engine#43695) 2023-07-14 [email protected] Reland "add non-rendering operation culling to DisplayListBuilder" (#41463) (flutter/engine#43698) 2023-07-14 [email protected] Roll Skia from 5f6578398870 to 271b2b6d5aaa (2 revisions) (flutter/engine#43706) 2023-07-14 [email protected] [Impeller] Ensure that missing color attachment 0u does not cause crash in embedder API (flutter/engine#43705) 2023-07-14 [email protected] Roll Skia from 315c7f08c731 to 5f6578398870 (4 revisions) (flutter/engine#43704) Also rolling transitive DEPS: fuchsia/sdk/core/linux-amd64 from DEENqWMCYI1S to rmzZN2ZAgpbj fuchsia/sdk/core/mac-amd64 from Z-1lzZAOYHvV to oeYLDNShuD-F If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
Always add secondary role managers irrespective of the initial state of the semantic node, and have role manager decide whether it applies to the node or not. Fixes flutter/flutter#130546
…lutter#130646) flutter/engine@bf6d4bf...85af5ce 2023-07-14 [email protected] [web] always add secondary role managers (flutter/engine#43663) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…sions) (flutter#130666) Manual roll requested by [email protected] flutter/engine@403866d...6830877 2023-07-15 [email protected] Roll Fuchsia Linux SDK from DEENqWMCYI1SMYsYH... to rmzZN2ZAgpbjAFi5_... (flutter/engine#43722) 2023-07-15 [email protected] Revert "Reland "add non-rendering operation culling to DisplayListBuilder" (flutter#41463)" (flutter/engine#43721) 2023-07-15 [email protected] Roll Clang from 6d667d4b261e to ebd0b8a0472b (flutter/engine#43673) 2023-07-15 [email protected] Roll Dart SDK from 671bbdf6c542 to 0bd185c282d2 (1 revision) (flutter/engine#43719) 2023-07-15 [email protected] Optimizing performance by avoiding multiple GC operations caused by multiple surface destruction notifications (flutter/engine#43587) 2023-07-15 [email protected] Roll Skia from 975eb1250431 to 6fb535aede4e (1 revision) (flutter/engine#43716) 2023-07-15 [email protected] Roll Dart SDK from d1fcadf22aad to 671bbdf6c542 (2 revisions) (flutter/engine#43715) 2023-07-15 [email protected] Roll Fuchsia Mac SDK from Z-1lzZAOYHvVrdjQ8... to oeYLDNShuD-FTgGwU... (flutter/engine#43714) 2023-07-15 [email protected] Roll Skia from 271b2b6d5aaa to 975eb1250431 (2 revisions) (flutter/engine#43712) 2023-07-15 [email protected] Move ViewConfiguration ownership to FlutterView (flutter/engine#43701) 2023-07-14 [email protected] [web] always add secondary role managers (flutter/engine#43663) 2023-07-14 [email protected] [Impeller] Fix text scaling issues again, this time with perspective when a save layer is involved (flutter/engine#43695) 2023-07-14 [email protected] Reland "add non-rendering operation culling to DisplayListBuilder" (flutter#41463) (flutter/engine#43698) 2023-07-14 [email protected] Roll Skia from 5f6578398870 to 271b2b6d5aaa (2 revisions) (flutter/engine#43706) 2023-07-14 [email protected] [Impeller] Ensure that missing color attachment 0u does not cause crash in embedder API (flutter/engine#43705) 2023-07-14 [email protected] Roll Skia from 315c7f08c731 to 5f6578398870 (4 revisions) (flutter/engine#43704) Also rolling transitive DEPS: fuchsia/sdk/core/linux-amd64 from DEENqWMCYI1S to rmzZN2ZAgpbj fuchsia/sdk/core/mac-amd64 from Z-1lzZAOYHvV to oeYLDNShuD-F If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
Always add secondary role managers irrespective of the initial state of the semantic node, and have role manager decide whether it applies to the node or not.
Fixes flutter/flutter#130546