diff --git a/lib/web_ui/lib/src/engine/pointer_binding.dart b/lib/web_ui/lib/src/engine/pointer_binding.dart index c4ed88afe2793..48e43dc72db45 100644 --- a/lib/web_ui/lib/src/engine/pointer_binding.dart +++ b/lib/web_ui/lib/src/engine/pointer_binding.dart @@ -196,7 +196,7 @@ abstract class _BaseAdapter { bool acceptOutsideGlasspane = false, }) { final html.EventListener loggedHandler = (html.Event event) { - if (!acceptOutsideGlasspane && event.target != glassPaneElement) { + if (!acceptOutsideGlasspane && !glassPaneElement.contains(event.target)) { return; } diff --git a/lib/web_ui/test/engine/pointer_binding_test.dart b/lib/web_ui/test/engine/pointer_binding_test.dart index dbe030d4910bf..3f8ed22b0968c 100644 --- a/lib/web_ui/test/engine/pointer_binding_test.dart +++ b/lib/web_ui/test/engine/pointer_binding_test.dart @@ -414,6 +414,75 @@ void main() { }, ); + _testEach<_ButtonedEventMixin>( + [_PointerEventContext(), _MouseEventContext()], + 'correctly detects events on the semantics placeholder', + (_ButtonedEventMixin context) { + PointerBinding.instance.debugOverrideDetector(context); + List packets = []; + ui.window.onPointerDataPacket = (ui.PointerDataPacket packet) { + packets.add(packet); + }; + + final html.Element semanticsPlaceholder = + html.Element.tag('flt-semantics-placeholder'); + glassPane.append(semanticsPlaceholder); + + // Press on the semantics placeholder. + semanticsPlaceholder.dispatchEvent(context.primaryDown( + clientX: 10.0, + clientY: 10.0, + )); + expect(packets, hasLength(1)); + expect(packets[0].data, hasLength(2)); + expect(packets[0].data[0].change, equals(ui.PointerChange.add)); + expect(packets[0].data[1].change, equals(ui.PointerChange.down)); + expect(packets[0].data[1].physicalX, equals(10.0)); + expect(packets[0].data[1].physicalY, equals(10.0)); + packets.clear(); + + // Drag on the semantics placeholder. + semanticsPlaceholder.dispatchEvent(context.primaryMove( + clientX: 12.0, + clientY: 10.0, + )); + expect(packets, hasLength(1)); + expect(packets[0].data, hasLength(1)); + expect(packets[0].data[0].change, equals(ui.PointerChange.move)); + expect(packets[0].data[0].physicalX, equals(12.0)); + expect(packets[0].data[0].physicalY, equals(10.0)); + packets.clear(); + + // Keep dragging. + semanticsPlaceholder.dispatchEvent(context.primaryMove( + clientX: 15.0, + clientY: 10.0, + )); + expect(packets[0].data, hasLength(1)); + expect(packets[0].data[0].change, equals(ui.PointerChange.move)); + expect(packets[0].data[0].physicalX, equals(15.0)); + expect(packets[0].data[0].physicalY, equals(10.0)); + packets.clear(); + + // Release the pointer on the semantics placeholder. + html.window.dispatchEvent(context.primaryUp( + clientX: 100.0, + clientY: 200.0, + )); + expect(packets, hasLength(1)); + expect(packets[0].data, hasLength(2)); + expect(packets[0].data[0].change, equals(ui.PointerChange.move)); + expect(packets[0].data[0].physicalX, equals(100.0)); + expect(packets[0].data[0].physicalY, equals(200.0)); + expect(packets[0].data[1].change, equals(ui.PointerChange.up)); + expect(packets[0].data[1].physicalX, equals(100.0)); + expect(packets[0].data[1].physicalY, equals(200.0)); + packets.clear(); + + semanticsPlaceholder.remove(); + }, + ); + // BUTTONED ADAPTERS _testEach<_ButtonedEventMixin>(