Skip to content

Provide test API for accessibility announcements #109661

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 17 commits into from
Oct 26, 2022

Conversation

nbayati
Copy link
Contributor

@nbayati nbayati commented Aug 17, 2022

Provide testing API for the accessibility announcements made by the Flutter framework. Currently the consumers of the code have to create a mock message handler and match the exact String value of the announcement which is a Map. So adding any new features to the announcements (like: #107568) would break the existing tests. This PR addresses the issue by providing a testing API which takes care of setting up a mock handler and returns an object for easy comparison.

Fixes #108495

Pre-launch Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I read the Tree Hygiene wiki page, which explains my responsibilities.
  • I read and followed the Flutter Style Guide, including Features we expect every widget to implement.
  • I signed the CLA.
  • I listed at least one issue that this PR fixes in the description above.
  • I updated/added relevant documentation (doc comments with ///).
  • I added new tests to check the change I am making, or this PR is test-exempt.
  • All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel on Discord.

@flutter-dashboard flutter-dashboard bot added a: tests "flutter test", flutter_test, or one of our tests framework flutter/packages/flutter repository. See also f: labels. labels Aug 17, 2022
@nbayati nbayati requested a review from yjbanov August 17, 2022 05:16
@@ -106,6 +111,14 @@ mixin TestDefaultBinaryMessengerBinding on BindingBase, ServicesBinding {
}
}

/// An accessibility announcement.
class Announcement {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's rename this to CapturedAccessibilityAnnouncement. Otherwise it sounds too much like a production class name. Also, "announcement" does not by itself imply accessibility.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only potential issue would be lines getting longer than 80 character. I could always break lines similar to what dart formatter would do though.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done!

/// Returns a list announcements made by the Flutter framework.
List<Announcement>? takeAnnouncements() {
assert(inTest);
return _announcements;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the semantics of "take" means "remove the returned value from the captured list".

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah you/re right. I've changed the code to clear out the list afterwards. I don't think we'd need a peak/get function for list. What do you think?

}

/// Returns the most recent announcement made by the Flutter framework.
Announcement? getLastAnnouncement(){
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this is meant to return the last announcement without removing it, I'd call it peekLastAnnouncement rather than get. But I think perhaps we want take here as well, no?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So take would remove the announcement from the list? In that case if the user calls takeLastAnnouncement twice, the second time what they'll get is not actually the last announcement. I'm not sure if this can cause confusion or if it's a common practice.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, good point. In that case maybe it should be called just takeAnnouncement.

Copy link
Contributor Author

@nbayati nbayati Oct 6, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I remember correctly, we decided that we don't need both takeAnnouncement and takeAnnouncements. So I just changed the name of the function to peekLastAnnouncement without changing.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Based on the other comments, I'm removing this function all together because it's easy to access the last announcement through takeAnnouncements() and we don't really need a separate function.

@@ -700,13 +727,40 @@ abstract class TestWidgetsFlutterBinding extends BindingBase
// The LiveTestWidgetsFlutterBinding overrides this to report the exception to the console.
}

Future<dynamic> _handleMessage(dynamic mockMessage) async {
final Map<dynamic, dynamic> data =
(mockMessage as Map<dynamic, dynamic>)['data'] as Map<dynamic, dynamic>;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't remember, are the keys in the map really dynamic? I recall them all being Strings.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried both
final Map<String, dynamic> data = (mockMessage as Map<dynamic, dynamic>)['data'] as Map<String, dynamic>;
and
final Map<String, dynamic> data = (mockMessage as Map<String, dynamic>)['data'] as Map<String, dynamic>;

In both cases I get a casting error:
the following _CastError was thrown running a test: type '_InternalLinkedHashMap<Object?, Object?>' is not a subtype of type 'Map<String, dynamic>' in type cast

Is there a better way to cast the mockMessage and get the values inside data?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can use .cast<K, V> to cast to a certain type https://api.flutter.dev/flutter/dart-core/Map/cast.html

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, interesting. In that case it's fine to keep it dynamic. @chunhtai's suggestion also works.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both mockMessage and mockMessage['data'] are dynamic. It seems like cast<K,V>() is defined for Map and there isn't a cast function defined on dynamic type.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nbayati you can call any method on dynamic. So you can do mockMessage.cast<String, dynamic>() and it should work as long as mockMessage actually has that method.

@nbayati nbayati requested review from chunhtai and yjbanov August 20, 2022 00:11
@@ -700,13 +727,40 @@ abstract class TestWidgetsFlutterBinding extends BindingBase
// The LiveTestWidgetsFlutterBinding overrides this to report the exception to the console.
}

Future<dynamic> _handleMessage(dynamic mockMessage) async {
final Map<dynamic, dynamic> data =
(mockMessage as Map<dynamic, dynamic>)['data'] as Map<dynamic, dynamic>;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can use .cast<K, V> to cast to a certain type https://api.flutter.dev/flutter/dart-core/Map/cast.html

expect(TextDirection.rtl, equals(third.textDirection));
expect(Assertiveness.polite, equals(third.assertiveness));

final List<CapturedAccessibilityAnnouncement>? emptyList = tester.takeAnnouncements();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call to check that the list was emptied out!

expect(emptyList, isNull);
});

test('New test API is not breaking existing tests', () async {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do plan to break existing tests in the future by always specifying assertiveness in the protocol, right? So I'm not sure if this test provides real protection 🤔

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My initial thought was to make sure that the current way of testing still works in general. Meaning that if someone wants to setup their own message handler, they're still able to do so. In another word, the new API doesn't overwrite what the user has specified as the message handler.
You had a good point about the future change though. So I've removed the announcements that didn't have assertiveness specified, since having only one would still accomplish what I had in mind.
Let me know if you still think we don't need this test.

@goderbauer
Copy link
Member

(triage): @nbayati do you still have plans to follow up on the feedback given above?

@nbayati
Copy link
Contributor Author

nbayati commented Sep 14, 2022

(triage): @nbayati do you still have plans to follow up on the feedback given above?

Yes. I have been focusing on another high priority PR, but this is still on my list and I should be able to get back to it pretty soon.

Copy link
Contributor

@mdebbar mdebbar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall, the PR looks good to me, but I'll defer to @chunhtai and @yjbanov for final approval since they are more familiar with this part of the codebase.

@nbayati nbayati marked this pull request as ready for review October 14, 2022 02:44
@nbayati nbayati requested review from yjbanov, mdebbar and goderbauer and removed request for mdebbar October 18, 2022 22:25
Copy link
Contributor

@yjbanov yjbanov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM but since this is a framework-side change that affects more than just the web, I think we should also look for an approval from either @chunhtai or @goderbauer.

///
/// This class is intended to be used by the testing API to store the announcements
/// in a structured form so that tests can verify announcement details.
/// the fields of this class correspond to parameters of the [SemanticsService.announce] method.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/the/The/

Separate paragraphs by one empty line. Or if this was meant to be a continuation of the previous paragraph, there's still space on the previous line to begin this sentence.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done!

/// The accessibility message announced by the framework.
final String message;

/// The direction in which text flows.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: I'd add "the text of the [message] flows"

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done!

@@ -700,13 +747,41 @@ abstract class TestWidgetsFlutterBinding extends BindingBase
// The LiveTestWidgetsFlutterBinding overrides this to report the exception to the console.
}

Future<void> _handleMessage(Object? mockMessage) async {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: _handleMessage sounds too generic. This is handling announcement messages specifically. Maybe call it _handleAnnouncementMessage?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done!

/// Returns a list of all the accessibility announcements made by the Flutter
/// framework since the last time this function was called.
///
/// See [TestWidgetsFlutterBinding.takeAnnouncements] for details.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the documentation can be identical, instead of pointing to another place, you can use dartdoc templates. Here's an example:

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool feature! Thanks for pointing it out.

Copy link
Contributor

@chunhtai chunhtai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM once all the comments from other reviewers are addressed

Copy link
Member

@goderbauer goderbauer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@@ -611,6 +642,24 @@ abstract class TestWidgetsFlutterBinding extends BindingBase
late StackTraceDemangler _oldStackTraceDemangler;
FlutterErrorDetails? _pendingExceptionDetails;

_MockMessageHandler? _announcementHandler;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need this variable? Could you just use _handleAnnouncementMessage directly wherever it is used?

expect(third.assertiveness, Assertiveness.polite);

final List<CapturedAccessibilityAnnouncement> emptyList = tester.takeAnnouncements();
expect(emptyList, <CapturedAccessibilityAnnouncement>[]);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: There is the isEmpty matcher, which I think would make this slightly more readable:

Suggested change
expect(emptyList, <CapturedAccessibilityAnnouncement>[]);
expect(emptyList, isEmpty);

@nbayati nbayati added the autosubmit Merge PR when tree becomes green via auto submit App label Oct 26, 2022
@auto-submit auto-submit bot merged commit 235a325 into flutter:master Oct 26, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Oct 27, 2022
bparrishMines pushed a commit to flutter/packages that referenced this pull request Oct 27, 2022
* e4b9796 [flutter_tools] Implement NotifyingLogger.supportsColor (flutter/flutter#113635)

* 5a42f33 Roll Flutter Engine from d62aa9526a56 to 490b06d13390 (20 revisions) (flutter/flutter#113761)

* 30161d4 Enable cache cleanup. (flutter/flutter#113729)

* 780ceb5 Roll Flutter Engine from 490b06d13390 to bcd83df4ecbd (4 revisions) (flutter/flutter#113766)

* 2668f90 Composing text shouldn't be part of undo/redo (flutter/flutter#108765)

* 4f373e1 Roll Plugins from e6184f9 to a577c00 (4 revisions) (flutter/flutter#113769)

* 482466e Roll Flutter Engine from bcd83df4ecbd to 3a7acb3dbe9b (6 revisions) (flutter/flutter#113771)

* 483e1d9 Validate bins on path in doctor (flutter/flutter#113106)

* 103a5c9 Overlay always applies clip (flutter/flutter#113770)

* c0f8229 Roll Flutter Engine from 3a7acb3dbe9b to 69f2bc881f46 (3 revisions) (flutter/flutter#113780)

* 7caaac2 link "iOS PlatformView BackdropFilter design doc" in the BackdropFilter widget's documentation (flutter/flutter#113779)

* 46d2908 Roll Flutter Engine from 69f2bc881f46 to 3b6ecf9f1a66 (1 revision) (flutter/flutter#113789)

* 37af038 Roll pub packages (flutter/flutter#113574)

* 2340188 Roll Flutter Engine from 3b6ecf9f1a66 to 2b21a3125ca2 (6 revisions) (flutter/flutter#113798)

* 3665dd8 Start generating coverage. (flutter/flutter#113587)

* 25b10ef Roll Flutter Engine from 2b21a3125ca2 to 85e4fa84d660 (3 revisions) (flutter/flutter#113803)

* 59d26c4 Roll Flutter Engine from 85e4fa84d660 to f24ea1a04d93 (3 revisions) (flutter/flutter#113806)

* 07319a9 revert last 2 engine rolls (flutter/flutter#113835)

* 782baec Resolve 113705: Separated longer running tests from `runMisc` to prevent flakiness from timeouts (flutter/flutter#113784)

* 8834692 [web] Use TrustedTypes in flutter.js and other tools (flutter/flutter#112969)

* 1f95a7d Roll Plugins from a577c00 to 7a7480a (4 revisions) (flutter/flutter#113834)

* 1ebe53c Roll pub packages (flutter/flutter#113799)

* 70c1f26 Avoid creating map literal in `flutter.gradle` multidex check (flutter/flutter#113845)

* 8d13c89 Followup 113705: Allow the `slow` tests to break the tree as all tests in that shard previously could (flutter/flutter#113846)

* 4323397 Roll Flutter Engine from 2b21a3125ca2 to 83092c04c105 (20 revisions) (flutter/flutter#113847)

* f4804ad Roll Flutter Engine from 2b21a3125ca2 to de83ef6d2c26 (21 revisions) (flutter/flutter#113849)

* 44c146a Bump actions/upload-artifact from 3.1.0 to 3.1.1 (flutter/flutter#113859)

* 025a3ab Roll Flutter Engine from de83ef6d2c26 to 6aa683e365d5 (3 revisions) (flutter/flutter#113863)

* 4c6251a Add fontFamilyFallback to ThemeData (flutter/flutter#112976)

* a0731af Roll Flutter Engine from 6aa683e365d5 to c03114f1575d (2 revisions) (flutter/flutter#113864)

* b5ac8c5 Roll Flutter Engine from c03114f1575d to 30cec21e4b3c (1 revision) (flutter/flutter#113871)

* 92c3e29 Roll Flutter Engine from 30cec21e4b3c to e35f850102e6 (1 revision) (flutter/flutter#113872)

* 1b5b469 Roll Flutter Engine from e35f850102e6 to 30bb44616bac (3 revisions) (flutter/flutter#113875)

* 35daf37 Roll Flutter Engine from 30bb44616bac to 9a671daf1c92 (2 revisions) (flutter/flutter#113877)

* 2714226 Roll Flutter Engine from 9a671daf1c92 to 07bdae45e7f9 (1 revision) (flutter/flutter#113888)

* 777040d Roll Flutter Engine from 07bdae45e7f9 to 5abc1b8713be (1 revision) (flutter/flutter#113892)

* fd813de Roll Flutter Engine from 5abc1b8713be to 51f8ac74b558 (1 revision) (flutter/flutter#113901)

* 6ac2cc5 Roll Flutter Engine from 51f8ac74b558 to 360dcd1cf31a (1 revision) (flutter/flutter#113902)

* e4cc916 Roll Flutter Engine from 360dcd1cf31a to fb9df8d65dc8 (1 revision) (flutter/flutter#113918)

* 20c4b6c Roll Flutter Engine from fb9df8d65dc8 to f62df692058c (1 revision) (flutter/flutter#113919)

* 4a62876 Roll Flutter Engine from f62df692058c to 7fc208c07693 (1 revision) (flutter/flutter#113926)

* 12b05ca Roll Flutter Engine from 7fc208c07693 to 6bb2f03e6fd0 (1 revision) (flutter/flutter#113929)

* a25c86c Roll Flutter Engine from 6bb2f03e6fd0 to 2b5d630e4831 (1 revision) (flutter/flutter#113938)

* 28e0f08 Reland "[text_input] introduce TextInputControl" (flutter/flutter#113758)

* 0b1fbd2 Roll Plugins from 7a7480a to 84f5ec6 (2 revisions) (flutter/flutter#113942)

* 15a4b00 Use correct semantics for toggle buttons (flutter/flutter#113851)

* a7fe536 [framework] re-rasterize when window size or insets changes (flutter/flutter#113647)

* bd9021a Roll Flutter Engine from 2b5d630e4831 to 168c711a330e (1 revision) (flutter/flutter#113947)

* 29397c2 Fix selectWordsInRange when last word is located before the first word (flutter/flutter#113224)

* 6415de4 Roll Flutter Engine from 168c711a330e to 7cd07782141c (1 revision) (flutter/flutter#113948)

* 700b449 Roll Flutter Engine from 7cd07782141c to 2f6c6583058b (2 revisions) (flutter/flutter#113951)

* b4058b9 Update Popup Menu to support Material 3 (flutter/flutter#103606)

* b571abf Scribble mixin (flutter/flutter#104128)

* 903e9fb Roll Flutter Engine from 2f6c6583058b to f445898c1a28 (1 revision) (flutter/flutter#113959)

* 2dd87fb Fix --local-engine for the new web/wasm mode (flutter/flutter#113759)

* 3c2f500 Fix edge scrolling on platforms that select word by word on long press move (flutter/flutter#113128)

* 5259e1b Add --empty to the flutter create command (flutter/flutter#113873)

* 0c14308 Add branch coverage to flutter test (flutter/flutter#113802)

* 7571f30 Roll Flutter Engine from f445898c1a28 to ecf2f85cab61 (5 revisions) (flutter/flutter#113968)

* 391330f Roll Flutter Engine from ecf2f85cab61 to 926bb80f49a2 (2 revisions) (flutter/flutter#113971)

* 884f4d0 Updated the Material Design tokens used to generate component defaults to v0.137. (flutter/flutter#113970)

* 694b253 [Android] Fix spell check integration test guarded function conflict (flutter/flutter#113541)

* 806fb93 Fix ScrollPosition.isScrollingNotifier.value for pointer scrolling (flutter/flutter#113972)

* 14a7360 Roll Flutter Engine from 926bb80f49a2 to 7577fd46d50f (1 revision) (flutter/flutter#113974)

* 6154b3b Improve Scrollbar drag behavior (flutter/flutter#112434)

* 1037f99 Roll Flutter Engine from 7577fd46d50f to 24d7b5f255c0 (1 revision) (flutter/flutter#113976)

* e62d519 Roll Flutter Engine from 24d7b5f255c0 to 75bfcd73ca8a (1 revision) (flutter/flutter#113981)

* 49f0061 Roll Flutter Engine from 75bfcd73ca8a to b93c654bd158 (1 revision) (flutter/flutter#113984)

* 2a59bd5 Roll Flutter Engine from b93c654bd158 to 9abb459368d5 (2 revisions) (flutter/flutter#113992)

* 400136b Fix `Slider` overlay and value indicator interactive behavior on desktop. (flutter/flutter#113543)

* b0e7c9c Move `AnimatedIcons` example and fix typo in `cupertino/text_selection_toolbar.dart` (flutter/flutter#113937)

* 7f75d24 Add Material 3 `ProgressIndicator` examples (flutter/flutter#113950)

* 593315e Roll Flutter Engine from 9abb459368d5 to 2b70cba93123 (1 revision) (flutter/flutter#113997)

* 5304a24 Roll Flutter Engine from 2b70cba93123 to c414b1d57b2b (1 revision) (flutter/flutter#114000)

* 3599b3a Add support for expression compilation when debugging integration tests (flutter/flutter#113481)

* 13cb46d Roll Plugins from 84f5ec6 to fed9104 (2 revisions) (flutter/flutter#114019)

* b375b4a Fix an issue that Dragging the iOS text selection handles is jumpy and iOS text selection update incorrectly. (flutter/flutter#109136)

* 563e0a4 Page Up / Page Down in text fields (flutter/flutter#107602)

* 0fe29f5 Raise an exception when invalid subshard name (flutter/flutter#113222)

* dbbef15 Add Focus.parentNode to allow controlling the shape of the Focus tree. (flutter/flutter#113655)

* b373be8 Upgrade gradle for flutter tool to 7.3.0 (flutter/flutter#114023)

* 92d8b04 [macOS] Flavors project throws `no flavor specified` for creating a project. (flutter/flutter#113979)

* ae143ad Hide debug logs from a MemoryAllocations test that intentionally throws an exception (flutter/flutter#113786)

* e133721 Check for watch companion in build settings (flutter/flutter#113956)

* 9f5c655 Revert "Check for watch companion in build settings (#113956)" (flutter/flutter#114035)

* df259c5 Add `clipBehavior`  and apply `borderRadius` to DataTable's Material (flutter/flutter#113205)

* e76f883 Cache TextPainter plain text value to improve performance (flutter/flutter#109841)

* a30d816 fix stretch effect with rtl support (flutter/flutter#113214)

* af34b10 Roll Flutter Engine from c414b1d57b2b to 92500cfe7a65 (1 revision) (flutter/flutter#114001)

* 3ce88d3 Replace menu defaults with tokens (flutter/flutter#113963)

* 8c3806f Add parentNode to FocusScope widget (flutter/flutter#114034)

* a30c63a Roll Flutter Engine from 92500cfe7a65 to e9aba46a7bcb (13 revisions) (flutter/flutter#114038)

* 3ed14a0 Roll Flutter Engine from e9aba46a7bcb to b1f1ec2bae46 (4 revisions) (flutter/flutter#114043)

* b816801 fix to add both flutter_test and integration_test (flutter/flutter#109650)

* e39fa7a Fix wasted memory caused by debug fields - 16 bytes per object (when adding that should-be-removed field crosses double-word alignment) (flutter/flutter#113927)

* d5c53b8 Fix text field label animation duration and curve (flutter/flutter#105966)

* dcf219e Roll Flutter Engine from b1f1ec2bae46 to ce6649aeea6d (1 revision) (flutter/flutter#114044)

* afa9a70 Roll Flutter Engine from ce6649aeea6d to a34d38ccb726 (1 revision) (flutter/flutter#114046)

* 8b28104 Roll Flutter Engine from a34d38ccb726 to 71675e2de9f2 (2 revisions) (flutter/flutter#114049)

* dd9b7ac Roll Flutter Engine from 71675e2de9f2 to c814452fcb26 (1 revision) (flutter/flutter#114052)

* b00b2f1 Roll Flutter Engine from c814452fcb26 to ac95a3a4cc92 (1 revision) (flutter/flutter#114053)

* dcc6a4c Roll Flutter Engine from ac95a3a4cc92 to 199166f7c642 (1 revision) (flutter/flutter#114056)

* e739ad0 M3 Text field UI update (flutter/flutter#113776)

* 89e1fbd Roll Flutter Engine from 199166f7c642 to c00953e610fa (1 revision) (flutter/flutter#114059)

* 391f356 Roll Flutter Engine from c00953e610fa to 3b086a0e98e3 (1 revision) (flutter/flutter#114062)

* 97970ac Roll Flutter Engine from 3b086a0e98e3 to 56841d491f80 (1 revision) (flutter/flutter#114065)

* 8b36497 Roll Flutter Engine from 56841d491f80 to 27269992caec (1 revision) (flutter/flutter#114068)

* 7d037f2 Roll Flutter Engine from 27269992caec to 25133f15440d (1 revision) (flutter/flutter#114075)

* cb53405 Don't specify libraries-spec argument if we are passing a platform dill. (flutter/flutter#114045)

* e6be983 Roll Plugins from fed9104 to cd8bb0a (9 revisions) (flutter/flutter#114077)

* d988c11 Expose `alwaysShowMiddle` in `CupertinoSliverNavigationBar` (flutter/flutter#113544)

* 5d93894 [flutter_tools] Decouple fatal-warnings check from fatal-infos (flutter/flutter#113748)

* 609b8f3 Revert part of "Terminate simulator app on "q" (#113581)" (flutter/flutter#114083)

* 235a325 Provide test API for accessibility announcements (flutter/flutter#109661)

* e4a80b4 Roll Flutter Engine from 25133f15440d to 2705bcb4e7d6 (1 revision) (flutter/flutter#114084)

* 51acda8 Update Cupertino text input padding (flutter/flutter#113958)

* 7bca82c Roll Flutter Engine from 2705bcb4e7d6 to 31d21cbed7b2 (1 revision) (flutter/flutter#114086)

* e334ac1 Revert "Update Cupertino text input padding (#113958)" (flutter/flutter#114102)

* 671c532 107866: Add support for verifying SemanticsNode ordering in widget tests (flutter/flutter#113133)

* 23d258d Remove deprecated `updateSemantics` API usage. (flutter/flutter#113382)

* 156c313 Dispose animation controller in platform view benchmarks (flutter/flutter#110413)

* 8cd7953 Roll Flutter Engine from 31d21cbed7b2 to a772d20c7550 (12 revisions) (flutter/flutter#114113)

* eaecf46 Roll Flutter Engine from a772d20c7550 to 871de2f904a4 (6 revisions) (flutter/flutter#114119)

* 732d117 Roll Flutter Engine from 871de2f904a4 to f0eb4f0bae67 (1 revision) (flutter/flutter#114122)

* d9a2229 Roll Flutter Engine from f0eb4f0bae67 to 1ea6e5e2de95 (1 revision) (flutter/flutter#114125)
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Oct 27, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Oct 27, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Oct 27, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Oct 27, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Oct 28, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Oct 28, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Oct 28, 2022
CaseyHillers added a commit that referenced this pull request Nov 3, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
a: tests "flutter test", flutter_test, or one of our tests autosubmit Merge PR when tree becomes green via auto submit App framework flutter/packages/flutter repository. See also f: labels.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Provide a testing API for the announce functionality
5 participants