@@ -1743,12 +1743,43 @@ void _testImage() {
1743
1743
});
1744
1744
}
1745
1745
1746
+ class MockAccessibilityAnnouncements implements AccessibilityAnnouncements {
1747
+ int announceInvoked = 0 ;
1748
+
1749
+ @override
1750
+ void announce (String message, Assertiveness assertiveness) {
1751
+ announceInvoked += 1 ;
1752
+ }
1753
+
1754
+ @override
1755
+ DomHTMLElement ariaLiveElementFor (Assertiveness assertiveness) {
1756
+ throw UnsupportedError (
1757
+ 'ariaLiveElementFor is not supported in MockAccessibilityAnnouncements' );
1758
+ }
1759
+
1760
+ @override
1761
+ void dispose () {
1762
+ throw UnsupportedError (
1763
+ 'dispose is not supported in MockAccessibilityAnnouncements!' );
1764
+ }
1765
+
1766
+ @override
1767
+ void handleMessage (StandardMessageCodec codec, ByteData ? data) {
1768
+ throw UnsupportedError (
1769
+ 'handleMessage is not supported in MockAccessibilityAnnouncements!' );
1770
+ }
1771
+ }
1772
+
1746
1773
void _testLiveRegion () {
1747
- test ('renders a live region if there is a label ' , () async {
1774
+ test ('announces the label after an update ' , () async {
1748
1775
semantics ()
1749
1776
..debugOverrideTimestampFunction (() => _testTime)
1750
1777
..semanticsEnabled = true ;
1751
1778
1779
+ final MockAccessibilityAnnouncements mockAccessibilityAnnouncements =
1780
+ MockAccessibilityAnnouncements ();
1781
+ debugOverrideAccessibilityAnnouncements (mockAccessibilityAnnouncements);
1782
+
1752
1783
final ui.SemanticsUpdateBuilder builder = ui.SemanticsUpdateBuilder ();
1753
1784
updateNode (
1754
1785
builder,
@@ -1758,19 +1789,20 @@ void _testLiveRegion() {
1758
1789
rect: const ui.Rect .fromLTRB (0 , 0 , 100 , 50 ),
1759
1790
);
1760
1791
semantics ().updateSemantics (builder.build ());
1761
-
1762
- expectSemanticsTree ('''
1763
- <sem aria-label="This is a snackbar" aria-live="polite" style="$rootSemanticStyle "></sem>
1764
- ''' );
1792
+ expect (mockAccessibilityAnnouncements.announceInvoked, 1 );
1765
1793
1766
1794
semantics ().semanticsEnabled = false ;
1767
1795
});
1768
1796
1769
- test ('does not render a live region if there is no label' , () async {
1797
+ test ('does not announce anything if there is no label' , () async {
1770
1798
semantics ()
1771
1799
..debugOverrideTimestampFunction (() => _testTime)
1772
1800
..semanticsEnabled = true ;
1773
1801
1802
+ final MockAccessibilityAnnouncements mockAccessibilityAnnouncements =
1803
+ MockAccessibilityAnnouncements ();
1804
+ debugOverrideAccessibilityAnnouncements (mockAccessibilityAnnouncements);
1805
+
1774
1806
final ui.SemanticsUpdateBuilder builder = ui.SemanticsUpdateBuilder ();
1775
1807
updateNode (
1776
1808
builder,
@@ -1779,10 +1811,41 @@ void _testLiveRegion() {
1779
1811
rect: const ui.Rect .fromLTRB (0 , 0 , 100 , 50 ),
1780
1812
);
1781
1813
semantics ().updateSemantics (builder.build ());
1814
+ expect (mockAccessibilityAnnouncements.announceInvoked, 0 );
1782
1815
1783
- expectSemanticsTree ('''
1784
- <sem style="$rootSemanticStyle "></sem>
1785
- ''' );
1816
+ semantics ().semanticsEnabled = false ;
1817
+ });
1818
+
1819
+ test ('does not announce the same label over and over' , () async {
1820
+ semantics ()
1821
+ ..debugOverrideTimestampFunction (() => _testTime)
1822
+ ..semanticsEnabled = true ;
1823
+
1824
+ final MockAccessibilityAnnouncements mockAccessibilityAnnouncements =
1825
+ MockAccessibilityAnnouncements ();
1826
+ debugOverrideAccessibilityAnnouncements (mockAccessibilityAnnouncements);
1827
+
1828
+ ui.SemanticsUpdateBuilder builder = ui.SemanticsUpdateBuilder ();
1829
+ updateNode (
1830
+ builder,
1831
+ label: 'This is a snackbar' ,
1832
+ flags: 0 | ui.SemanticsFlag .isLiveRegion.index,
1833
+ transform: Matrix4 .identity ().toFloat64 (),
1834
+ rect: const ui.Rect .fromLTRB (0 , 0 , 100 , 50 ),
1835
+ );
1836
+ semantics ().updateSemantics (builder.build ());
1837
+ expect (mockAccessibilityAnnouncements.announceInvoked, 1 );
1838
+
1839
+ builder = ui.SemanticsUpdateBuilder ();
1840
+ updateNode (
1841
+ builder,
1842
+ label: 'This is a snackbar' ,
1843
+ flags: 0 | ui.SemanticsFlag .isLiveRegion.index,
1844
+ transform: Matrix4 .identity ().toFloat64 (),
1845
+ rect: const ui.Rect .fromLTRB (0 , 0 , 100 , 50 ),
1846
+ );
1847
+ semantics ().updateSemantics (builder.build ());
1848
+ expect (mockAccessibilityAnnouncements.announceInvoked, 1 );
1786
1849
1787
1850
semantics ().semanticsEnabled = false ;
1788
1851
});
0 commit comments