Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 07cfaf1

Browse files
committed
address comments; improve semantic tests
1 parent e834fe6 commit 07cfaf1

File tree

6 files changed

+65
-40
lines changed

6 files changed

+65
-40
lines changed

lib/web_ui/lib/src/engine/pointer_binding.dart

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ class ClickDebouncer {
279279
}
280280

281281
if (isListening) {
282-
// There's a pending queue of pointer events. Prefer sendind the tap action
282+
// There's a pending queue of pointer events. Prefer sending the tap action
283283
// instead of pointer events, because the pointer events may not land on the
284284
// combined semantic node and miss the click/tap.
285285
final DebounceState state = _state!;
@@ -415,15 +415,9 @@ class ClickDebouncer {
415415
///
416416
/// This object can be used as if it was just initialized.
417417
void reset() {
418-
final DebounceState? state = _state;
418+
_state?.timer.cancel();
419419
_state = null;
420420
_lastFlushedPointerUpTimeStamp = null;
421-
422-
if (state == null) {
423-
return;
424-
}
425-
426-
state.timer.cancel();
427421
}
428422
}
429423

lib/web_ui/lib/src/engine/semantics/tappable.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ class Tappable extends RoleManager {
5454
}
5555

5656
void _updateAttribute() {
57+
// The `flt-tappable` attribute marks the element for the ClickDebouncer to
58+
// to know that it should debounce click events on this element. The
59+
// contract is that the element that has this attribute is also the element
60+
// that receives pointer and "click" events.
5761
if (_isListening) {
5862
semanticsObject.element.setAttribute('flt-tappable', '');
5963
} else {

lib/web_ui/test/common/matchers.dart

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -293,17 +293,23 @@ String canonicalizeHtml(
293293
html_package.Element.tag(replacementTag);
294294

295295
if (mode != HtmlComparisonMode.noAttributes) {
296-
original.attributes.forEach((dynamic name, String value) {
297-
if (name is! String) {
298-
throw ArgumentError('"$name" should be String but was ${name.runtimeType}.');
299-
}
296+
// Sort the attributes so tests are not sensitive to their order, which
297+
// does not matter in terms of functionality.
298+
final List<String> attributeNames = original.attributes.keys.cast<String>().toList();
299+
attributeNames.sort();
300+
for (final String name in attributeNames) {
301+
final String value = original.attributes[name]!;
300302
if (name == 'style') {
301-
return;
303+
// The style attribute is handled separately because it contains substructure.
304+
continue;
302305
}
303-
if (name.startsWith('aria-')) {
306+
307+
// These are the only attributes we're interested in testing. This list
308+
// can change over time.
309+
if (name.startsWith('aria-') || name.startsWith('flt-') || name == 'role') {
304310
replacement.attributes[name] = value;
305311
}
306-
});
312+
}
307313

308314
if (original.attributes.containsKey('style')) {
309315
final String styleValue = original.attributes['style']!;

lib/web_ui/test/engine/pointer_binding_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3088,7 +3088,7 @@ void testMain() {
30883088
},
30893089
);
30903090

3091-
group('$ClickDebouncer', () {
3091+
group('ClickDebouncer', () {
30923092
_testClickDebouncer();
30933093
});
30943094
}
@@ -3159,7 +3159,7 @@ void _testClickDebouncer() {
31593159
expect(binding.clickDebouncer.isDebouncing, false);
31603160

31613161
// This test DOM element is missing the `flt-tappable` attribute on purpose
3162-
// so that the debouncer does not debounce events and simply let's
3162+
// so that the debouncer does not debounce events and simply lets
31633163
// everything through.
31643164
final DomElement testElement = createDomElement('flt-semantics');
31653165
flutterViewEmbedder.semanticsHostElement!.appendChild(testElement);

lib/web_ui/test/engine/semantics/semantics_test.dart

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ void _testEngineSemanticsOwner() {
377377
expectSemanticsTree('''
378378
<sem style="$rootSemanticStyle">
379379
<sem-c>
380-
<sem aria-label="Hello"></sem>
380+
<sem role="text" aria-label="Hello"></sem>
381381
</sem-c>
382382
</sem>''');
383383

@@ -387,7 +387,7 @@ void _testEngineSemanticsOwner() {
387387
expectSemanticsTree('''
388388
<sem style="$rootSemanticStyle">
389389
<sem-c>
390-
<sem aria-label="World"></sem>
390+
<sem role="text" aria-label="World"></sem>
391391
</sem-c>
392392
</sem>''');
393393

@@ -397,7 +397,7 @@ void _testEngineSemanticsOwner() {
397397
expectSemanticsTree('''
398398
<sem style="$rootSemanticStyle">
399399
<sem-c>
400-
<sem></sem>
400+
<sem role="text"></sem>
401401
</sem-c>
402402
</sem>''');
403403

@@ -430,7 +430,7 @@ void _testEngineSemanticsOwner() {
430430
expectSemanticsTree('''
431431
<sem style="$rootSemanticStyle">
432432
<sem-c>
433-
<sem aria-label="tooltip\nHello"></sem>
433+
<sem role="text" aria-label="tooltip\nHello"></sem>
434434
</sem-c>
435435
</sem>''');
436436

@@ -440,7 +440,7 @@ void _testEngineSemanticsOwner() {
440440
expectSemanticsTree('''
441441
<sem style="$rootSemanticStyle">
442442
<sem-c>
443-
<sem></sem>
443+
<sem role="text"></sem>
444444
</sem-c>
445445
</sem>''');
446446

@@ -1388,7 +1388,7 @@ void _testIncrementables() {
13881388
semantics().updateSemantics(builder.build());
13891389
expectSemanticsTree('''
13901390
<sem style="$rootSemanticStyle">
1391-
<input aria-valuenow="1" aria-valuetext="d" aria-valuemax="1" aria-valuemin="1">
1391+
<input role="slider" aria-valuenow="1" aria-valuetext="d" aria-valuemax="1" aria-valuemin="1">
13921392
</sem>''');
13931393

13941394
final SemanticsObject node = semantics().debugSemanticsTree![0]!;
@@ -1421,7 +1421,7 @@ void _testIncrementables() {
14211421
semantics().updateSemantics(builder.build());
14221422
expectSemanticsTree('''
14231423
<sem style="$rootSemanticStyle">
1424-
<input aria-valuenow="1" aria-valuetext="d" aria-valuemax="2" aria-valuemin="1">
1424+
<input role="slider" aria-valuenow="1" aria-valuetext="d" aria-valuemax="2" aria-valuemin="1">
14251425
</sem>''');
14261426

14271427
final DomHTMLInputElement input =
@@ -1454,7 +1454,7 @@ void _testIncrementables() {
14541454
semantics().updateSemantics(builder.build());
14551455
expectSemanticsTree('''
14561456
<sem style="$rootSemanticStyle">
1457-
<input aria-valuenow="1" aria-valuetext="d" aria-valuemax="1" aria-valuemin="0">
1457+
<input role="slider" aria-valuenow="1" aria-valuetext="d" aria-valuemax="1" aria-valuemin="0">
14581458
</sem>''');
14591459

14601460
final DomHTMLInputElement input =
@@ -1489,7 +1489,7 @@ void _testIncrementables() {
14891489
semantics().updateSemantics(builder.build());
14901490
expectSemanticsTree('''
14911491
<sem style="$rootSemanticStyle">
1492-
<input aria-valuenow="1" aria-valuetext="d" aria-valuemax="2" aria-valuemin="0">
1492+
<input role="slider" aria-valuenow="1" aria-valuetext="d" aria-valuemax="2" aria-valuemin="0">
14931493
</sem>''');
14941494

14951495
semantics().semanticsEnabled = false;
@@ -1632,7 +1632,7 @@ void _testCheckables() {
16321632

16331633
semantics().updateSemantics(builder.build());
16341634
expectSemanticsTree('''
1635-
<sem aria-label="test label" role="switch" aria-checked="true" style="$rootSemanticStyle"></sem>
1635+
<sem aria-label="test label" flt-tappable role="switch" aria-checked="true" style="$rootSemanticStyle"></sem>
16361636
''');
16371637

16381638
final SemanticsObject node = semantics().debugSemanticsTree![0]!;
@@ -1690,7 +1690,7 @@ void _testCheckables() {
16901690

16911691
semantics().updateSemantics(builder.build());
16921692
expectSemanticsTree('''
1693-
<sem role="switch" aria-checked="false" style="$rootSemanticStyle"></sem>
1693+
<sem role="switch" flt-tappable aria-checked="false" style="$rootSemanticStyle"></sem>
16941694
''');
16951695

16961696
semantics().semanticsEnabled = false;
@@ -1716,7 +1716,7 @@ void _testCheckables() {
17161716

17171717
semantics().updateSemantics(builder.build());
17181718
expectSemanticsTree('''
1719-
<sem role="checkbox" aria-checked="true" style="$rootSemanticStyle"></sem>
1719+
<sem role="checkbox" flt-tappable aria-checked="true" style="$rootSemanticStyle"></sem>
17201720
''');
17211721

17221722
semantics().semanticsEnabled = false;
@@ -1766,7 +1766,7 @@ void _testCheckables() {
17661766

17671767
semantics().updateSemantics(builder.build());
17681768
expectSemanticsTree('''
1769-
<sem role="checkbox" aria-checked="false" style="$rootSemanticStyle"></sem>
1769+
<sem role="checkbox" flt-tappable aria-checked="false" style="$rootSemanticStyle"></sem>
17701770
''');
17711771

17721772
semantics().semanticsEnabled = false;
@@ -1793,7 +1793,7 @@ void _testCheckables() {
17931793

17941794
semantics().updateSemantics(builder.build());
17951795
expectSemanticsTree('''
1796-
<sem role="radio" aria-checked="true" style="$rootSemanticStyle"></sem>
1796+
<sem role="radio" flt-tappable aria-checked="true" style="$rootSemanticStyle"></sem>
17971797
''');
17981798

17991799
semantics().semanticsEnabled = false;
@@ -1845,7 +1845,7 @@ void _testCheckables() {
18451845

18461846
semantics().updateSemantics(builder.build());
18471847
expectSemanticsTree('''
1848-
<sem role="radio" aria-checked="false" style="$rootSemanticStyle"></sem>
1848+
<sem role="radio" flt-tappable aria-checked="false" style="$rootSemanticStyle"></sem>
18491849
''');
18501850

18511851
semantics().semanticsEnabled = false;
@@ -1918,7 +1918,7 @@ void _testTappable() {
19181918
tester.apply();
19191919

19201920
expectSemanticsTree('''
1921-
<sem role="button" style="$rootSemanticStyle"></sem>
1921+
<sem role="button" flt-tappable style="$rootSemanticStyle"></sem>
19221922
''');
19231923

19241924
final SemanticsObject node = semantics().debugSemanticsTree![0]!;
@@ -1979,14 +1979,14 @@ void _testTappable() {
19791979
'<sem role="button" aria-disabled="true" style="$rootSemanticStyle"></sem>');
19801980

19811981
updateTappable(enabled: true);
1982-
expectSemanticsTree('<sem role="button" style="$rootSemanticStyle"></sem>');
1982+
expectSemanticsTree('<sem role="button" flt-tappable style="$rootSemanticStyle"></sem>');
19831983

19841984
updateTappable(enabled: false);
19851985
expectSemanticsTree(
19861986
'<sem role="button" aria-disabled="true" style="$rootSemanticStyle"></sem>');
19871987

19881988
updateTappable(enabled: true);
1989-
expectSemanticsTree('<sem role="button" style="$rootSemanticStyle"></sem>');
1989+
expectSemanticsTree('<sem role="button" flt-tappable style="$rootSemanticStyle"></sem>');
19901990

19911991
semantics().semanticsEnabled = false;
19921992
});
@@ -2623,11 +2623,11 @@ void _testDialog() {
26232623
tester.apply();
26242624

26252625
expectSemanticsTree('''
2626-
<sem aria-describedby="flt-semantic-node-2" style="$rootSemanticStyle">
2626+
<sem role="dialog" aria-describedby="flt-semantic-node-2" style="$rootSemanticStyle">
26272627
<sem-c>
26282628
<sem>
26292629
<sem-c>
2630-
<sem aria-label="$label"></sem>
2630+
<sem role="text" aria-label="$label"></sem>
26312631
</sem-c>
26322632
</sem>
26332633
</sem-c>
@@ -2716,7 +2716,7 @@ void _testDialog() {
27162716
<sem-c>
27172717
<sem>
27182718
<sem-c>
2719-
<sem aria-label="Hello"></sem>
2719+
<sem role="text" aria-label="Hello"></sem>
27202720
</sem-c>
27212721
</sem>
27222722
</sem-c>
@@ -2853,9 +2853,9 @@ void _testFocusable() {
28532853
}
28542854

28552855
expectSemanticsTree('''
2856-
<sem role="group" style="$rootSemanticStyle">
2856+
<sem style="$rootSemanticStyle">
28572857
<sem-c>
2858-
<sem aria-label="focusable text"></sem>
2858+
<sem role="text" aria-label="focusable text"></sem>
28592859
</sem-c>
28602860
</sem>
28612861
''');

lib/web_ui/test/engine/semantics/semantics_tester.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,27 @@ class SemanticsTester {
353353
/// Verifies the HTML structure of the current semantics tree.
354354
void expectSemanticsTree(String semanticsHtml) {
355355
const List<String> ignoredAttributes = <String>['pointer-events'];
356+
// print('\n============================================================================');
357+
// print('''
358+
// semanticsHtml:
359+
// $semanticsHtml
360+
// '''.trim());
361+
// print('----------------------------------------------------------------------------');
362+
// print('''
363+
// canonicalizeHtml(semanticsHtml):
364+
// ${canonicalizeHtml(semanticsHtml)}
365+
// '''.trim());
366+
// print('----------------------------------------------------------------------------');
367+
// print('''
368+
// canonicalizeHtml(appHostNode.querySelector('flt-semantics')!.outerHTML!, ignoredAttributes: ignoredAttributes):
369+
// ${canonicalizeHtml(appHostNode.querySelector('flt-semantics')!.outerHTML!, ignoredAttributes: ignoredAttributes)}
370+
// '''.trim());
371+
// print('''
372+
// appHostNode.querySelector('flt-semantics')!.outerHTML!:
373+
// ${appHostNode.querySelector('flt-semantics')!.outerHTML!}
374+
// '''.trim());
375+
// print('============================================================================\n');
376+
356377
expect(
357378
canonicalizeHtml(appHostNode.querySelector('flt-semantics')!.outerHTML!, ignoredAttributes: ignoredAttributes),
358379
canonicalizeHtml(semanticsHtml),

0 commit comments

Comments
 (0)