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

[web] Set touch-action:none in embedded views. (#53945) #54007

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 0 additions & 14 deletions lib/web_ui/lib/src/engine/pointer_binding.dart
Original file line number Diff line number Diff line change
Expand Up @@ -968,20 +968,6 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin {

@override
void setup() {
// Prevents the browser auto-canceling pointer events.
// Register into `_listener` directly so the event isn't forwarded to semantics.
_listeners.add(Listener.register(
event: 'touchstart',
target: _viewTarget,
handler: (DomEvent event) {
// This is one of the ways I've seen this done. PixiJS does a similar thing.
// ThreeJS seems to subscribe move/leave in the pointerdown handler instead?
if (event.cancelable) {
event.preventDefault();
}
},
));

_addPointerEventListener(_viewTarget, 'pointerdown', (DomPointerEvent event) {
final int device = _getPointerId(event);
final List<ui.PointerData> pointerData = <ui.PointerData>[];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@ class CustomElementEmbeddingStrategy implements EmbeddingStrategy {
..style.height = '100%'
..style.display = 'block'
..style.overflow = 'hidden'
..style.position = 'relative';
..style.position = 'relative'
// This is needed so the browser lets flutter handle all pointer events
// it receives, without canceling them.
..style.touchAction = 'none';

hostElement.appendChild(rootElement);

Expand Down
6 changes: 3 additions & 3 deletions lib/web_ui/test/engine/pointer_binding_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -305,15 +305,15 @@ void testMain() {
},
);

test('prevents default on touchstart events', () async {
test('allows default on touchstart events', () async {
final event = createDomEvent('Event', 'touchstart');

rootElement.dispatchEvent(event);

expect(
event.defaultPrevented,
isTrue,
reason: 'touchstart events should be prevented so pointer events are not cancelled later.',
isFalse,
reason: 'touchstart events should NOT be prevented. That breaks semantic taps!',
);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ void doTests() {
reason: 'Should take 100% of the available height');
expect(styleAfter.overflow, 'hidden',
reason: 'Should hide the occasional oversized canvas elements.');
expect(styleAfter.touchAction, 'none',
reason: 'Should disable browser handling of touch events.');
});
});
}